CINI – Li115 1 Semaine 4 Révisions ● Questions de cours ● Types des expressions ● Déclaration de variables ● Instruction conditionnelle et boucles ● Structure d'un programme ● Bibliothèque graphique ● Tirage pseudo-aléatoire
CINI – Li Questions de cours (1/2) ● Le langage C est un langage : ● Fonctionnel ? ● Interprété ? ● Impératif ? ● Compilé ? ● Typé ? ● Incontournable ? ● Combien de types de boucles existe-t-il en C ? ● Deux, trois, quatre ? ● Le langage C permet-il de représenter la valeur π ? ● Oui – Non
CINI – Li Questions de cours (1/2) ● Le langage C est un langage : ● Fonctionnel – Non : un programme est avant tout une séquence d'instructions. C'est donc un langage impératif. ● Interprété – Non : un programme C doit être traduit en langage machine pour être exécuté. C'est donc un langage compilé. ● Typé – Oui : le compilateur vérifie les types des variables (et fait certaines conversions automatiquement). ● Combien de types de boucles existe-t-il en C ? ● Trois : for, while, do-while. if n'est pas une boucle. ● Le langage C permet-il de représenter la valeur π ? ● Non, seulement une approximation. Les éléments de type float ne sont pas des nombres réels (seulement des décimaux). Correction
CINI – Li Questions de cours (2/2) ● Dans quel cas doit-on (de préférence) utiliser une boucle for ? ● Dans quel cas doit-on (de préférence) utiliser une boucle do- while ? ● Peut-on remplacer une boucle for par une boucle while ?
CINI – Li Questions de cours (2/2) ● Dans quel cas doit-on (de préférence) utiliser une boucle for ? ● Lorsqu'on connaît à l'avance le nombre d'itérations (par exemple, pour tracer un carré dont on connaît la longueur). ● Dans quel cas doit-on (de pref.) utiliser une boucle do-while ? ● Lorsque le bloc d'instructions à répéter doit absolument être exécuté au moins une fois (par exemple, pour initialiser une variable et contrôler sa valeur). ● Peut-on remplacer une boucle for par une boucle while ? ● Oui : en C et dans les langagés dérivés (C++, Java...), le for n'est qu'une autre écriture d'une boucle while. ● Le for correspond à une structure de boucle très spécifique (répétition sur un ensemble fini de valeurs) et c'est une bonne habitude de programmation de l'utiliser dans ce cas. Cela permet de mettre en évidence les paramètres (le nombre de passages, la valeur de début, le pas d'itération...). Correction
CINI – Li Types des expressions ● Donnez le type et, le cas échéant, la valeur, de chacune des expressions suivantes : ● 'a' ● -7.1 ● "a" ● 3+2 ● ● 3/-2 ● 3.0/2 ● 'A'+3 ● 2/"a" ● "a"+"b"
CINI – Li Types des expressions ● Donnez le type et la valeur des expressions suivantes : – charla lettre a ou la valeur 97 ● floatla valeur -7,1 ● stringla chaîne a ● intla valeur 5 ● floatla valeur 9,1 ● intla valeur -1 ● floatla valeur 1,5 ● charla valeur 'D' ou 68 ● rien du tout – erreur: invalid operands to binary / (have ‘char *’ and ‘int’) ● rien du tout – erreur: invalid operands to binary + (have ‘char *’ and ‘char *’) – → ça n'est pas comme cela qu'on concatène des chaînes ! Correction 'a' -7.1 "a" /-2 3.0/2 'A'+3 2/"a" "a"+"b"
CINI – Li Déclarations de variables ● Quelles sont les déclarations correctes et, le cas échéant, quelles sont les valeurs des variables ? ● int _qsd; int 'toto;int 2befree; int ALKqsdlkazA; ● int a = 3; char i; string 'm'; ● int c,d=3; ● float e = 3; int f = 3.2; float g = 3,2; ● char h = "c"; char j = 'a'; char k = 35; int l = 'a'; ● bool n = no; bool m = false; bool o = 1;
CINI – Li Déclarations de variables Correction ● Quelles sont les déclarations correctes ? ● int _qsd; int ALKqsdlkazA; ● int 'toto; ● int 2befree; ● ● int a = 3; ● char i; ● int c,d=3; ● float e = 3; ● int f = 3.2; OK (non initialisé) → attention : caractère ' de terminaison manquant → erreur: expected identifier or ‘(’ before numeric constant OK (valeur 3) OK mais non initialisé (pas 'i') OK : d vaut 3 mais c non initialisée OK (valeur 3.0) OK ! (valeur 3) arrondi implicite sans aucun message d'erreur ! => C'est MAL ! À éviter à tout prix ! int f = (int)3.2; pour l'opérateur d'arrondi explicite.
CINI – Li Déclarations de variables Correction ● Quelles sont les déclarations correctes ? ● Propositions de correction ● int _qsd = 0; int ALKqsdlkazA = 0; ● int quote_toto; ● int tobefree; ● int a = 3; ● char i = 'w'; ● string m = "toto"; ● int c = 0, d=3; ● float e = 3; ● int f = (int)3.2;
CINI – Li Déclarations de variables ● Quelles sont les déclarations correctes ? ● → error: expected identifier or '(' before numeric constant ● → attention : initialization makes integer from pointer without a cast ● ● Correction float g = 3,2; char h = "c"; char j = 'a'; char k = 35; int l = 'a'; bool n = no; bool m = false; bool o = 1; → erreur 'no' undeclared (first use in this function) OK ! (valeur false) OK ! (valeur true) => à éviter... OK ! (valeur 97) => à éviter ! OK ! (valeur '#')- code ASCII 35 => à éviter ! OK ! (valeur de 'a')
CINI – Li Déclarations de variables ● Quelles sont les déclarations correctes ? ● Propositions de correction ● float g = 3.2; ● char h = 'c'; ● char j = 'a'; ● char k = '#'; ● int l = 97; ● bool n = false; ● bool m = false; ● bool o = true; Correction
CINI – Li Instruction conditionnelle (1/2) ● Quelle est la valeur de la variable a après l'exécution de ce bloc d'instructions ? ● int a = 3, b = 5; ● if ((a+2)<b) { ● a = a+b; ● } else ● b = b*2; ● a = a-b; ● Et si la valeur initiale de a était 1 ? ● int a = 1, b = 5; ●...
CINI – Li Instruction conditionnelle (1/2) ● Quelle est la valeur de la variable a après l'exécution de ce bloc d'instructions ? ● int a = 3, b = 5;a : 3, b : 5 ● if ((a+2)<b) {5 < 5 : faux ● a = a+b; ● } else→ directement ici ● b = b*2;b : 10 ● a = a-b;a : -7 ● → a vaut -7 ● Le programme est: ● 1. MAL INDENTÉ ! ● 2. MAL PARENTHESÉ ! Correction
CINI – Li Instruction conditionnelle (1/2) ● Et si la valeur initiale de a était 1 ? ● int a = 1, b = 5;a : 1, b : 5 ● if ((a+2)<b) {3 < 5 : vrai ● a = a+b;a : 6 ● } elseon passe le else … ● b = b*2;… qui ne contient ● qu'une instruction ! ● a = a-b;a : 1 ● → a vaut 1 ! ● → Attention aux accolades oubliées ! ● (qui se détectent simplement en indentant le programme) Correction
CINI – Li Instruction conditionnelle (2/2) ● À l'aide d'instructions conditionnelles, écrivez un programme qui calcule dans une variable resultat le plus petit entier non négatif entre deux entiers donnés a et b. ● resultat = -1 si les deux valeurs sont négatives : ● #include ● int main() { ● int resultat; ● int a = 7, b = -5; ● … (à vous) … ● return 0; ● }
CINI – Li Instruction conditionnelle (2/2) ● Un programme qui calcule la plus petite valeur non-négative : ● if ((a<0)&&(b<0)) { ● resultat = -1; ● } else { ● if (a>b) { ● if (b<0) { ● resultat = a; ● } else { ● resultat = b; ● } ● } else { ● if (a<0) { ● resultat = b; ● } else { ● resultat = a; ● } Correction Il existe d'autres solutions (plus compactes)
CINI – Li Boucles (1/2) ● Quels morceaux de programmes affichent toutes les lettres minuscules de l'alphabet ? char b; for (b='a';b<'z';b++) { CINI_print_char(b); } char b = 'a'; while (b<='z') { CINI_print_char(b); b++; } char b = 'a'; do { CINI_print_char(b); b++; while (b<='z'); char b = 'a'; while (b<='z') CINI_print_char(b); b++; char b; for(b='a';b<='z';b++) { CINI_print_char(b); b++; } char b; for(b='a';b<='z';b++) CINI_print_char(b);
CINI – Li Boucles (1/2) ● Quels morceaux de programmes affichent toutes les lettres minuscules de l'alphabet ? char b; for (b='a';b<'z';b++) { CINI_print_char(b); } char b = 'a'; while (b<='z') { CINI_print_char(b); b++; } char b = 'a'; do { CINI_print_char(b); b++; while (b<='z'); char b = 'a'; while (b<='z') CINI_print_char(b); b++; char b; for(b='a';b<='z';b++) { CINI_print_char(b); b++; } char b; for(b='a';b<='z';b++) CINI_print_char(b); Correction Erreur de syntaxe : il Manque une accolade Erreur sur la condition de sortie Pas d'accolade → boucle infinie ! On ne modifie JAMAIS la variable de contrôle dans la boucle for !
CINI – Li Structure d'un programme ● Complétez le programme suivant : ● ______________ ● _____ main ________ { ● int a = N; ● CINI_print_int(a+2); /* affiche 5 */ ● CINI_newline(); ● ______________ ● }
CINI – Li Structure d'un programme ● Complétez le programme suivant : ● #include ● #define N 3 ● int main() { ● int a = N; ● CINI_print_int(a+2); /* affiche 5 */ ● CINI_newline(); ● return 0; ● } Correction
CINI – Li Bibliothèque graphique ● Écrivez un programme qui trace une ligne horizontale de L=100 pixels de long à partir du point A=(X0,Y0) X0X0 + L Y0
CINI – Li Bibliothèque graphique ● Écrivez un programme qui trace une ligne horizontale de L pixels de long à partir du point A=(X0,Y0) ● Ici, A=(10,10) et L=100 ● #include ● #define X0 10 ● #define Y0 10 ● #define L 100 ● int main() { ● CINI_open_fullscreen(); /* ou window... */ ● CINI_draw_line(X0,X0,X0+L,Y0,"black"); ● CINI_loop(); /* laisser voir... */ ● return 0; ● } Correction
CINI – Li Bibliothèque graphique ● Écrivez un programme qui dessine un triangle rectangle plein, de sommets A = (10,10), B = (10,200) et C = (100,200) ● Indice: pour « remplir » le triangle, on utilisera des tracés de lignes horizontales, verticales ou obliques (au choix) A B C
CINI – Li Bibliothèque graphique ● Écrivez un programme qui dessine un triangle rectangle plein, de sommets A = (10,10), B = (10,200) et C = (100,200) 1. Partie « primitives de préprogrammation » (début du programme) ● #include ● #define XA 10et on rajoute même: ● #define YA 10 #define MARGE 10 ● #define XB 10 ● #define YB 200 ● #define XC 100 ● #define YC 200 Correction
CINI – Li Bibliothèque graphique ● Écrivez un programme qui dessine un triangle rectangle plein, de sommets A = (10,10), B = (10,200) et C = (100,200) 2. La fonction main ● int main() { ● int i; ● CINI_open_window(XC-XA+MARGE*2,YC-YA+MARGE*2,"fenetre"); ● for(i=YA;i<=YB;i++) { ● CINI_draw_line(XA, i, ● XA+((i-YA)*(XC-XB)/(YB-YA)), i ● "blue"); ● } ● CINI_loop(); ● return 0; ● } Correction Théorème de Thalès : A BC MN AM AB MN BC =
CINI – Li Tirage pseudo-aléatoire ● Complétez le programme suivant qui doit afficher deux nombres entre 1 et 6. ● #include ● int main() { ● ___________________ ● CINI_print_int(___________________); ● CINI_print_string(" et "); ● CINI_print_int(___________________); ● CINI_newline(); ● return 0; ● }
CINI – Li Tirage pseudo-aléatoire ● Complétez le programme suivant qui doit afficher deux nombres entre 1 et 6. ● #include ● int main() { ● CINI_print_int(CINI_random(1,6)); ● CINI_print_string(" et "); ● CINI_print_int(CINI_random(1,6)); ● CINI_newline(); ● return 0; ● } Correction