Isup 1 - Programmation TD no7 Matthieu Journault 1 d´ecembre 2020 Il est assez rare en programmation de ne devoir manipuler que des types atomiques, comme les entiers, les chaˆınes de caract`eres, les flottants, etc... Pour cette raison tous les langages de programmation fournissent `a l’utilisateur un moyen de d´efinir de nouveaux types plus complexes, comprendre : compos´es.
Exercice 1 : Types structur´ es
Q. 1 D´efinir une structure struct complex; permettant de repr´esentant un nombre complexe z au moyen de deux float, x ety tel que z =x+iy.
Solution struct complex {
float x ; float y ; };
Q. 2D´efinir un type C, complexcomme ´etant une structurestruct complex.
Solution typedef struct complex complex;
Q. 3D´efinir une fonctionvoid print_complex(complex c);, affichant un nombre complexe Solution
void print_complex(complex c) { printf("%f + %f i", c.x, c.y);
}
Q. 4D´efinir une fonctioncomplex add(complex a, complex b);, retournant a+b.
Solution complex add(complex a, complex b) {
complex res;
res.x = a.x + b.x;
res.y = a.y + b.y;
return res;
}
Q. 5D´efinir une fonctioncomplex opp(complex a);, retournant −a.
Solution complex opp(complex a) {
}
Q. 6D´efinir une fonctioncomplex sub(complex a, complex b);, retournant a−b.
Solution complex sub(complex a, complex b) {
return add(a, opp(b));
}
Q. 7D´efinir une fonctioncomplex mul(complex a, complex b);, retournant le produit ab.
Solution complex mul(complex a, complex b) {
return (complex) {a.x * b.x - a.y * b.y, a.x * b.y + a.y * b.x};
}
Q. 8 D´efinir une fonction complex scal(float alpha, complex a);, retournant le produit scalaire alpha.a.
Solution complex scal(float alpha, complex a) {
return (complex) {alpha * a.x, alpha * a.y};
}
Q. 9D´efinir une fonctioncomplex sq_norm(complex a);, retournant |a|2. Solution
float sq_norm(complex a) {
return (a.x * a.x + a.y * a.y);
}
Q. 10D´efinir une fonction complex conjugate(complex a);, retournant le conjugu´e de a : a.
Solution complex conjugate(complex a) {
return (complex) {a.x, - a.y};
}
Q. 11D´efinir une fonction complex inv(complex a);, retournant 1a. Solution
complex inv(complex a) {
return scal(1/(sq_norm(a)), conjugate(a));
Q. 12D´efinir un nouveau typecomplex2contenant deux flottantsretthetaet repr´esentant le nombre complexereitheta.
Solution struct complex {
float x ; float y ; };
Q. 13D´efinir une fonction void print_complex2(complex2 c);, affichant un nombre complexe Solution
void print_complex2(complex2 c) { printf("%f e^{i %f}", c.r, c.theta);
}
Q. 14D´efinir deux fonctions de conversions complex to_complex(complex2 c);et
complex2 of_complex(complex c); permettant les traductions d’une repr´esentation en l’autre.
Solution complex to_complex(complex2 c) {
complex res;
res.x = c.r * cos(c.theta);
res.y = c.r * sin(c.theta);
return res;
}
complex2 of_complex(complex c) { complex2 res;
res.r = sqrt(sq_norm(c));
res.theta = atan2(c.y, c.x);
return res;
}
Exercice 2 : Types ´ enum´ er´ es
Dans cet exercice nous voulons repr´esenter un jeu de carte par un tableau contenant toutes les cartes. Les cartes ´etant d´efinies par un type structur´e (carte, couleur), chacune de ces deux entit´es ´etant elle-mˆeme un type ´enum´er´e.
Q. 15D´efinir un enum color pouvant ˆetre Pique, Coeur, Carreau, ou Trefle Solution
enum color {Pique, Coeur, Carreau, Trefle};
Q. 16D´efinir un enum value pouvant ˆetre Roi,Dame, Valet.
Solution enum value {Roi, Dame, Valet};
Q. 17D´efinir un type structur´e card´etant compos´e d’une couleur et d’une valeur.
Solution typedef struct card {
enum color c;
enum value v;
} card;
Q. 18D´efinir des fonctions d’affichage pour les couleurs, valeurs et finalement cartes.
Solution void print_card(card c) {
print_value(c.v); printf(" de "); print_color(c.c);
}
Q. 19D´efinir une fonctionvoid fill_all_card(card carr[12]) prenant en argument un tableau de carte et le remplissant avec chacune des 12 cartes de notre jeu de carte.
Solution void fill_all_card(card carr[12]) {
for (int i = 0 ; i < 4; i++) { for (int j = 0 ; j < 3 ; j++) {
carr[i*3+j].c = i;
carr[i*3+j].v = j;
} } }
Q. 20 D´efinir une fonction void print_deck(card carr[12]); permettant l’affichage d’un jeu de carte.
Solution void print_deck(card carr[12]) {
for (int i = 0 ; i < 12 ; i ++) { print_card(carr[i]);
printf("\n");
} }
Q. 21 D´efinir une fonction void shuffle(card carr[12]) impl´ementant l’algorithme de Fisher et Yates pour m´elanger un tableau :
— Pour i allant de n `a 1 ;
— Choisir j uniform´ement dans 0, . . . , i
— Inverser le contenu du tableau des cases i etj Solution void shuffle(card carr[12]) {
int n = 12;
int i, j;
card tmp;
for (i = n - 1; i > 0; i--) { j = rand() % (i + 1);
tmp = carr[j];
carr[j] = carr[i];
carr[i] = tmp;
} }
Q. 22Afficher un jeu de carte m´elang´e.
Solution int main() {
card carr[12];
fill_all_card(carr);
shuffle(carr);
print_deck(carr);
}