LES STRUCTURES DE CONTROLE INSTRUCTIONS STRUCTUREES BLOC SELECTION ITERATION ALTERNATIVE CHOIX SYSTEMATIQUE DE RECHERCHE if.. switch for while, do... while LA SELECTION - instruction simple conditionnée (SI / ALORS) if (expression) expression suite exemple : lire un caractère au clavier et, s'il s'agit d'une lettre, la convertir en minuscules puis l'afficher à l'écran. char c; if (c >= 'A' && c <= 'Z') putchar(c + 'a' - 'A'); Introduction au langage "C" (S. W.) page 11
- instruction alternative complète (SI / ALORS / SINON) if (expression) instruction1(s) instruction2(s) instruction1(s) expression instruction2(s) suite Le test sert d'aiguillage entre les instructions 1 et 2. L'expression qui suit le "if" est évaluée. Si elle est différente de 0 (<=> VRAIE), c'est instruction1 qui est exécutée, sinon c'est l'instruction2 qui est exécutée. Exemple1 : lecture d'un nombre au clavier. Si le nombre est positif, alors afficher à l'écran la racine carrée de ce nombre, sinon afficher un message d'erreur. #include <math.h> double x; printf("tapez le nombre dont vous désirez obtenir la racine :"); scanf("%lf",&x); if (x >= 0) printf("la racine de %lf est %lf\n",x,sqrt(x)); printf("pas de racine réelle\n"); REMARQUES : Les instructions peuvent être soit simples, soit composées : - une instruction simple doit être terminée par point-virgule - une instruction composée (bloc) doit être encadrée par des accolades A l'intérieur d'un bloc il peut y avoir, dans l'ordre : - des déclarations de variables (optionnel) - des instructions simples ou composées Introduction au langage "C" (S. W.) page 12
Exemple 2 : lire un entier au clavier puis indiquer s'il est pair ou impair int n; printf("tapez un entier :"); scanf("%d",&n); if (n % 2 == 0) printf("nombre pair"); printf("nombre impair"); le "" est toujours associé au "if" le plus proche l'expression précédente est équivalente à : if (expression1) if (expression1) if (expression2) if (expression2) instruction1 instruction1 instruction2 instruction2 - tests multiples expr. 1 expr. 2 expr. n INST. 1 INST. 2 INST. n INST.n+1 suite if (expression1) instruction1 if (expression2) instruction2 if (expression3) instruction3 [ instruction4 ] Les expressions sont évaluées dans l'ordre. Si une expression est, l'instruction correspondante est exécutée. Le dernier traite le cas où aucune des conditions ne serait remplie. Il y a deux présentations possibles de votre code, soit celle illustrée ci dessus (présentation compacte rendant la recherche d'erreurs peu aisée), soit celle où chaque "if" est aligné avec le "" correspondant. C'est cette présentation que nous adopterons en BTS IRIS. Elle est illustrée par l'exemple ci dessous. Introduction au langage "C" (S. W.) page 13
Exemple : lire 3 entiers au clavier puis les afficher par valeur décroissante. int n1,n2,n3; printf("tapez 3 entiers"); scanf("%d",&n1); scanf("%d",&n2); scanf("%d",&n3); if (n1 >= n2 && n1 >= n3) if (n2 >= n3) printf("%d %d %d\n",n1,n2,n3); printf("%d %d %d\n",n1,n3,n2); if (n2 >= n3 && n2 >= n1) if (n1 >= n3) printf("%d %d %d\n",n2,n1,n3); printf("%d %d %d\n",n2,n3,n1); if (n2 >= n1) printf("%d %d %d\n",n3,n2,n1); printf("%d %d %d\n",n3,n1,n2); - l'opérateur ternaire (opérateur conditionnel) L'opérateur conditionnel? s'utilise de la manière suivante: expr? expr1 : expr2 Si la valeur de expr est non nulle, l'évaluation de l'expression retournera la valeur de expr1, dans tous les autres cas, elle retournera la valeur de expr2. Exemple : soient trois entiers n1, n2 et max. Après exécution de l'opérateur ternaire, max aura la plus grande des deux valeurs : (n1 > n2)? (max = n1) : (max = n2); Exemple : lecture de deux nombres entiers au clavier et affichage de la valeur du plus grand de ces nombres. int n1,n2; printf("tapez deux nombres entiers :"); scanf("%d %d",&n1,&n2); printf("%d",n1 > n2? n1 : n2); Introduction au langage "C" (S. W.) page 14
- l'instruction de choix multiples CAS PARMI <critère> cas 1 : instruction 1 cas 2 : instruction 2 cas 3 : instruction 3 cas N : instruction N dans tous les autres cas : instruction K FIN_CAS L'instruction switch est une instruction de choix multiples qui permet d'effectuer un aiguillage direct vers les actions (instructions) en fonction d'un cas matérialisé par la clause case. switch (expression) case expr1 : instruction 1; [break;] case expr2 : instruction 2; [break;] case exprn : instruction n; [break;] [ default : instruction d ] L'expression est évaluée de manière à produire un résultat de type entier ou de type caractère. Les expr1, expr2... exprn sont des propositions à valeur constante de type entier ou de type caractère et peuvent être construites à l'aide des opérateurs suivants : +, -,*, /, %, &,, ^, ~, >>, <<,? :, ==,!=, >, >=, <, <= ^ OU exclusif & ET logique >> décalage à droite ~ complément à un OU logique << décalage à gauche == test d'égalité!= test d'inégalité octet1 ET octet2 octet1 OU octet2 octet1 OU exclusif octet2 octet1 = 0xF0 - octet2 = 0x15 10 F5 E5 octet1 = 0x7F - octet2 = 0x8A 0A FF F5 octet1 = 0xAA - octet2 = 0x55 00 FF FF Complément à un >> de deux bits << de deux bits octet = 0xF0 0F 3C C0 octet = 0x15 EA 0C 54 octet = 0x7F 80 1F FC octet = 0x8A 75 22 28 octet = 0xAA 55 2A A8 octet2= 0x55 AA 15 54 Introduction au langage "C" (S. W.) page 15
Après exécution d'un cas on exécute l'instruction suivante à moins de rencontrer un break qui provoque un débranchement à la fin de la structure "switch". exemple : lire un caractère au clavier et indiquer s'il s'agit d'un chiffre, d'un opérateur (+,-,*,/), d'un séparateur (TAB, NEW LINE, ESPACE) ou d'un autre caractère. puts("tapez un caractère"); switch (getchar()) case '0' : /* détection d'un chiffre */ case '1' : case '2' : case '3' : case '4' : case '5' : case '6' : case '7' : case '8' : case '9' : case '+' : case '-' : case '*' : case '/' : case ' ' : case '\n' : case '\t' : printf("vous avez tape un chiffre\n"); break; printf("vous avez tape un operateur\n"); break; /* espace, retour à la ligne ou tabulation*/ printf("vous avez tape un separateur\n"); break; default : printf("lettre ordinaire\n"); break; Introduction au langage "C" (S. W.) page 16
EXERCICES - Au moyen d'une structure sélective (si/alors/sinon se traduisant en en"c" par un if/) écrire les programmes suivants : 1) Résolution d'une équation du second degré de la forme ax 2 +bx+c=0, avec a, b et c des réels quelconques lus au clavier. (la fonction sqrt() permet de calculer la racine carrée d un nombre - il faut inclure <math.h>) 2) Calculer la racine d'un nombre entier préalablement lu au clavier. 3) Calculer la valeur absolue d'un nombre préalablement lu au clavier. 4) Saisir un entier au clavier puis indiquer s'il s'agit d'un entier positif, négatif ou nul. 5) Lire un caractère au clavier et indiquer s'il s'agit d'un chiffre, d'une lettre majuscule, d'une lettre minuscule ou d'un autre caractère. 6) Réalisation d'une "mini-calculatrice" dont le fonctionnement sera le suivant : - lecture des 2 opérandes au clavier et choix de l'opérateur - effectuer l'opération correspondante - afficher le résultat de l'opération à l'écran 7) Résolution d'un système de 2 équations du 1er degré à 2 inconnues du type ax+by = e cx+dy = f Les coefficients a, b, c, d, e et f seront saisis au clavier en début de programme. En tapant sous Google les mots clés suivants : "résolution" +système +"2 équations" +"1er degré" +"2 inconnues on découvre (entre autres) le site suivant http://www.quid.fr/2007/mathematiques/equations/1 dont nous nous intéresserons plus particulièrement à la rubrique Système de 2 équations du 1er degré à 2 inconnues. Application numérique : Avec a=1, b=2, c=5, d=3, e=4, f=6 on obtient les résultats suivants : x = -4 et y = -4.5 Avec a=1, b=2, c=3, d=4, e=5, f=6 on obtient les résultats suivants : x = -1 et y = -2 - Avec une structure à choix multiples reprendre les exercices : 4) attention aux coefficients à valeur constante! 5) éventuellement en utilisant préalablement une structure sélective 6) - Au moyen de l'opérateur ternaire reprendre les exercices : 2) et 3) Lire 3 nombres au clavier et les afficher à l'écran par valeurs croissantes en utilisant l'opérateur ternaire. Introduction au langage "C" (S. W.) page 17
- LES ITERATIONS - la structure "TANT QUE" while (expression) ; expression suite exemple 1 : Lecture d'une suite de caractères au clavier et affichage de ces caractères à l'écran jusqu'à frappe du caractère dollar - le '$' n'est pas affiché - le '$' est affiché char c; char c; while (c!= '$') while (c!= '$') putchar(c); putchar(c); putchar(c); exemple 2 : Affichage à l'écran de exemple 3 : élévation au carré des entiers tous les caractères tapés au clavier compris entre 1 à 10. jusqu'à frappe de <CTRL Z> > void main (void) int i=1; char c; while (i <= 10) while ( (c=getchar())!= EOF) printf("le carré de %d est : %d\n", i,i*i); putchar(c); i++; L'instruction est exécutée si la valeur de l'expression qui suit le while est non nulle, et est répétée jusqu'à ce que la valeur de cette expression s'annule. L'instruction associée à une boucle while peut être simple ou composée. Introduction au langage "C" (S. W.) page 18
- la structure FAIRE... TANT QUE Syntaxe : do while (expression); expression suite L'instruction est répétée jusqu'à ce que la valeur de l'expression s'annule cette boucle est effectuée au moins une fois, quelque soit la valeur de l'expression. L'instruction associée à une boucle do... while peut être simple ou composée. exemple 1 : lecture d'une suite de caractères au clavier et affichage de ces caractères à l'écran jusqu'à détection du caractère dollar - le '$' est affiché - le '$' n'est pas affiché char c; char c; do do putchar(c); if (c!= '$') putchar(c); while (c!= '$'); while (c!= '$'); exemple 2 : élévation au carré des nombres entiers compris entre 1 à 10 #define N 10 #define N 10 int i=1; int i=0; do do printf("le carré de %d est : %d\n", i++; i,i*i); printf("le carré de %d est : %d\n",i,i*i); i++; while (i<n); while (i<=n); Introduction au langage "C" (S. W.) page 19
- la structure POUR (utilisée lorsque le nombre d'itérations est connu à l'avance) for (expression1; expression2; expression3) ; expression1 : initialisation de la boucle, n'est exécutée qu'une seule fois expression2 : condition d'exécution de la boucle la boucle est exécutée tant que l'expression2 est VRAIE (c'est-à-dire non nulle) expression3 : action agissant la plupart du temps sur la condition d'itération (incrémentation d'un compteur, dans la plupart des cas) for (initialisation(s) ; condition(s) d'exécution ; ) i DEBUT i <= FIN vrai faux for (i = DEBUT; i < FIN; i += PAS) i i + PAS suite Une boucle for peut toujours être remplacée par une boucle while : i = DEBUT; while (i < FIN) ; i = i + PAS; RQ : i i + PAS se note aussi i += PAS exemple 1 : élévation au carré des nombres entiers compris entre 1 à 10 int i; // RQ : i++ i i+1 i += 1 for (i = 1 ; i <= 10 ; i++) printf ("le carré de %d est : %d\n", i, i*i); REMARQUES : - Il est impossible de se débrancher directement à l'intérieur d'une structure for. - On peut avoir des structures for imbriquées mais chaque fois avec des indices différents Introduction au langage "C" (S. W.) page 20
exemple 2 : Calcul des tables de multiplication de 1 à 10 #define N 10 int i,j; for (i = 1 ; i <= N ; i++) printf("table DE %d\n",i); for (j = 1 ; j <= N ; j++) printf ("%d * %d = %d\n", j, i, i*j); printf("\n"); L'INSTRUCTION "break" L'instruction break permet de sortir de la boucle do, for, while ou switch en cours d'exécution. Le break est limité à un seul niveau d'imbrication. debut_boucle break fin_boucle Introduction au langage "C" (S. W.) page 21
EXERCICES 1) La définition de la fonction factorielle est la suivante : n! = n* (n-1) * (n-2) *... * 3 * 2 * 1 0! = 1 Ecrire trois programmes qui calculent cette fonction factorielle pour un nombre n dont la valeur sera saisie au clavier en début de programme a) avec une structure POUR (FOR) b) avec une structure REPETER (DO... WHILE) c) avec une structure TANT QUE (WHILE) 2) Reprendre l'exercice précédent en faisant varier l'indice par valeur décroissante. 3) Ecrire un programme permettant de rechercher le maximum et le minimum d'une suite de nombres préalablement lue au clavier, la dernière valeur de la suite étant nulle. a) utiliser une structure TANT QUE b) utiliser une structure REPETER 4) Ecrire un programme permettant la saisie d'un texte au clavier jusqu'à détection du caractère * (étoile) puis réalisant l'affichage à l'écran du même texte converti en minuscules. a) avec une structure TANT QUE (WHILE) et une structure sélective b) avec une structure TANT QUE (WHILE) et une structure comprenant l'opérateur ternaire 5) Lire un texte au clavier et compter le nombre de chiffres, de lettres, de voyelles et de consonnes que ce texte contient. La frappe d'un dollar termine la saisie. a) structure sélective b) structure à choix multiple Introduction au langage "C" (S. W.) page 22