1 of 38

/ )

( 1

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

CHAPITRE V

2 of 38

/ )

( 2

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

      • Les instructions de contrôle
        • Donnent la possibilité d’effectuer des choix, de se comporter différemment suivant les circonstances (ex. une réponse de l’utilisateur, un résultat de calcul...)

if...else et switch

        • Donnent la possibilité d’effectuer des boucles, de répéter plusieurs fois un ensemble donné d’instructions

do...while, while et for

        • Instructions de branchement inconditionnel : goto, break et continue

3 of 38

/ )

( 3

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

      • Syntaxe de l’instruction if

        • Le mot else et l’instruction qu’il introduit sont facultatifs
        • expression : expression quelconque
        • instruction_1 et instruction_2 : instructions quelconques :
          • Simple (terminée par un point-virgule),
          • Bloc
          • Instruction structurée (choix, boucles)

1) L’instruction if

if (expression)

instruction_1

else

instruction_2

if (expression)

instruction_1

4 of 38

/ )

( 4

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

      • Exemples

est équivalent à

1) L’instruction if

if ( ++i < limite) printf ("OK") ;

i = i + 1 ;

if ( i < limite ) printf ("OK") ;

if ( i++ < limite ) ......

i = i + 1 ;

if ( i-1 < limite ) ......

if ( ( c=getchar() ) != '\n' ) ......

c = getchar() ;

if ( c != '\n' ) ......

5 of 38

/ )

( 5

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

      • Exemples

      • Différente de

1) L’instruction if

if ( ++i < max && ( (c=getchar()) != '\n') ) ......

++i ;

c = getchar() ;

if ( i<max && ( c!= '\n' ) ) ......

Car dans la première instruction

c = getchar()

n’est pas évaluée lorsque la condition ++i<max est fausse

6 of 38

/ )

( 6

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

      • Imbrication des instructions if

1) L’instruction if

if (a<=b) if (b<=c) printf ("ordonné") ;

else printf ("non ordonné") ;

if (a<=b) if (b<=c) printf ("ordonné") ;

else printf ("non ordonné") ;

Un else se rapporte toujours au dernier if rencontré auquel un else n’a pas encore

été attribué.

7 of 38

/ )

( 7

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

      • Exemple d’utilisation de if imbriqués

Facturation avec remise.

Il lit en donnée un simple prix hors taxes

et calcule le prix TTC correspondant (avec un taux de TVA constant de 18,6 %).

Il établit ensuite une remise dont le taux dépend de la valeur obtenue, à savoir :

        • 0 % pour un montant inférieur à 1 000 F
        • 1 % pour un montant supérieur ou égal à 1 000 F et inférieur à 2 000 F
        • 3 % pour un montant supérieur ou égal à 2 000 F et inférieur à 5 000 F
        • 5 % pour un montant supérieur ou égal à 5 000 F

1) L’instruction if

8 of 38

/ )

( 8

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

      • Exemple d’utilisation de if imbriqués

1) L’instruction if

#define TAUX_TVA 18.6

main()

{

double ht, ttc, net, tauxr, remise ;

printf("donnez le prix hors taxes : ") ;

scanf ("%lf", &ht) ;

ttc = ht * ( 1. + TAUX_TVA/100.) ;

if ( ttc < 1000.) tauxr = 0 ;

else if ( ttc < 2000 ) tauxr = 1. ;

else if ( ttc < 5000 ) tauxr = 3. ;

else tauxr = 5. ;

remise = ttc * tauxr / 100. ;

net = ttc - remise ;

printf ("prix ttc %10.2f\n", ttc) ;

printf ("remise %10.2f\n", remise) ;

printf ("net à payer %10.2f\n", net) ;

}

donnez le prix hors taxes : 500

prix ttc 593.00

remise 0.00

net à payer 593.00

___________________________________________

donnez le prix hors taxes : 4000

prix ttc 4744.00

remise 142.32

net à payer 4601.68

9 of 38

/ )

( 9

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

      • Syntaxe de l’instruction switch

        • expression : expression entière quelconque
        • constante : expression constante d’un type entier (char est accepté car il sera converti en int)
        • suite_d’instructions : séquence d’instructions quelconques
        • Les crochets ( [ et ] ) signifient que ce qu’ils renferment est facultatif

2) Instruction switch

switch (expression)

{ case constante_1 : [ suite_d’instructions_1 ]

case constante_2 : [ suite_d’instructions_2 ]

..............

case constante_n : [ suite_d’instructions_n ]

default : [ suite_d’instructions ]

}

10 of 38

/ )

( 10

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

      • Exemples d’introduction de l’instruction switch

2) Instruction switch

main()

