Les boucles

2. L'instruction " while "

Abordons maintenant la deuxième instruction qui permet de répéter plusieurs fois consécutives l'exécution d'une instruction ou d'un bloc d'instructions: l'instruction while. Contrairement à la boucle for qui nécessite un compteur, la boucle while évalue la véracité d'une condition à chaque fois qu'elle doit éventuellement exécuter une nouvelle fois le bloc d'instructions.

Si la condition est vraie, la boucle se répète une fois de plus. Si la condition est fausse, la boucle s'arrête et le script se poursuit normalement.

La boucle se répète tant que la condition est vraie

exemple 1

Dans l'exemple 1 ci-contre, la condition associée à la boucle while est "i est-il strictement inférieur à 6" ? Tant que cette condition est vraie, les deux instructions aux lignes 3 et 4 sont répétées. Puisqu'à chaque répétition la valeur de i est incrémentée de 1 (voir ligne 4), i prend successivement les valeurs 3, 4, 5 et 6. Lorsque i prend la valeur 6, le script exécute l'instruction située à la ligne 5 sans entrer dans la boucle, c'est à dire sans répéter les lignes 3 et 4

Du point de vue de la syntaxe, il est important de retenir deux choses:

  • l'instruction while se termine elle aussi par deux points " : "

  • l'instruction ou le bloc d'instructions qui doivent être répétés doivent encore s'écrire avec une indentation

exemple 2

exemple 3

Dans l'exemple 2 (ci-dessus), le script permet d'identifier le premier multiple de 7 supérieur ou égal à 100. En effet, tant que i est un entier strictement inférieur à 100, on lui rajoute 7

Dans l'exemple 3, on initialise N à 23. Or la condition d'entrée dans la boucle while est que N soit strictement inférieur à 10. Cela n'étant jamais vrai, l'instruction 3 n'est jamais exécutée.

exemple 4

Dans l'exemple 4 (ci-contre), on contraint l'utilisateur à donner le bon mot de passe. En effet, tant que la variable mot est différente du mot de passe attendu (ici 'OK'), l'instruction 3 se répète.

En langage python, différent se note !=

Notez qu'il est indispensable que le script entre au moins une fois dans la boucle pour pouvoir demander à l'utilisateur de saisir le mot de passe une première fois. Il faut donc s'assurer que la variable mot soit initialisée de manière à ce qu'elle soit différente du mot de passe attendu (voir ligne 1, exemple 4)

exemple 5

exemple 6

Lorsqu'on décide de travailler avec une boucle while, il est indispensable de s'assurer que la boucle s'arrêtera. En pratique, cela signifie qu'au moment d'écrire le script, il faut vérifier que la condition associée à la boucle deviendra fausse à un moment donné.

Dans l'exemple 5, N est égal à 1, puis on lui ajoute 5 de manière répétée. N prend donc successivement les valeurs 1, 6, 11, ... , 91, 96, ... Puisque N est toujours différent de 92, la boucle se répète indéfiniment et l'instruction située à la ligne 4 n'est jamais exécutée

Dans l'exemple 6, i et j valent tous les deux 1 au début du script. Lorsque la boucle se répète, c'est la valeur de j qui est modifiée. En pratique, i reste toujours égal à 1 et donc la condition i < 10 reste toujours vraie. De nouveau, la boucle se répète indéfiniment et l'instruction située à la ligne 4 n'est jamais exécutée.

Certains interpréteurs peuvent détecter lorsqu'un script entre dans une boucle infinie et un message d'alerte apparait lors de l'exécution. Attention, ce n'est pas le cas de tous les interpréteurs.

EXERCICES

Exercice 1: A l'aide d'une boucle while, afficher la première puissance de 2 supérieure à 10 000 (c'est 16 384)

Exercice 2: A l'aide d'une boucle while, écrire un script qui contraint l'utilisateur à entrer un nombre entier inférieur ou égal à 15

Exercice 3: A l'aide d'une boucle while, écrire un script qui contraint l'utilisateur à entrer un mot qui se termine par 'e'

Exercice 4: On pose la somme de carrés S = 1 + 4 + 9 + 25 + ... A l'aide d'une boucle while, déterminer le nombre minimum de termes nécessaires pour que la somme S devienne supérieure ou égale à 1 000 000

Correction exercice 1

# un script possible. On évitera l'utilisation de la notation puissance ** (voir remarque à l'exercice 6 de la page sur les boucles for)

n = 1

while n <10000:

n = n*2

print(n)


# le même script qui affiche les puissances intermédiaires et qui permet donc de vérifier le code

n = 1

while n <10000:

print (n)

n = n*2

print('la solution est: ',n)


Correction exercice 2

# un script possible. On rappelle que l'instruction input renvoie une chaine de caractères qu'il convient de transformer en un entier pour pouvoir comparer sa valeur à 15.

i = 20

while i>15:

i = int(input('entrez un nombre entier inférieur ou égal à 15: '))



Correction exercice 3

# un script possible

mot='a'

while mot[len(mot)-1] != 'e':

mot=input('entrez un mot qui se termine par le lettre "e": ')

# une remarque cependant: ici la variable mot ne peut pas être vide car mot[len(mot)-1] génère un erreur si la longueur de mot est nulle

Correction exercice 4

# un script possible. La somme vaut 1 005 720 et elle compte 144 termes

S,i = 0,0

while S < 1000000:

i=i+1

S=S+i*i

print (S,i)


En conclusion

  • on utilise de préférence une boucle for lorsqu'on peut déterminer combien de fois la boucle doit se répéter

  • on utilise une boucle while lorsqu'il est difficile, voire impossible, de prévoir à l'avance combien de fois la boucle doit se répéter. Attention alors à ne pas créer une boucle infinie.