Tests et Boucles

La structure pour les tests est le classique if..then..else, sauf que le mot clé then n'est pas indiqué :

Les parenthèses après le if sont obligatoires.

Pour l'expression booléenne on peut trouver :

Si l'on veut mettre plusieurs instructions, il faut mettre ces instructions entre accolades.

Les if..then..else peuvent s'imbriquer :

Dans l'exemple précédent, malgré la présentation trompeuse, le else appartient au second if. Pour qu'il appartienne au premier des accolades doivent être mises :


Les tests imbriqués

Si l'on doit imbriquer plusieurs if..then..else pour, par exemple, tester les réponses d'un utilisateur, mieux vaut utiliser le structure switch.

}

Suivant la valeur de variable, l'un des case sera selectionné. On sort du case par un break. Dans cet exemple, le traitement après le case valeur4 sera effectué pour les valeurs valeur2, valeur3 et valeur4. L'oubli du break est aussi une source fréquente d'erreur. Dans le cas où aucune condition ne convient, les instructions après le mot clé default sont exécutées.


Les boucles

Il existe deux structures de boucle en C. La boucle for bien que son nom soit le même que pour les autres langage est beaucoup plus (et trop) tolérante. La syntaxe est la suivante :

La syntAxe qee l'on peut attendre devrait être la suivante :

ce qui permet de faire une boucle de 0 à 9 pour les valeurs de i. Cette boucle peut être aussi programmée de la manière suivante :

L'incrémentation se fait dans la partie du test et la partie incrémentation est par conséquent vide. On peut arriver à des atrocités comme :

Ce genre de boucle est fortement déconseillé aux débutants.

Les boucles for permettent d'illustrer un principe que l'on retrouve souvent dans les programmes C que nous avons vu lors de la déclaration des tableaux. La numérotation des éléments commence à zéro. Le premier élément commence à l'indice 0. Le test pour sortir de la boucle peut donc être un inférieur strict (<). Dans le premier exemple de boucle donné ci-dessus, on sort de la boucle quand i atteint 10. L'indice a parcouru les valeurs de 0 à 9 soit exactement 10 valeurs.

En théorie des langages la boucle for est supposée se terminer au bout d'un nombre d'itérations connu à l'avance. Il est évident qu'en C ce n'est pas le cas. Il existe une autre structure de boucle dans laquelle la terminaison dépend de conditions internes à la boucle. Par exemple exécuter une série de commandes tant que l'utilisateur répond "oui". Ce genre de boucle est défini par le mot clé while. En C il existe deux structures de boucles utilisant le while :

La première structure est mise en oeuvre en utilisant la structure
qui peut être interprétée comme : effectue les opérations comprises entre le do et le while tant que la condition d'arrêt définie après le mot clé while est vraie. A noter qu'en pascal le test d'arrêt de la boucle REPEAT...UNTIL est inversé. En effet le programme sort de la boucle quand le test devient vrai.

La boucle précédente extraite d'un programme C demande le nom de l'utilisateur, stocke la réponse de l'utilisateur dans la variable nom puis l'affiche. Comme ce programme présente un intérêt majeur, plusieurs utilisateurs peuvent vouloir l'essayer pour savoir si l'ordinateur ne se trompe jamais. Ces instructions ont été encapsulées dans une boucle. On demande à l'utilisateur s'il veut recommencer. S'il tape `o' on recommence au début de la boucle, sinon on en sort.

A remarquer dans cet exemple que le scanf permet de saisir une chaîne de caractères et que le getchar permet de saisir un seul caractère (voir les manuels correspondants).

Exercice 1


Ecrire le programme complet pour que la boucle précédente puisse fonctionner.
Que se passe-t-il quand l'utilisateur tape o à la fin ?


L'autre structure de boucle se définit uniquement à partir du mot clé while :
la boucle est exécutée tant que la condition entre parenthèses est vérifiée. Par exemple :

Exercice 2


Ecrire le programme complet pour que la boucle précédente puisse fonctionner. Appelez-le source boucle.c et l'exécutable boucle
Que répond la machine lorsque l'on tape boucle *
Que répond la machine lorsque l'on tape boucle "*"