Image représantant du code source

Introduction à la programmation - Le langage C - Les boucles

while (42) { printf("La boucle est bouclée\n"); }


Bonjour tout le monde,

Bienvenue aujourd'hui à ce nouveau tutoriel d'introduction à la programmation en C sur les boucles.

Il existe en C trois types de boucles que nous allons découvrir :

while

Le premier type de boucle que nous allons apprendre à utiliser est la boucle nommée "while", qui signifie "tant que" en français.

Ce type de boucle est le plus générique. Vous pouvez parfaitement écrire n'importe quel programme nécessitant des boucles avec uniquement des boucles "while", vous perdrez seulement en organisation du code par rapport aux deux autres types de boucle.

Imaginons que vous vouliez créer un jeu qui va continuer jusqu'à ce que le joueur ait perdu (comme Temple Run ou Dragon fly! sur smartphone par exemple), cela va se traduire ainsi :

bool estEnVie = true;
while (estEnVie == true) {
    // Mets à jour le jeu
}

Dans le code ci-dessus, nous déclarons une variable "estEnVie" qui est assignée à "vrai" (true).

Ensuite nous arrivons à la boucle while, dont la syntaxe est la suivante :

  • le mot clé "while"
  • une condition (comme pour les if)
  • un bloc de code entre accolades.

Attention : S'il n'y a pas d'accolades, alors la première ligne après la condition sera considérée comme le code de la boucle.

Le code compilé que produira la boucle "while" fonctionnera en suivant ce principe :

Créer une variable "estEnVie" et lui assigner la valeur "vrai"
// Début de la boucle "while"
Créer un marqueur
Si la variable "estEnVie" vaut "vrai" alors :
// Code à l'intérieur de la boucle
...
// Fin du code la boucle
Retourner au marqueur
// Fin de la boucle "while"

Comme vous pouvez le voir, si la condition n'est pas remplie lorsque l'on arrive à la boucle, c'est-à-dire que "estEnVie" est faux, alors le code la boucle ne sera jamais exécuté et le programme passera directement au code après la boucle.

De même, si la condition est remplie, le programme rentrera alors dans la boucle et n'en sortira que lorsque celle-ci deviendra fausse (c'est-à-dire que "estEnVie" vaudra faux) puisque le programme retournera toujours au test de la condition à chaque fois qu'il aura terminé le code à l'intérieur de la boucle.

Attention, si dans cet exemple la variable "estEnVie" n'est jamais assigné à "false" (faux), alors le programme ne pourra jamais quitter la boucle, puisqu'il reviendra toujours à la condition qui sera toujours remplie. On appelle ceci une boucle infinie.

do while

Le second type de boucle que nous allons voir est la boucle "do while", qui signifie littéralement "faire tant que" en français.

La boucle "do while" a le même fonctionnement que la boucle "while", à la seule différence que la condition est testée à la fin du code de la boucle et non au début comme pour la boucle "while".

En effet, avec la boucle "while" si la condition n'était pas remplie en arrivant à celle-ci la première fois, alors le code de la boucle n'était jamais exécuté. Mais il se peut que vous vouliez que ce code soit toujours exécuté au moins une fois même si la condition est fausse, c'est ici qu'intervient la boucle "do while".

Par exemple, imaginons que vous vouliez faire clignoter automatiquement une LED sur un circuit électronique, et que ce clignotement continue tant qu'un bouton est appuyé, nous pourrions donc avoir ce code :

do {
    allumerLED(); // Appeler une fonction pour allumer la led
    attendre(1); // Appeler une fonction permettant d'attendre un certain nombre de secondes
    eteindreLED(); // Appeler une fonction pour éteindre la led
    attendre(1);
}
while (boutonEstAppuye() == true); // Appeler une fonction permettant de savoir si le bouton est appuyé et utiliser le résultat pour tester la condition

Comme vous pouvez le voir, la syntaxe du "do while" est très proche du "while". Le code se situe maintenant avant le mot-clé "while" et est connu grâce au mot-clé "do".

Contraîrement à la boucle "while", le code contenu à l'intérieur du bloc "do" sera exécuté une première fois même si la condition du "while" est fausse, puisque le code compilé suivra ce principe :

