Vous êtes sur la page 1sur 7

Zeste d… BIBLIOTHÈQUE

TRIBUNE
FORUM

Rechercher
+
Les sauts Licence CC 0

Auteurs : Lucas-84 Taurre informaticienzero c

Catégorie :
Programmation et algorithmique
Dernière mise à jour
dimanche 24 octobre 2021 à 19h54

Les boucles Les fonctions

Dans les chapitres précédents, nous avons vu comment modifier l’exécution de notre programme en fonction du résultat
d’une ou plusieurs conditions. Ainsi, nous avons pu réaliser des tâches plus complexes que de simplement exécuter une suite
d’instructions de manière linéaire.

Cette exécution non linéaire est possible grâce à ce que l’on appelle des sauts. Un saut correspond au passage d’un point à un
autre d’un programme. Bien que cela vous ait été caché, sachez que vous en avez déjà rencontré ! En effet, une instruction if
réalise par exemple un saut à votre insu.

1 if (/* Condition */)


2 {
3 /* Bloc */
4 }
5
6 /* Suite du programme */

Dans le cas où la condition est fausse, l’exécution du programme passe le bloc de l’instruction if et exécute ce qui suit.
Autrement dit, il y a un saut jusqu’à la suite du bloc.

Dans la même veine, une boucle while réalise également des sauts.

1 while (/* Condition */)


2 {
3 /* Bloc à répéter */
4 }
5
6 /* Suite du programme */

Dans cet exemple, si la condition est vraie, le bloc qui suit est exécuté puis il y a un saut pour revenir à l’évaluation de la
condition. Si en revanche elle est fausse, comme pour l’instruction if , il y a un saut au-delà du bloc d’instructions.

Tous ces sauts sont cependant automatiques et vous sont cachés. Dans ce chapitre, nous allons voir comment réaliser
manuellement des sauts à l’aide de trois instructions : break , continue et goto .

L'instruction break
L’instruction continue
Boucles imbriquées
L'instruction goto
L'instruction break

Nous avons déjà rencontré l’instruction break lors de la présentation de l’instruction switch , cette dernière permettait de
quitter le bloc d’un switch pour reprendre immédiatement après. Cependant, l’instruction break peut également être
utilisée au sein d’une boucle pour stopper son exécution (autrement dit pour effectuer un saut au-delà du bloc à répéter).

Exemple

Le plus souvent, une instruction break est employée pour sortir d’une itération lorsqu’une condition (différente de celle
contrôlant l’exécution de la boucle) est remplie. Par exemple, si nous souhaitons réaliser un programme qui détermine le plus
petit diviseur commun de deux nombres, nous pouvons utiliser cette instruction comme suit.

1 #include <stdio.h>
2
3
4 int main(void)
5 {
6 int a;
7 int b;
8
9 printf("Entrez deux nombres : ");
10 scanf("%d %d", &a, &b);
11
12 int min = (a < b) ? a : b;
13
14 for (int i = 2; i <= min; ++i)
15 if (a % i == 0 && b % i == 0)
16 {
17 printf("le plus petit diviseur de %d et %d est %d\n", a, b, i);
18 break;
19 }
20
21 return 0;
22 }

Résultat

1 Entrez deux nombres : 112 567


2 le plus petit diviseur de 112 et 567 est 7
3
4 Entrez deux nombres : 13 17

Comme vous le voyez, la condition principale permet de progresser parmi les diviseurs possibles alors que la seconde
détermine si la valeur courante de i est un diviseur commun. Si c’est le cas, l’exécution de la boucle est stoppée et le résultat
affiché. Dans le cas où il n’y a aucun diviseur commun, la boucle s’arrête lorsque le plus petit des deux nombres est atteint.

L’instruction continue

L’instruction continue permet d’arrêter l’exécution de l’itération courante. Autrement dit, celle-ci vous permet de
retourner (sauter) directement à l’évaluation de la condition.

Exemple

Afin d’améliorer un peu l’exemple précédent, nous pourrions passer les cas où le diviseur testé est un multiple de deux
(puisque si un des deux nombres n’est pas divisible par deux, il ne peut pas l’être par quatre, par exemple).

Ceci peut s’exprimer à l’aide de l’instruction continue .


1 #include <stdio.h>
2
3
4 int main(void)
5 {
6 int a;
7 int b;
8
9 printf("Entrez deux nombres : ");
10 scanf("%d %d", &a, &b);
11
12 int min = (a < b) ? a : b;
13
14 for (int i = 2; i <= min; ++i)
15 {
16 if (i != 2 && i % 2 == 0)
17 {
18 printf("je passe %d\n", i);
19 continue;
20 }
21 if (a % i == 0 && b % i == 0)
22 {
23 printf("le plus petit diviseur de %d et %d est %d\n", a, b, i);
24 break;
25 }
26 }
27
28 return 0;
29 }

Résultat

1 je passe 4
2 je passe 6
3 le plus petit diviseur de 112 et 567 est 7

Dans le cas de la boucle for , l’exécution reprend à l’évaluation de sa deuxième expression (ici ++i ) et non à
l’évaluation de la condition (qui a lieu juste après). Il serait en effet mal venu que la variable i ne soit pas
incrémentée lors de l’utilisation de l’instruction continue .

Boucles imbriquées

Notez bien que les instructions break et continue n’affectent que l’exécution de la boucle dans laquelle elles sont situées.
Ainsi, si vous utilisez l’instruction break dans une boucle imbriquée dans une autre, vous sortirez de la première, mais pas
de la seconde.

