• Aucun résultat trouvé

7.4 Quelques exemples

7.4.2 Exemple avec une boucle

Nous allons réaliser une fonction qui calcule la longueur d’un chaîne de caractère (vue comme un tableau dont la fonction ne connaît pas la taille), la boucle réalise le parcours du tableau de caractères (tabc) et continue tant que le caractère lu n’est pas le caractère’\0’.

Le programme 7.7 réalise ce parcours de tableau, il est écrit de manière non structurée avec desgoto. Le programme 7.8 réalise ce parcours de tableau, il est écrit de manière structurée avec unformais la mise en page laisse à désirer.

CHAPITRE 7. PROGRAMMATION STRUCTURÉE 87

PROGRAMME7.1 ENSEMBLE DE TESTS NON STRUCTURÉ

1 #include <stdio.h> 2 int

3 main (int argc, char *argv[]) 4 {

5 int i, j;

6 printf ("Veuillez entrer deux valeurs entieres : "); 7 scanf ("%d%d", &i, &j);

8 if (i == j) 9 goto T3; 10 if (i <= 0) 11 goto L1; 12 if (j <= 0) 13 goto L2; 14 if (i > j) 15 goto T2; 16 goto T1; 17 L2:if (i > -j) 18 goto T2; 19 goto T1; 20 L1:if (j <= 0) 21 goto L3; 22 if (-i > j) 23 goto T2; 24 goto T1; 25 L3:if (-i > -j) 26 goto T2;

27 T1:printf (" le plus grand est j : %d\n", j); 28 goto T4;

29 T2:printf (" le plus grand est i : %d\n", i); 30 goto T4;

31 T3:printf (" i et j sont egaux\n"); 32 T4:

33 return 0; 34 }

DONNÉES EN ENTRÉE

10 12

DONNÉES ÉCRITES SUR LE FICHIER STANDARD DE SORTIE

88 7.4. QUELQUES EXEMPLES

PROGRAMME7.2 ENSEMBLE DE TESTS STRUCTURÉ NON MIS EN PAGE

1 #include <stdio.h> 2 int

3 main (int argc, char *argv[]) 4 {

5 int i, j;

6 printf ("Veuillez entrer deux valeurs entieres : "); 7 scanf ("%d%d", &i, &j);

8 if (i == j) printf (" i et j sont egaux\n"); 9 else if (i < 0) if (j < 0)

10 if (-i > -j) printf (" le plus grand est i : %d\n", i); 11 else printf (" le plus grand est j : %d\n", j);

12 else if (-i > j) printf (" le plus grand est i : %d\n", i); 13 else printf (" le plus grand est j : %d\n", j);

14 else if (j < 0) if (i > -j) printf (" le plus grand est i : %d\n", i); 15 else printf (" le plus grand est j : %d\n", j);

16 else if (i > j) printf (" le plus grand est i : %d\n", j); 17 else printf (" le plus grand est j : %d\n", j);

18 return 0; 19 }

DONNÉES EN ENTRÉE

10 12

DONNÉES ÉCRITES SUR LE FICHIER STANDARD DE SORTIE

CHAPITRE 7. PROGRAMMATION STRUCTURÉE 89

PROGRAMME7.3 ENSEMBLE DE TESTS STRUCTURÉ ET MIS EN PAGE

1 #include <stdio.h> 2 int

3 main (int argc, char *argv[]) 4 {

5 int i, j;

6 printf ("Veuillez entrer deux valeurs entieres : "); 7 scanf ("%d%d", &i, &j);

8 if (i == j)

9 printf (" i et j sont egaux\n"); 10 else if (i < 0)

11 if (j < 0) 12 if (-i > -j)

13 printf ("le plus grand est i : %d\n", i);

14 else

15 printf ("le plus grand est j : %d\n", j); 16 else if (-i > j)

17 printf ("le plus grand est i : %d\n", i); 18 else

19 printf ("le plus grand est j : %d\n", j); 20 else if (j < 0)

21 if (i > -j)

22 printf ("le plus grand est i : %d\n", i); 23 else

24 printf ("le plus grand est j : %d\n", j); 25 else if (i > j)

26 printf ("le plus grand est i : %d\n", i); 27 else

28 printf ("le plus grand est j : %d\n", j); 29 return 0;

30 }

