Énoncés simples. Affectations multiples. n1 = GetInteger(); total = n1 + n2; printf( The total is %d.\n, total); n1 = n2 = n3 = 0; d = i = 1.5; double d; int i; associativité droite (c-à-d de droite à gauche) de l opérateur d affectation expression; n1 + n2; Un énoncé simple est composé d une expression suivie d un point-virgule. Énoncés composés (ang. blocks). énoncé 1 énoncé 2 énoncé 3... énoncé n x = 6; (x = 6) + (y = 7); Chap. 4. Énoncés. 1 Septembre 1997 Chap. 4. Énoncés. 2 Septembre 1997 Énoncés de contrôle. 1. Énoncés conditionnels. 2. Itérations. Composantes d un énoncé de contrôle. - ligne de contrôle - corps Énoncés de contrôle imbriqués. Données booléennes (logiques, ang. Boolean). Type bool, constantes TRUE et FALSE (de la librairie genlib) Opérateurs relationnels. > plus grand que (>) < plus petit que (<) >= plus grand ou égal à ( ) <= plus petit ou égal à ( ) == égal (=)!= non-égal ( ) if (x = 0)... incorrect if (x == 0)... données atomiques Chap. 4. Énoncés. 3 Septembre 1997 Chap. 4. Énoncés. 4 Septembre 1997
Opérateurs logiques.! "non" logique (TRUE si son opérande est FALSE) && "et" logique (TRUE si les deux opérandes sont TRUE) "ou" logique (TRUE si au moins un de ses opérateurs est TRUE) Évaluation court-circuit. exp1 && exp2 exp1 exp2 tableaux de vérité Exemple: Tester si x n est pas égal à 2 ni à 3. if (x!= 2 x!= 3)... test incorrect if (!(x == 2 x == 3))... if (x!= 2 && x!= 3)... Lois de Morgan.!(p q) est équivalent à!p &&!q Exemple. (x!= 0) && (y % x == 0) Variables drapeaux. bool fait; fait = TRUE; fait = FALSE; fait = (ItemsATraiter == 0);!(p &&q) est équivalent à!p!q 0 < x < 10 0 < x && x < 10 Chap. 4. Énoncés. 5 Septembre 1997 Chap. 4. Énoncés. 6 Septembre 1997 Exemple: Détermination si une année est bissextile. Expressions logiques rédondantes. if (ItemsATraiter == 0) fait = TRUE; else fait = FALSE; fait = (ItemsATraiter == 0); if (fait == TRUE)... if (fait)... ((year % 4 == 0) && (year % 100!= 0)) (year % 400 == 0) * File: leapyear.c * Reads in a year and determines whether it is a * leap year. A year is a leap year if it is * divisible by four, unless it is divisible by 100. * Years divisible by 100 are leap years only if * divisible by 400. int year; bool isleapyear; printf("program to determine whether a year is a leap year.\n"); printf("what year? "); year = GetInteger(); isleapyear = ((year % 4 == 0) && (year % 100!= 0)) (year % 400 == 0); if (isleapyear) printf("%d is a leap year.\n", year); else printf("%d is not a leap year.\n", year); Chap. 4. Énoncés. 7 Septembre 1997 Chap. 4. Énoncés. 8 Septembre 1997
L énoncé if. if (condition) énoncé if (condition) énoncé else énoncé if (entry < 0 && balance < 0) printf("this check bounces. $10 fee deducted.\n"); balance -= 10; La syntaxe de l énoncé if. 1. L énoncé if dans une ligne. 2. L énoncé if dans plusieurs lignes (avec le corps composé). 3. L énoncé if-else utilisant les accolades. 4. L énoncé if en cascade. if (valeur == sentinelle) break; Exemple: Déterminer si un nombre est pair. int n; printf("program to classify a number as even or odd.\n"); printf("n =? "); if (n % 2 == 0) printf("that number is even.\n"); else printf("that number is odd.\n"); La syntaxe de l énoncé if dans une ligne. if (condition) énoncé; condition dénote la valeur booléenne à tester énoncé est un énoncé à exécuter si condition est égale à TRUE (vraie) Le problème de "dangling else". Chap. 4. Énoncés. 9 Septembre 1997 Chap. 4. Énoncés. 10 Septembre 1997 La syntaxe de l énoncé if multiligne. if (condition) énoncés condition dénote la valeur booléenne à tester énoncés est un énoncé composé à exécuter si condition est égale à TRUE (vraie) La syntaxe de l énoncé if-else. if (condition) énoncés T else énoncés F condition dénote la valeur booléenne à tester énoncés T est un énoncé composé à exécuter si condition est égale à TRUE (vraie) énoncés F est un énoncé composé à exécuter si condition est égale à FALSE (fausse) La syntaxe de l énoncé if en cascade. if (condition 1 ) énoncés 1 else if (condition 2 ) énoncés 2 else if (condition 3 ) énoncés 3... else énoncés F chaque condition i dénote une valeur booléenne chaque énoncés i est un énoncé composé, à exécuter si condition i est égale à TRUE (vraie) énoncés F est un énoncé composé à exécuter si chaque condition i est égale à FALSE (fausse) Chap. 4. Énoncés. 11 Septembre 1997 Chap. 4. Énoncés. 12 Septembre 1997
* File: signtest.c * Reads in a number and classifies it according to its sign. int n; printf("program to classify a number by its sign.\n"); printf("n =? "); if (n > 0) printf("that number is positive.\n"); else if (n == 0) printf("that number is zero.\n"); else printf("that number is negative.\n"); L opérateur?: (condition)? expression 1 : expression 2 if (condition) valeur = expression 1 ; else valeur = expression 2 ; max = (x > y)? x : y; printf ("%d elements trouves.\n", nelements); 1 elements trouves. if (nelements > 1) printf ("%d elements trouves.\n", nelements); else printf ("%d element trouve.\n", nelements); string pluriel; pluriel = (nelements > 1)? "s" : ""; printf ("%d element%s trouve%s.\n", nelements, pluriel, pluriel); printf ("erreur = %s\n", (erreur)? "VRAIE" : "FAUSSE"); Chap. 4. Énoncés. 13 Septembre 1997 Chap. 4. Énoncés. 14 Septembre 1997 L énoncé switch. La syntaxe de l énoncé switch switch (expression) case c 1 : énoncés 1 ; break; case c 2 : énoncés 2 ; break;... default: énoncés def ; break; expression est une expression de contrôle, pour choisir les énoncés à exécuter chaque c i est une valeur constante chaque énoncés i est une séquence d énoncés à exécuter lorsque expression est égale à c i énoncés def est une séquence d énoncés à exécuter lorsqu aucune constante c i n est égale à expression case 1: case 2: énoncés break; * File: cardrank.c * Reads in a number between 1 and 13 and writes out the * appropriate symbol for a playing card of that rank. int n; printf("what is the rank of the card (1-13)? "); switch (n) case 1: printf("ace\n"); break; case 11: printf("jack\n"); break; case 12: printf("queen\n"); break; case 13: printf("king\n"); break; default: printf("%d\n", n); break; Chap. 4. Énoncés. 15 Septembre 1997 Chap. 4. Énoncés. 16 Septembre 1997
L énoncé while. La syntaxe de l énoncé while. while (condition) énoncés condition est un test logique pour déterminer si la boucle doit continuer pour une autre itération énoncés est une suite d énoncés à répéter 1. La condition logique est testée avant chaque itération de la boucle, même la première. Si la condition n est pas vérifié initialement, alors le corps de la boucle n est pas exécuté du tout. 2. Cette condition est testée seulement au debut de l itération. Si la condition devient fausse à certain moment de la boucle, le programme ne s en rende compte qu une fois le cycle est complété. En ce moment, le programme réévalue la condition à nouveau. Si elle est toujours fausse, la boucle se termine. int n, dsum; This program sums the digits in an integer. Enter a positive integer: 1729 The sum of the digits is 19 printf("this program sums the digits in an integer.\n"); printf("enter a positive integer: "); dsum = 0; Pour chaque chiffre du nombre, ajouter ce chiffre à dsum. printf("the sum of the digits is %d\n", dsum); while (n > 0) dsum += n % 10; n /= 10; Chap. 4. Énoncés. 17 Septembre 1997 Chap. 4. Énoncés. 18 Septembre 1997 * File: digitsum.c * This program sums the digits in a positive integer. * The program depends on the fact that the last digit of * a integer n is given by n % 10 and the number consisting * of all but the last digit is given by the expression n / 10. int n, dsum; printf("this program sums the digits in an integer.\n"); printf("enter a positive integer: "); dsum = 0; while (n > 0) dsum += n % 10; n /= 10; printf("the sum of the digits is %d\n", dsum); Boucles infinies. Ex.: while (n >= 0) exemple d une boucle infinie dsum += n % 10; n /= 10; Problème de la boucle-et-démi. Ex.: Lecture jusqu'à une sentinelle. 1. Lire une valeur. 2. Si la valeur est égale à la sentinelle - sortir de la boucle. 3. Traiter la valeur lue. while (TRUE) demander une valeur et la lire if (valeur == sentinelle) break; traiter la valeur qui vient d être lue Une autre solution: demander la première valeur et la lire while (valeur == sentinelle) traiter la valeur qui vient d être lue demander une nouvelle valeur et la lire Chap. 4. Énoncés. 19 Septembre 1997 Chap. 4. Énoncés. 20 Septembre 1997
* File: addlist.c * --------------- * This program adds a list of numbers. The end of the * input is indicated by entering 0 as a sentinel value. * This version of the implementation uses a while loop * without a break statement, which forces some duplication * of code. int value, total; printf("this program adds a list of numbers.\n"); printf("signal end of list with a 0.\n"); total = 0; printf("? "); value = GetInteger(); while (value!= 0) total += value; printf("? "); value = GetInteger(); printf("the total is %d\n", total); L énoncé for. for (i= 0;... for (i =- 7;... La syntaxe de l énoncé for. for (init; test; pas) énoncés où init est une expression évaluée pour initialiser la boucle test est un test logique déterminant si la boucle devrait continuer (comme dans l énoncé while) pas est une expression qui est exécutée à la fin de chaque itération de la boucle énoncés est une suite des énoncés exécutés durant chaque itération de la boucle for (i = 0; i < n; i++) for (i = 1; i <= n; i++) Chap. 4. Énoncés. 21 Septembre 1997 Chap. 4. Énoncés. 22 Septembre 1997 * File: liftoff.c * --------------- * Simulates a countdown for a rocket launch. * Constant: StartingCount ------- * Change this constant to use a different starting value * for the countdown. #define StartingCount 10 Main program int t; for ( ; ; ) 10 9 8 7 6 5 4 3 2 1 0 Liftoff! while (TRUE) for (t = StartingCount; t >= 0; t--) printf("%2d\n", t); printf("liftoff!\n"); Chap. 4. Énoncés. 23 Septembre 1997 Chap. 4. Énoncés. 24 Septembre 1997
Boucles for imbriquées. 1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100 * File: timestab.c * Generates a multiplication table where each axis * runs from LowerLimit to UpperLimit. * Constants * --------- * LowerLimit -- Starting value for the table * UpperLimit -- Final value for the table #define LowerLimit 1 #define UpperLimit 10 Main program int i, j; for (i = LowerLimit; i <= UpperLimit; i++) for (j = LowerLimit; j <= UpperLimit; j++) printf(" %4d", i * j); printf("\n"); Chap. 4. Énoncés. 25 Septembre 1997 Chap. 4. Énoncés. 26 Septembre 1997 La relation entre boucle for et boucle while. Boucles for et les données en virgule flottante. for (init; test; pas) énoncés; init; while (test) énoncés; pas; for (i = 0; i < 10; i++)... corps... for (i = 0; i <= 10; i +=2)... for (x = 1.0; x <= 2.0; x += 0.1)... peut echouer for (x = 1.0; x <= 2.0; x += 0.1) peut jamais arriver a 2.0 printf ("%.1f\n", x); for (i = 10; i <= 20; i++) x = i / 10.0; printf ("%.1f\n", x); i = 0; while (i < 10)... corps... i++; Chap. 4. Énoncés. 27 Septembre 1997 Chap. 4. Énoncés. 28 Septembre 1997
Priorités des opérateurs vus jusqu'à date. Opérateurs Associativité - unaire ++ --! (type cast) droite à gauche * / % gauche à droite + - gauche à droite < <= > >= gauche à droite ==!= gauche à droite & gauche à droite && gauche à droite gauche à droite?: droite à gauche = op= droite à gauche Chap. 4. Énoncés. 29 Septembre 1997