{

int n ;

printf ("donnez un entier : ") ;

scanf ("%d", &n) ;

switch (n)

{ case 0 : printf ("nul\n") ;

break ;

case 1 : printf ("un\n") ;

break ;

case 2 : printf ("deux\n") ;

break ;

}

printf ("au revoir\n") ;

}

donnez un entier : 0

nul

au revoir

______

donnez un entier : 2

deux

au revoir

______

donnez un entier : 5

au revoir

11 of 38

/ )

( 11

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

      • Exemples d’introduction de l’instruction switch

2) Instruction switch

main()

{

int n ;

printf ("donnez un entier : ") ;

scanf ("%d", &n) ;

switch (n)

{ case 0 : printf ("nul\n") ;

case 1 : printf ("un\n") ;

case 2 : printf ("deux\n") ;

}

printf ("au revoir\n") ;

}

donnez un entier : 0

nul

un

deux

au revoir

______

donnez un entier : 2

deux

au revoir

12 of 38

/ )

( 12

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

      • Étiquette default

2) Instruction switch

main()

{

int n ;

printf ("donnez un entier : ") ;

scanf ("%d", &n) ;

switch (n)

{ case 0 : printf ("nul\n") ;

break ;

case 1 : printf ("un\n") ;

break ;

case 2 : printf ("deux\n") ;

break ;

default : printf ("grand\n") ;

}

printf ("au revoir\n") ;

}

donnez un entier : 2

deux

au revoir

_______

donnez un entier : 25

grand

au revoir

13 of 38

/ )

( 13

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

      • Exemple plus général

2) Instruction switch

main()

{

int n ;

printf ("donnez un entier : ") ;

scanf ("%d", &n) ;

switch (n)

{ case 0 : printf ("nul\n") ;

break ;

case 1 :

case 2 : printf ("petit\n") ;

case 3 :

case 4 :

case 5 : printf ("moyen\n") ;

break ;

default : printf ("grand\n") ;

}

}

donnez un entier : 1

petit

moyen

______

donnez un entier : 4

moyen

______

donnez un entier : 25

grand

14 of 38

/ )

( 14

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

      • Commentaires :

L’instruction switch limite les valeurs des étiquettes à des valeurs entières ; en effet, il ne faut pas oublier que la comparaison d’égalité de la valeur d’une expression flottante à celle d’une constante flottante est relativement aléatoire, compte tenu de la précision limitée des calculs

Seulement, il est possible d’employer des constantes de type caractère, étant donné qu’il y aura systématiquement conversion en int

2) Instruction switch

switch(c)

{ case 'a' : ......

case 132 : .....

......

}

switch (n)

{ case 'A' : .....

case 559 : .....

.......

}

Avec c est de type char

Avec n est du type int

15 of 38

/ )

( 15

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

      • Commentaires :

La syntaxe autorise des expressions constantes

2) Instruction switch

#define LIMITE 20

.....

switch (n)

{ .....

case LIMITE-1 : ......

case LIMITE : ......

case LIMITE+1 : ......

}

16 of 38

/ )

( 16

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

      • Syntaxe de l’instruction do... while

3) L’instruction do… while

do instruction

while (expression) ;

      • Notez la présence de parenthèses autour de l’expression qui régit la poursuite de la boucle
      • la présence d’un point-virgule à la fin de cette instruction
      • Lorsque l’instruction à répéter se limite à une seule instruction simple, n’omettez pas le point-virgule qui la termine

do c = getchar() ; while ( c != 'x') ;

      • une boucle infinie, il sera possible d’en sortir par une instruction break

do instruction while (1) ;

17 of 38

/ )

( 17

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

      • Exemple d’introduction de l’instruction do... while

3) L’instruction do… while

main()

{

int n ;

do

{

printf ("donnez un nb >0 : ") ;

scanf ("%d", &n) ;

printf ("vous avez fourni %d\n", n) ;

}

while (n<=0) ;

printf ("réponse correcte") ;

}

donnez un nb >0 : -3

vous avez fourni -3

donnez un nb >0 : -9

vous avez fourni –9

donnez un nb >0 : 12

vous avez fourni 12

réponse correcte

18 of 38

/ )

( 18

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

      • Exemple précédent peut s’écrire

3) L’instruction do… while

do {

printf ("donnez un nb > 0 : ") ;

scanf ("%d", &n) ;

}

while ( printf("vous avez fourni %d", n), n<= 0 );

do printf ("donnez un nb >0 : ") ;

while (scanf("%d", &n), printf ("vous avez fourni %d", n), n <= 0 );

do { }

while ( printf ("donnez un nb > 0 :"), scanf ("%d", &n),

printf ("vous avez fourni %d", n), n <= 0 ) ;

Notez bien que la condition de poursuite doit être la dernière expression évaluée, compte tenu du fonctionnement de l’opérateur séquentiel.

19 of 38

/ )

