Date de première publication : 2023/10/25
Dans ce TP, il s'agit de tester les "structures particulières" que permet le C.
Enumérations
Définir une énumération semaine
et vérifier que l'on peut faire une petite boucle (mais attention, elle ne marche que parce que les valeurs sont consécutives :-)).
Vous pouvez afficher une valeur d'une énumération mais vous aurez une valeur entière. Pour débogage, il faut utiliser un tableau de chaines de caractères ou une macro de génération.
Définir une deuxième énumération pour les mois de l'année. Vérifier qu'il n'est pas possible de faire :
enum semaine jour = FEVRIER;
Vous pouvez également vérifier que deux énumérations différentes ne peuvent définir la même valeur.
Champs de bits
Cette structure qui s'applique uniquement sur des champs entiers permet de spécifier préciser le nombre de bits nécessaires pour coder une information.
En général, on spécifie la couleur d'un pixel d'un écran en mélangeant trois couleurs : le rouge, le vert et le bleu (auxquelles on peut associer une transparence encore nommée alpha. Ça tombe bien nos yeux auraient au moins trois types de récepteurs : un pour chacune de ces couleurs (les cônes). On discrétise les niveaux de couleurs en 256 niveaux, ce qui fait tout de même plus de 16 millions de couleurs possibles, ce qui est pas mal du tout !
Déclarer une structure de 3 entiers et calculer la taille nécessaire pour stocker une image décompressé affichée sur un écran de dimensions 3024 pixels de large par 1964 pixels de haut ?
struct couleur {
int r:8;
int v:8;
int b:8;
};
Calculer maintenant la taille requise si on utilise un champ de bits avec la même configuration et le gain obtenu
Unions
Vérifications
Définir les variables suivantes :
struct paire_s { int a; double b;} s1;
union paire_u { int a; double b;} u1;
Afficher l'espace mémoire nécessaire pour stocker s1
et u1
et comparer...
Afficher les champs a
et b
après ces affectations :
s1.a = 5;
s1.b = 10.0;
u1.a = 5;
u1.b = 10.0;
Que constatez-vous ?
De la manipulation...
Il s'agit de coder le type de donnée "point"
vue en cours. Un point peut être représenté sous forme cartesienne ou polaire
struct cartesien {
double x;
double y;
};
et
struct polaire {
double r;
double t;
};
la structure point
doit mémoriser le type de coordonnées et les coordonnées..
Vous vérifierez que l'on ne peut pas créer une structure ou une union avec le même "nom" :
struct nom {};
union nom {};
Coder ensuite une fonction qui prend un point en parametre et qui renvoie le point en coordonnées polaires
Coder une fonction qui prend un point en parametre et qui renvoie un point exprimé en coordonnés cartésiennes.
Coder une fonction qui renvoie la distance entre deux points. Essayer par exemple :
- P1(x=1, y=1) et P2(x=5, y=5)
- P3(x=1, y=0) et P4(r=1, t=M_PI)
- P5(r=1, t=M_PI_2) et P6(r=3, t=3*M_PI_2)
Les constantes mentionnées ci-dessus sont définies dans maths.h
, ainsi que les fonctions trigonométriques dont on a besoin pour les conversions.
Il ne faut pas oublier de compiler avec l'option -lm