DONNÉES EN ENTRÉE

10 12

DONNÉES ÉCRITES SUR LE FICHIER STANDARD DE SORTIE

90 7.4. QUELQUES EXEMPLES

PROGRAMME7.4 ENSEMBLE DE TESTS STRUCTURÉ ET MIS EN PAGE AVEC COMMENTAIRES

1 #include <stdio.h> 2 int

3 main (int argc, char *argv[]) 4 {

5 int i, j;

6 printf ("Veuillez entrer deux valeurs entieres : "); 7 scanf ("%d%d", &i, &j);

8 if (i == j) printf (" i et j sont egaux\n"); 9 else{

10 if (i < 0){ 11 if (j < 0)

12 if (-i > -j) printf ("le plus grand est i : %d\n", i); 13 else printf ("le plus grand est j : %d\n", j); 14 else if (-i > j)

15 printf ("le plus grand est i : %d\n", i);

16 else

17 printf ("le plus grand est j : %d\n", j); 18 }else{ /* i >= 0 */

19 if (j < 0){

20 if (i > -j) printf ("le plus grand est i : %d\n", i); 21 else printf ("le plus grand est j : %d\n", j); 22 } /* fin j < 0 */

23 else{

24 if (i > j) printf ("le plus grand est i : %d\n", i); 25 else printf ("le plus grand est j : %d\n", j); 26 } /* fin j > 0 */ 27 } /* fin i > 0 */ 28 } /* fin i != j */ 29 return 0; 30 } DONNÉES EN ENTRÉE 10 12

DONNÉES ÉCRITES SUR LE FICHIER STANDARD DE SORTIE

CHAPITRE 7. PROGRAMMATION STRUCTURÉE 91

PROGRAMME7.5 ENSEMBLE DE TESTS STRUCTURÉ,MIS EN PAGE ET ÉTIQUETÉ

1 #include <stdio.h> 2 int

3 main (int argc, char *argv[]) 4 {

5 int i, j;

6 printf ("Veuillez entrer deux valeurs entieres : "); 7 scanf ("%d%d", &i, &j);

8 if (i == j)

9 printf (" i et j sont egaux\n"); 10 else 11 { /* ELIF 1 */ 12 if (i < 0) 13 { /* ELIF1.IF1 */ 14 if (j < 0) 15 if (-i > -j)

16 printf (" le plus grand est i : %d\n", i);

17 else

18 printf (" le plus grand est j : %d\n", j); 19 else if (-i > j)

20 printf (" le plus grand est i : %d\n", i);

21 else

22 printf (" le plus grand est j : %d\n", j);

23 } /* fin ELIF 1.IF1 */

24 else

25 { /* ELIF 1.ELIF1 */

26 if (j < 0)

27 {

28 if (i > -j)

29 printf (" le plus grand est i : %d\n", i);

30 else

31 printf (" le plus grand est j : %d\n", j);

32 } /* fin j < 0 */

33 else

34 {

35 if (i > j)

36 printf (" le plus grand est i : %d\n", i);

37 else

38 printf (" le plus grand est j : %d\n", j);

39 } /* fin j > 0 */ 40 } /* fin ELIF1.ELIF1 */ 41 } /* fin ELIF 1 */ 42 return 0; 43 } DONNÉES EN ENTRÉE 10 12

DONNÉES ÉCRITES SUR LE FICHIER STANDARD DE SORTIE

92 7.4. QUELQUES EXEMPLES

PROGRAMME7.6 ENSEMBLE DE TESTS PAR TABLE DE BRANCHEMENT