( 19

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

3) L’instruction do… while

do { } while ( (c=getchar()) != 'x' ) ;

do c = getchar() ;

while ( c != 'x' ) ;

Lit des caractères au clavier jusqu’à ce qu’elle ait obtenu le caractère x.

Elle est équivalente à :

20 of 38

/ )

( 20

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

4) L’instruction while

main()

{

int n, som ;

som = 0 ;

while (som<100)

{

printf ("donnez un nombre : ") ;

scanf ("%d", &n) ;

som += n ;

}

printf ("somme obtenue : %d", som) ;

}

      • Exemple d’introduction de l’instruction while

donnez un nombre : 15

donnez un nombre : 25

donnez un nombre : 12

donnez un nombre : 60

somme obtenue : 112

La condition de poursuite est examinée avant chaque parcours de la boucle et non après. Une telle boucle peut très bien n’être parcourue aucune fois si la condition est fausse dès qu’on l’aborde

21 of 38

/ )

( 21

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

4) L’instruction while

      • Syntaxe de l’instruction while

while (expression)

instruction

      • Commentaires :

Notez la présence de parenthèses pour délimiter la condition de poursuite. Remarquez que, la syntaxe n’impose aucun point-virgule de fin (il s’en trouvera naturellement un à la fin de l’instruction qui suit si celle-ci est simple)

Lorsque la condition de poursuite est une expression qui fait appel à l’opérateur séquentiel, n’oubliez pas qu’alors toutes les expressions qui la constituent seront évaluées avant le test de poursuite de la boucle.

while ( printf ("donnez un nombre : ") , scanf ("%d", &n), som<=100)

som += n ;

Différente de l’exemple précédent

22 of 38

/ )

( 22

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

4) L’instruction while

while ( expression1, expression2 ) ;

Equivalente à

do expression1

while ( expression2 ) ;

23 of 38

/ )

( 23

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

5) L’instruction for

main()

{

int i ;

for ( i=1 ; i<=5 ; i++ )

{

printf ("bonjour ") ;

printf ("%d fois\n", i) ;

}

}

      • Exemple d’introduction de l’instruction for

bonjour 1 fois

bonjour 2 fois

bonjour 3 fois

bonjour 4 fois

bonjour 5 fois

24 of 38

/ )

( 24

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

5) L’instruction for

        • for ( i=1 ; i<=5 ; i++ )
        • Comporte trois expressions.
          • La première est évaluée (une seule fois) avant d’entrer dans la boucle
          • La deuxième conditionne la poursuite de la boucle. Elle est évaluée avant chaque parcours
          • La troisième est évaluée à la fin de chaque parcours

Le programme précédent est équivalent au suivant :

main()

{

int i ;

i = 1 ;

while (i<=5)

{

printf ("bonjour ") ;

printf ("%d fois\n", i) ;

i++ ;

}

}

25 of 38

/ )

( 25

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

5) L’instruction for

for ( [ expression_1 ] ; [ expression_2 ] ; [ expression_3 ] )

instruction

      • Syntaxe de l’instruction for

Les crochets [ et ] signifient que leur contenu est facultatif

for ( expression_1 ; expression_2 ; expression_3) instruction

expression_1 ;

while (expression_2)

{ instruction

expression_3 ;

}

Equivalente à

26 of 38

/ )

( 26

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

5) L’instruction for

      • Syntaxe de l’instruction for

i = 1 ;

for ( ; i<=5 ; i++ )

{

printf ("bonjour ") ;

printf ("%d fois\n", i) ;

}

i = 1 ;

for ( ; i<=5 ; )

{

printf ("bonjour ") ;

printf ("%d fois\n", i) ;

i++ ;

}

Equivalente à

Lorsque l’expression_2 est absente, elle est considérée comme vraie

27 of 38

/ )

( 27

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

5) L’instruction for

      • Syntaxe de l’instruction for

for ( i=0, j=1, k=5 ; ... ; ... )

j=1 ; k=5 ;

for ( i=0 ; ... ; ... )

Equivalente à

De même

i=0 ; j=1 ; k=5 ;

for ( ; ... ; ...)

for ( i=1 ; i <= 5 ; printf("fin de tour"), i++ )

{ instructions }

for ( i=1 ; i<=5 ; i++ )

{ instructions

printf ("fin de tour") ;

}

Equivalente à

28 of 38

/ )

( 28

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

5) L’instruction for

      • Syntaxe de l’instruction for

for ( ; ; ) instruction

Boucle infinie dont on pourra sortir par une instruction break

29 of 38

/ )