// Début de la boucle "do while"
Créer un marqueur
// Début du code à l'intérieur du "do"
Appeler la fonction "allumerLED" sans paramètre
Appeler la fonction "attendre" avec le paramètre "1"
Appeler la fonction "eteindreLED" sans paramètre
Appeler la fonction "attendre" avec le paramètre "1"
// Fin du code à l'intérieur du "do"
Si la fonction "boutonEstAppuye" renvoi "vrai" Alors retourner au marqueur

for

Le dernier type de boucle que nous allons voir aujourd'hui est la boucle "for", signifiant "pour" en français.

Ce type de boucle permet d'initialiser une variable, tester une condition dessus et mettre à jour cette variable automatiquement.

Pour éclaircir ce concept un peu abstrait, prenons un exemple :

Vous écrivez un logiciel d'édition de liste de courses pour aller au supermarché, et vous souhaitez afficher tous les éléments de la liste. Cela pourrait se traduire ainsi :

for (produit produitDeLaListe = debutDeLaListe(); produitDeLaListe != finDeLaListe(); produitDeLaListe = produitSuivantDeLaListe()) {
    afficherProduit(produitDeLaListe) // Fonction permettant d'afficher un produit de la liste de courses
}

Comme montré dans l'exemple ci-dessus, la boucle "for" est construite de la manière suivante :

  • Le mot-clé "for"
  • 3 éléments séparés par des ";" à l'intérieur des parenthèses :
    • L'initialisation : on (déclare optionnellement) et initialise une variable à une certaine valeur
    • La condition : on effectue un test sur cette variable, comme on le ferait avec un "if"
    • La mise à jour : on affecte une nouvelle valeur à la variable

Pour comprendre comment et dans quelle ordre tout ceci va se passer, regardons à quoi ressemblera algorithmiquement le code compilé de l'exemple au-dessus :

Déclarer une variable de type "produit" nommée "produitDeLaListe" et l'initialiser avec le retour de la fonction "debutDeLaListe"
Créer un marqueur
Si "produitDeLaListe" est différent du retour de la fonction "finDeLaListe" Alors :
Exécuter le code à l'intérieur de la boucle "for"
Affecter le retour de la fonction "produitSuivantDeLaListe" à la variable "produitDeLaListe"
Retourner au marqueur
Fin de la condition

Comme vous pouvez le voir, le code contenu dans la première partie des parenthèses du "for" s'exécute en premier, puis la condition spécifiée dans la deuxième partie est testée.

Si et seulement si la condition est vérifiée alors on exécute le code que l'on a écrit dans la boucle "for", puis la variable est mise à jour avec le code écrit dans la troisième partie des parenthèses du "for" et enfin on retourne au marqueur placé juste avant la condition.

Notez cependant que si la variable est déclarée par la première partie du "for" comme dans l'exemple au-dessus, alors vous ne pourrez pas continuer à l'utiliser après la boucle.

Imaginons par exemple que vous vouliez appeler à nouveau la fonction "afficherProduit" après la boucle "for" sur la variable "produitDeLaListe", le nouveau code ressemblerait à ceci :

for (produit produitDeLaListe = debutDeLaListe(); produitDeLaListe != finDeLaListe(); produitDeLaListe = produitSuivantDeLaListe()) {
    afficherProduit(produitDeLaListe) // Fonction permettant d'afficher un produit de la liste de courses
}
afficherProduit(produitDeLaListe) // Ne fonctionnera pas

Le code ci-dessus ne fonctionnera pas car la variable "produitDeLaListe" n'existera plus une fois que la boucle "for" sera terminée. Je vous expliquerai pourquoi plus en détails dans un chapitre d'approfondissement sur la durée de vie des variables.

En attendant, si vous souhaitez conserver la variable utilisée dans la boucle "for" pour l'afficher après par exemple, vous devrez déclarer la variable avant la boucle comme ceci :

produit produitDeLaListe; // déclaration de la variable produitDeLaListe
for (produitDeLaListe = debutDeLaListe(); produitDeLaListe != finDeLaListe(); produitDeLaListe = produitSuivantDeLaListe()) {
    afficherProduit(produitDeLaListe) // Fonction permettant d'afficher un produit de la liste de courses
}
afficherProduit(produitDeLaListe) // Fonctionnera

Nous avons à présent terminé ce chapitre sur les boucles, j'espère qu'il vous aura plus et je vous dis à très bientôt pour un nouveau chapitre sur les fonctions ;)


Publié le 10/04/2017