1 #include <stdio.h> 2 int

3 main (int argc, char *argv[]) 4 {

5 int i, j;

6 printf ("Veuillez entrer deux valeurs entieres : "); 7 scanf ("%d%d", &i, &j);

8 if (i == j)

9 printf (" i et j sont egaux\n"); 10 else

11 {

12 /* l’expression (i<0) + 2*(j<0)) donne la valeur : */ 13 /* 0 si i>0 et j>0, 1 si i<0 et j>0 */ 14 /* 2 si i>0 et j<0 3 si i<0 et j<0 */ 15 switch ((i < 0) + 2 * (j < 0)) 16 { 17 case 0: 18 if (i > j)

19 printf ("le plus grand est i : %d\n", i);

20 else

21 printf ("le plus grand est j : %d\n", j);

22 break;

23 case 1:

24 if (-i > j)

25 printf ("le plus grand est i : %d\n", i);

26 else

27 printf ("le plus grand est j : %d\n", j);

28 break;

29 case 2:

30 if (i > -j)

31 printf ("le plus grand est i : %d\n", i);

32 else

33 printf ("le plus grand est j : %d\n", j);

34 break;

35 case 3:

36 if (-i > -j)

37 printf ("le plus grand est i : %d\n", i);

38 else

39 printf ("le plus grand est j : %d\n", j);

40 } /* switch */ 41 } /* fin i != j */ 42 return 0; 43 } DONNÉES EN ENTRÉE 10 12

DONNÉES ÉCRITES SUR LE FICHIER STANDARD DE SORTIE

CHAPITRE 7. PROGRAMMATION STRUCTURÉE 93

Programme 7.7 Boucle réalisée par des tests et sauts

1 int

2 mystrlen (char tabc[]) 3 { 4 int i; 5 i = 0; 6 B1: 7 if (tabc[i] == ’\0’) 8 goto B2; 9 i = i + 1; 10 if (i < 100) 11 goto B1; 12 B2: 13 return i; 14 }

Programme 7.8 Boucle réalisée par un for()

1 int

2 mystrlen (char tabc[]) 3 {

4 int i;

5 for (i = 0; i < 100; i++) if (tabc[i] == ’\0’) break; 6 return i;

7 }

Programme 7.9 Boucle réalisée par un for() et mise en page

1 int

2 mystrlen (char tabc[]) 3 { 4 int i; 5 for (i = 0; i < 100; i++) 6 if (tabc[i] == ’\0’) 7 break; 8 return i; 9 }

Chapitre 8

Fonctions

Les fonctions sont des parties de code source qui permettent de réaliser le même type de traitement plusieurs fois et/ou sur des variables différentes. Les mots procédure et fonction sont employés dans le reste de ce chapitre de manière quasi indifférente.

Une fonction en langage C peut :

– modifier des données globales. Ces données sont dans une zone de mémoire qui peut être modifiée par le reste du programme. Une fonction peut dans ces conditions réaliser plusieurs fois le même traitement sur un ensemble de variables défini à la compilation ;

– communiquer avec le reste du programme par une interface. Cette interface est spécifiée à la com- pilation. L’appel de la fonction correspond à un échange de données à travers cette interface, au traitement de ces données (dans le corps de fonction), et à un retour de résultat via cette interface. Ainsi, une fonction permet de réaliser le même traitement sur des ensembles de variables différents.

8.1

Définition d’une fonction

Lors de leur définition ou de leur utilisation les fonctions sont distinguées des variables par la présence des parenthèses ouvrantes et fermantes. Une définition de fonction, voir figure 8.1 contient :

– une interface ;

– un corps de fonction qui est en fait un bloc d’instructions. L’interface complète d’une fonction contient :

– la déclaration du type de retour et du nom de la fonction ; – une parenthèse ouvrante ;

– la déclaration des types et des noms des paramètres ; – une parenthèse fermante.

Documents relatifs