( 29

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

6) Les instructions de branchement inconditionnel : break, continue et goto

      • L’instruction break
        • Nous avons déjà vu le rôle de break au sein du bloc régi par une instruction switch.
        • Le C autorise également l’emploi de cette instruction dans une boucle. Dans ce cas, elle sert à interrompre le déroulement de la boucle, en passant à l’instruction qui suit cette boucle.
        • Bien entendu, cette instruction n’a d’intérêt que si son exécution est conditionnée par un choix

main()

{

int i ;

for ( i=1 ; i<=10 ; i++ )

{

printf ("début tour %d\n", i) ;

printf ("bonjour\n") ;

if ( i==3 ) break ;

printf ("fin tour %d\n", i) ;

}

printf ("après la boucle") ;

}

début tour 1

bonjour

fin tour 1

début tour 2

bonjour

fin tour 2

début tour 3

bonjour

après la boucle

30 of 38

/ )

( 30

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

6) Les instructions de branchement inconditionnel : break, continue et goto

      • L’instruction break
        • En cas de boucles imbriquées, break fait sortir de la boucle la plus interne.
        • De même si break apparaît dans un switch imbriqué dans une boucle, elle ne fait sortir que du switch.

31 of 38

/ )

( 31

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

6) Les instructions de branchement inconditionnel : break, continue et goto

      • L’instruction continue
        • L’instruction continue permet de passer prématurément au tour de boucle suivant.
        • Voici un premier exemple avec for :

main()

{

int i ;

for ( i=1 ; i<=5 ; i++ )

{

printf ("début tour %d\n", i) ;

if (i<4) continue ;

printf ("bonjour\n") ;

}

}

début tour 1

début tour 2

début tour 3

début tour 4

bonjour

début tour 5

bonjour

32 of 38

/ )

( 32

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

6) Les instructions de branchement inconditionnel : break, continue et goto

      • L’instruction continue
        • Et voici un second exemple avec do... while

main()

{

int n ;

do

{

printf ("donnez un nb>0 : ") ;

scanf ("%d", &n) ;

if (n<0)

{

printf ("svp >0\n") ;

continue ;

}

printf ("son carré est : %d\n", n*n) ;

}

while(n) ;

}

donnez un nb>0 : 4

son carré est : 16

donnez un nb>0 : -5

svp >0

donnez un nb>0 : 2

son carré est : 4

donnez un nb>0 : 0

son carré est : 0

En cas de boucles imbriquées, l’instruction continue ne concerne que la boucle la plus interne.

33 of 38

/ )

( 33

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

6) Les instructions de branchement inconditionnel : break, continue et goto

      • L’instruction goto

main()

{

int i ;

for ( i=1 ; i<=10 ; i++ )

{ printf ("début tour %d\n", i) ;

printf ("bonjour\n") ;

if ( i==3 ) goto sortie ;

printf ("fin tour %d\n", i) ;

}

sortie : printf ("après la boucle") ;

}

début tour 1

bonjour

fin tour 1

début tour 2

bonjour

fin tour 2

début tour 3

bonjour

après la boucle

34 of 38

/ )

( 34

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

Exercice 1

1) Soit le petit programme suivant :

#include <stdio.h>

main()

{

int i, n, som ;

som = 0 ;

for (i=0 ; i<4 ; i++)

{ printf ("donnez un entier ") ;

scanf ("%d", &n) ;

som += n ;

}

printf ("Somme : %d\n", som) ;

}

Écrire un programme réalisant exactement la même chose, en employant, à la place de l’instruction for :

● une instruction while,

● une instruction do... while.

35 of 38

/ )

( 35

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

Exercice 2

2) Calculer la moyenne de notes fournies au clavier avec un dialogue de ce type :

note 1 : 12

note 2 : 15.25

note 3 : 13.5

note 4 : 8.75

note 5 : -1

moyenne de ces 4 notes : 12.37

Le nombre de notes n’est pas connu a priori et l’utilisateur peut en fournir autant qu’il le désire.

Pour signaler qu’il a terminé, on convient qu’il fournira une note fictive négative. Celle-ci ne devra naturellement pas être prise en compte dans le calcul de la moyenne.

36 of 38

/ )

( 36

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

Exercice 3

3) Afficher un triangle rempli d’étoiles, s’étendant sur un nombre de lignes fourni en donnée et se présentant comme dans cet exemple :

*

**

***

****

*****

37 of 38

/ )

( 37

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

Exercice 4

4) Écrire un programme qui affiche la table de multiplication des nombres de 1 à 10, sous la forme suivante :

38 of 38

/ )

( 38

Langage C

I. II. III. IV. V. VI. VII. VIII. IX.

Les instructions de contrôle

Exercice 5

5) Afficher un triangle isocèle formé d'étoiles. La hauteur du triangle (c'est-à-dire le nombre de lignes) sera fournie en donnée, comme dans l'exemple ci-dessous. On s'arrangera pour que la dernière ligne du triangle s'affiche sur le bord gauche de l'écran.