2.8 BOUCLES WHILE

 

 

INTRODUCTION

 

Nous avons déjà eu un premier contact avec les boucles au travers de la structure repeat qui permet de répéter un bloc d’instructions un nombre déterminé de fois. Il faut cependant savoir que cette structure repeat ne fait pas partie du langage Python standard mais constitue un ajout à l’environnement TigerJython dans un but purement pédagogique. Par contre, la boucle while est à disposition sur toutes les variantes de Python.

Une boucle while débute par le mot-clé while suivi d’une condition qui va contrôler la répétition. Les instructions contenues dans le bloc while sont répétées aussi longtemps que la  condition reste vérifiée. Une fois cette condition devenue fausse, la boucle s’interrompt et le programme continue normalement avec l’instruction qui suit directement le bloc d’instructions de la boucle.

CONCEPTS DE PROGRAMMATION: Itérations, structure while, combinaisons de conditions, conditions d’arrêt d’une boucle.

 

 

TOILE D’ARAIGNÉE

 

On aimerait que la tortue dessiner une spirale rectangulaire à l’aide d’une boucle while. On utilisera une variable a initialisée à la valeur 5 qui sera incrémentée de 2 à chaque itération (passage) de la boucle. Aussi longtemps que la condition a < 200 est vraie, les instructions dans le bloc de la boucle seront exécutées.

Pour que ce soit un peu plus marrant, on peut remplacer la tortue par une araignée en spécifiant une autre image lors de l’appel de la fonction makeTurtle().

 

 


from gturtle import *

makeTurtle("sprites/spider.png")

a = 5
while a < 200:
    forward(a)
    right(90)
    a = a + 2 
Sélectionner le code (Ctrl+C pour copier, Ctrl+V pour coller)

 

 

MEMENTO

 

Une boucle while est utilisée pour répéter un bloc de programme tant que la condition reste vraie. De ce fait, on pourrait la qualifier comme "condition d'execution". Si on néglige de changer la valeur de la variable contrôlant la condition (ici la variable a), la condition reste toujours vraie et le programme entre dans une boucle infinie sans jamais pouvoir en sortir.

Comme cette erreur arrive à tout le monde au début, il faut savoir que l’on peut arrêter un programme bloqué dans une boucle infinie avec le bouton stop ou en fermant la fenêtre de la tortue. En général, les boucles infinies sont dangereuses si l’on n’a aucune d’interrompre le programme. Dans les cas les plus extrêmes, il faut redémarrer l’ordinateur.

 

 

COMBINER DES CONDITIONS AVEC OR

 

On aimerait dessiner la figure ci-contre avec la tortue à l’aide d’une boucle while. Comme le montre la figure, on aimerait alterner le rouge et le vert. Pour ce faire, on peut choisir la couleur sur la base de la valeur de la variable de contrôle, en coloriant en rouge lorsque la variable i prend les valeurs 0, 2 et 4.

La fonction fillToPoint(0. 0) permet de remplir la figure en la dessinant. Cela se comporte comme si un ruban était attaché au point (0,0) à une extrémité et à la tortue à l’autre extrémité et que tous les points touchés par le ruban étaient coloriés.

 

 

from gturtle import *

def triangle():
    repeat 3: 
        forward(100) 
        right(120)
 
makeTurtle()
i = 0
while i < 6:
    if i == 0 or i == 2 or i == 4:
         setPenColor("red")
    else:
         setPenColor("green")     

    fillToPoint(0, 0)
    triangle()
    right(60)
    i = i + 1
Sélectionner le code (Ctrl+C pour copier, Ctrl+V pour coller)

 

 

MEMENTO

 

Il faut faire très attention à ce que les indentations des blocs soient correctement ajustées lorsque l’on utilise plusieurs structures de contrôle imbriquées (ici, le if à l’intérieur du while).

Comme on le voit dans le précédent programme, il est possible de combiner plusieurs conditions à l’aide de l’opérateur logique OU (or). Une telle condition est vraie si au moins une des conditions combinées est vraie.

La fonction fillToPoint(x, y) permet de colorier l’intérieur des formes dessinées par opposition à la fonction fill() permettant de colorier des figures fermées déjà existantes.

 

 

COMBINER DES CONDITIONS AVEC AND

 

On aimerait que la tortue dessine 10 maisons juxtaposées à l’aide d’une boucle while. Les maisons sont numérotées de 1 à 10. Les maisons 4 à 7 sont grandes et les autres petites. Dans la boucle while, la variable nr qui contrôle la boucle est utilisée pour déterminer la taille des maisons. Les maisons sont grandes si nr est supérieur à 3 et inférieur à 8.

On utilise la fonction fillToHorizontal(0) pour ajouter de la couleur à la surface comprise entre la ligne dessinée par la tortue (les toits) et la droite horizontale d’équation cartésienne y = 0.

 


from gturtle import *

makeTurtle()
setPos(-200, 30)
right(30)
fillToHorizontal(0)
setPenColor("sienna")