1 #include <stdio.h>
2
3
4 int main(void)
5 {
6 for (int i = 0 ; i <= 1000 ; ++i)
7 for (int j = i ; j <= 1000 ; ++j)
8 if (i * j == 1000)
9 {
10 printf ("%d * %d = 1000 \n", i, j);
11 break; /* Quitte la boucle courante, mais pas la première. */
12 }
13
14 return 0;
15 }

Résultat

1 1 * 1000 = 1000
2 2 * 500 = 1000
3 4 * 250 = 1000
4 5 * 200 = 1000
5 8 * 125 = 1000
6 10 * 100 = 1000
7 20 * 50 = 1000
8 25 * 40 = 1000

L'instruction goto

break et continue . Cependant, d’une


Nous venons de voir qu’il était possible de réaliser des sauts à l’aide des instructions
part ces instructions sont confinées à une boucle ou à une instruction switch et, d’autre part, la destination du saut nous
est imposée (la condition avec continue , la fin du bloc d’instructions avec break ).

L’instruction goto permet de sauter à un point précis du programme que nous aurons déterminé à l’avance. Pour ce faire, le
langage C nous permet de marquer des instructions à l’aide d’étiquettes (labels en anglais). Une étiquette n’est rien d’autre
qu’un nom choisi par nos soins suivi du catactère : . Généralement, par souci de lisibilité, les étiquettes sont placées en
retrait des instructions qu’elles désignent.

Exemple

Reprenons (encore) l’exemple du calcul du plus petit commun diviseur. Ce dernier aurait pu être écrit comme suit à l’aide
d’une instruction goto .

1 #include <stdio.h>
2
3
4 int main(void)
5 {
6 int a;
7 int b;
8
9 printf("Entrez deux nombres : ");
10 scanf("%d %d", &a, &b);
11
12 int min = (a < b) ? a : b;
13 int i;
14
15 for (i = 2; i <= min; ++i)
16 if (a % i == 0 && b % i == 0)
17 goto trouve;
18
19 return 0;
20 trouve:
21 printf("le plus petit diviseur de %d et %d est %d\n", a, b, i);
22 return 0;
23 }

Comme vous le voyez, l’appel à la fonction printf() a été marqué avec une étiquette nommée trouve . Celle-ci est utilisée
avec l’instruction goto pour spécifier que c’est à cet endroit que nous souhaitons nous rendre si un diviseur commun est
trouvé. Vous remarquerez également que nous avons désormais deux instructions return , la première étant exécutée dans
le cas où aucun diviseur commun n’est trouvé.
Le dessous des boucles

Maintenant que vous savez cela, vous devriez être capable de réécrire n’importe quelle boucle à l’aide de cette instruction. En
effet, une boucle se compose de deux sauts : un vers une condition et l’autre vers l’instruction qui suit le corps de la boucle.
Ainsi, les deux codes suivants sont équivalents.

1 #include <stdio.h>
2
3
4 int main(void)
5 {
6 int i = 0;
7
8 while (i < 5)
9 {
10 printf("La variable i vaut %d\n", i);
11 i++;
12 }
13
14 return 0;
15 }

1 #include <stdio.h>
2
3
4 int main(void)
5 {
6 int i = 0;
7
8 condition:
9 if (i < 5)
10 {
11 printf("La variable i vaut %d\n", i);
12 i++;
13 goto condition;
14 }
15
16 return 0;
17 }

Goto Hell ?

Bien qu’utile dans certaines circonstances, sachez que l’instruction goto est fortement décriée, principalement pour deux
raisons :

mis à part dans des cas spécifiques, il est possible de réaliser la même action de manière plus claire à l’aide de structures
de contrôles ;
l’utilisation de cette instruction peut amener votre code à être plus difficilement lisible et, dans les pires cas, en faire un
code spaghetti.

À vrai dire, elle est aujourd’hui surtout utilisée dans le cas de la gestion d’erreur, ce que nous verrons plus tard dans ce cours.
Aussi, en attendant, nous vous déconseillons de l’utiliser.

Dans le chapitre suivant, nous aborderons la notion de fonction.

En résumé

1. Une instruction de saut permet de passer directement à l’exécution d’une instruction précise ;
2. L’instruction break permet de sortir de la boucle ou de l’instruction switch dans laquelle elle est employée ;
3. L’instruction continue permet de retourner à l’évaluation de la condition de la boucle dans laquelle elle est utilisée ;
4. L’instruction goto permet de passer à l’exécution d’une instruction désignée par une étiquette.
Les boucles Les fonctions

Signaler une faute dans


ce chapitre

tions
Contacter les auteurs par MP

mmaire

I Les bases du langage C

1. Introduction à la programmation

2. Les outils nécessaires

3. Les variables

4. Manipulations basiques des entrées/sorties

5. Les opérations mathématiques

6. Tests et conditions

7. Les sélections

8. TP : déterminer le jour de la semaine

9. Les boucles

10. Les sauts

L'instruction break

L’instruction continue

Boucles imbriquées

L'instruction goto

11. Les fonctions

12. TP : une calculatrice basique

13. Découper son projet

14. La gestion d'erreurs (1)

II Agrégats, mémoire et fichiers

III Notions avancées

IV Annexes

rtager
Twitter

Facebook

Mastodon
Diaspora*

Envoyer par mail

écharger
PDF
(897,8 Kio)

LaTeX
(737,2 Kio)

EPUB
(398,2 Kio)

Archive
(2,2 Mio)

Zeste de Savoir
• Version :
v30.1c-artemis/df4f27e

API
CGU
À propos
L’association

Contact
L

Vous aimerez peut-être aussi