nr = 1
while nr <= 10:
    if nr > 3 and nr < 8:
        forward(60)
        right(120)
        forward(60)
        left(120)
    else:
        forward(30)
        right(120)
        forward(30)
        left(120)
  
    nr += 1
Sélectionner le code (Ctrl+C pour copier, Ctrl+V pour coller)

 

 

MEMENTO

 

On peut combiner plusieurs conditions à l’aide de l’opérateur logique and. Une telle combinaison de conditions est alors vraie si et seulement si toutes les conditions qui la composent sont vraies.

La fonction fillToHorizontal(y) permet de colorier la surface délimitée par la ligne dessinée par la tortue et la droite horizontale passant par les points d’ordonnée y.

L’expression nr += 1 est un raccourci pour nr = nr + 1, ce qui a pour effet d’augmenter la variable nr de 1. On dit que l’on incrémente la variable nr de 1.

 

 

INTERRUPTION DE BOUCLES AVEC BREAK

 

Une boucle dont la condition est toujours vraie va tourner à l’infini. Il est cependant possible d’interrompre l’exécution d’une boucle avec le mot-clé break.

Le programme suivant dessine des carrés de côtés croissants et tournés de 6° jusqu’à ce que la longueur du côté soit 120.


 


from gturtle import *

def square(sidelength):    
    repeat 4: 
        forward(sidelength) 
        left(90)

makeTurtle()
hideTurtle()

i = 0
while True:
    if i > 120:
        break
    square(i)
    right(6)
    i += 2
print("i =", i)
Sélectionner le code (Ctrl+C pour copier, Ctrl+V pour coller)

 

 

MEMENTO

 

La boucle procède en incrémentant la variable de contrôle i par pas de 2. On utilise le raccourci i += 2 au lieu d’écrire i = i + 2.

L’instruction python print permet d’écrire dans la console de TigerJython au bas de l’éditeur. Les chaines de caractères doivent être spécifiées entre guillemets doubles " et les nombres doivent être séparés par des virgules. Un espace sera automatiquement rajouté par print entre le texte et le nombre.Êtes-vous capables d’expliquer pourquoi le programme affiche i = 122 lorsqu’il sort de la boucle ?

Le mot-clé continue est rarement utilisé et permet d’interrompre l’exécution courante du bloc tout en reprenant une nouvelle itération après avoir vérifié la condition de la boucle.

 

 

VALIDATION DE SAISIE

 

Si l’on demande à l’utilisateur de saisir un nombre compris dans une certaine plage de valeurs, on ne doit pas avoir une confiance aveugle dans ses capacités ou sa volonté de bien se plier à nos exigences. Un programme robuste vérifie la validité des données saisies par l’utilisateur et traite les saisies incorrectes par un message adapté. Ce genre de validation est la plupart du temps effectué dans une boucle while interrompue uniquement lorsque la saisie utilisateur est acceptée. Dans le programme suivant, l’utilisateur doit entrer une des valeurs entières 1, 2 ou 3 afin de choisir la couleur rouge, verte ou jaune du disque plein.

from gturtle import *

makeTurtle()

n = 0
while n < 1 or n > 3:
    n = inputInt("Enter 1, 2 or 3")    
if n == 1:
    setPenColor("red")
elif n == 2:
    setPenColor("green")
else:
    setPenColor("yellow")    
dot(200)
Sélectionner le code (Ctrl+C pour copier, Ctrl+V pour coller)

 

 

EXERCICES

 

1.

La tortue avance sur un segment droit de longueur 5 puis tourne de 70° vers la droite. Ensuite, la longueur du segment est incrémentée de 0.5. Répéter ces étapes tant que la longueur du segment est inférieure à 150.

Tester ensuite le programme avec une rotation de 89° au lieu de 70°.
 

2.

Comme vous l’avez sans doute remarqué, l’angle de rotation au sommet d’une branche était de 144° pour l’étoile à 5 branches. Appliquez un petit changement à cet angle et augmentez le nombre de répétitions de la boucle. Vous obtiendrez alors une nouvelle figure

 

3.

La tortue dessine un motif en diagonale avec des disques remplis de rouge. Tous les disques sont situés à l’intérieur de la fenêtre, ce qui implique que la distance de chaque point au centre de la fenêtre est inférieure à 400.

Utiliser l’instruction dot(25) pour créer les disques.

 

4.

La tortue est initialement positionnée au point (250, 200). Elle avance en ligne droite par pas de 10 en direction du centre de la fenêtre (0,0) jusqu’à ce que la distance qui la sépare du centre soit inférieure à 1.

Utiliser les fonctions towards() et heading(degrees) (voir la documentation).

 

5*.

On veut modifier le programme de l’exercice précédent pour arrêter la tortue de manière plus précise sur le centre de l’écran (0,0). On réduit donc la condition d’arrêt (distance restante jusqu’au centre) d’un facteur 10 à 100. Il se peut étonnamment que pour certaines valeurs, la tortue ne s’arrête plus. Expliquer ce phénomène