Boucles for
A propos du chapitre
Objectif :
- Comprendre le principe d'une boucle for
- Utiliser une boucle for pour factoriser des instructions répétitives
- Utiliser une boucle for pour executer un nombre variable d'instructions
- Rénover la grange en lui ajoutant des fenêtres.
- Des dessins géométriques plus intéressants
TODO update visuel, ajouter des dessins géométriques

Modalités :
- Programmation (Basthon)
- De la réflexion autour du code
Prérequis : "Programmation/Variables"
Difficulté : moyen.
Remarque : Le code commence à être un peu plus touffu. Ne vous laissez pas démonter et demandez de l'aide si besoin !!!
remarque ? c'est OK si on va pas jusqu'au bout ?
Introduction : fenêtres ?
Activité : problème de rénovation
Vous avez désormais un projet de rénovation de votre grange, pour la transformer en maison.
La première étape pour la rendre habitable, c'est de lui créer des fenêtres.
Dans le dépliant ci-dessous, vous trouverez une version du code de la grange dans laquelle j'ai ajouté des fenêtres, avec uniquement les outils que je vous ai présenté en Python jusqu'à présent.
Code de la grange modifié
from turtle import *
speed(0)
largeur = 150
hauteur = 100
profondeur = 60
# On se déplace pour centrer la maison
left(180)
forward(largeur/2)
left(90)
forward(hauteur / 2 + profondeur / 2)
#on oublie pas de se réorienter correctement
left(90)
#face avant
fillcolor("hsl(33 42.5% 85.8%)")
color("hsl(33 42.5% 85.8%)")
begin_fill()
forward(largeur)
left(90)
forward(hauteur)
left(90)
forward(largeur)
left(90)
forward(hauteur)
end_fill()
#on se positionnne pour le dessus
penup()
left(180)
forward(hauteur)
right(90)
forward(40)
pendown()
#dessus
color("hsl(0 80.7% 63.5%)")
fillcolor("hsl(0 80.7% 63.5%)")
begin_fill()
forward(largeur - 40 * 2)
left(90)
forward(profondeur)
left(90)
forward(largeur - 40 * 2)
left(90)
forward(profondeur)
end_fill()
#pan gauche
color("hsl(0 80.4% 69.6%)")
fillcolor("hsl(0 80.4% 69.6%)")
begin_fill()
right(45)
forward(60)
right(135)
forward(profondeur)
right(45)
forward(60)
right(135)
forward(profondeur)
end_fill()
#on se positionne pour le pan droit
penup()
left(90)
forward(largeur - 40 * 2)
pendown()
#on dessine le pan droit
color("hsl(0 80.7% 56.8%)")
fillcolor("hsl(0 80.7% 56.8%)")
begin_fill()
right(45)
forward(60)
left(135)
forward(profondeur)
left(45)
forward(60)
left(135)
forward(profondeur)
end_fill()
#on se place pour la porte
penup()
left(90)
forward(40)
right(90)
forward(hauteur)
right(90)
forward(largeur - 20)
pendown()
#on trace la porte
color("hsl(14 67.8% 28.7%)")
fillcolor("hsl(14 67.8% 28.7%)")
begin_fill()
right(90)
forward(30)
right(90)
forward(40)
right(90)
forward(30)
right(90)
forward(40)
end_fill()
#on se place pour la fenêtre de gauche
penup()
forward(20)
right(90)
forward(50)
right(90)
forward(30)
pendown()
#fenêtre de gauche
color("hsl(191 39.5% 82.2%)")
fillcolor("hsl(191 39.5% 82.2%)")
begin_fill()
forward(30)
left(90)
forward(30)
left(90)
forward(30)
left(90)
forward(30)
left(90)
end_fill()
#on se place pour la fenêtre de droite
penup()
forward(largeur / 2 - 30 + largeur / 2)
left(180)
forward(30)
pendown()
#fenetre de droite
color("hsl(191 39.5% 82.2%)")
fillcolor("hsl(191 39.5% 82.2%)")
begin_fill()
forward(30)
right(90)
forward(30)
right(90)
forward(30)
right(90)
forward(30)
right(90)
end_fill()
hideturtle()
done()
Copiez-collez le dans Basthon, et exécutez-le. Vous devriez voir apparaître une jolie maison :

Les fenêtres sont aussi hautes que la porte : ce sont des portes fenêtres. Est-ce que c'est dangereux d'en mettre à l'étage ? Peut être... Est-ce que c'est stylé ? Sans aucun doute !
Modifiez la hauteur et la largeur pour trouver des valeurs qui posent problème. Pourquoi c'est un problème d'un point de vue du dessin paramétrique ?
Solution
Si on mets une largeur très grande ou une hauteur très grande, la façade fait "vide" : il n'y a que deux fenêtre isolées.

Si on mets une hauteur très petite, les fenêtre dépassent sur le toit :

C'est un problème parce que même si on peut changer automatiquement la taille de la maison, on va devoir ajouter les fenêtres à la main...
Idéalement, on voudrait pouvoir faire varier automatiquement le nombre de fenêtre avec la largeur et la hauteur de la façade.
Et ça tombe bien, il y a un outils super pour ça en Python : les boucles for.
Pro tip : s'écarter pour progresser
Il arrive qu'on remarque en cours de route qu'il nous manque une compétence pour atteindre un objectif complexe.
Il est souvent alors plus efficace de s'écarter temporairement de l'objectif pour acquérir cette compétence, puis de revenir sur l'objectif avec la compétence totalement ou partiellement acquise.
Ainsi, on peut se focaliser sur l'apprentissage sans avoir à gérer la complexité de l'objectif, et sans risquer de régresser en "cassant" quelque chose.
Voici deux illustrations :
En escalade, jeté me bloque dans une voie. Avant de travailler ce mouvement dans la voie, je travaille le mouvement au sol, ou sur des voies plus faciles . Ainsi, je m'entraîne d'abord sans me sur-fatiguer pour atteindre le jeté dans la voie, et sans peur de tomber.
En programmation, je dois apprendre les boucles for pour dessiner les fenêtres de la maison. Je travaille d'abord les boucles for a part. Ainsi, je ne suis pas perturbé par le reste du code de la maison, et je ne risque pas de casser le code de la maison.
Activité : mission possible
Voici un petit bout de code en Python qui comporte une :
Essayez de comprendre ce qu'il fait.
Une fois que vous pensez avoir compris, executez-le pour vérifier vos hypothèses.
Boucle for ?
Présente dans la majorité des langages de programmation, la boucle for permet de répéter un groupe de lignes de code, appelé corps de la boucle, un nombre déterminé de fois.
En Python, elle se présente comme suit :
Remarquez que le corps de la boucle est indenté (décalé) vers la droite.
Ca permet à l'interprêteur de différencier ce qui est dans la boucle et ce qui n'y est pas :
Activité : un avant dernier carré.
Utilisez une boucle for pour faire un carré.
Promis, c'est l"avant dernière fois que je vous fait dessiner un carré.
La dernière, ce sera dans le prochain chapitre, pour vous expliquer comment ne plus avoir à dessiner un carré.
Bravo ! vous avez factorisé le code : maintenant, dessiner les 4 côtés d'un carré prends seulement 2 lignes, répétées 4 fois. Ca va nous permettre de rendre le code beaucoup plus lisible !
Paramétriser les répétitions : n-gones
Et surtout, de dessiner des polygones avec PLEINS de côtés très facilement !
Activité : pentagone
Dessinez un pentagone régulier avec une boucle for
Les côtés d'un pentagone forment un angle de 108 degrés !
Activité : octogone
Dessinez un octogone régulier avec une boucle for1
Les côtés d'un octogone forment un angle de 135 dégrés !
Activité : dodécagone
Dessinez un dodécagone (12 cotés) régulier avec une boucle for
Les côtés d'un dodécagone forment un angle de 150 degrés !
Vous pouvez bien entendu utiliser une variable pour le nombre de répétitions :
Activité : n-gone !
**Dessinez un polygone régulier paramétrisé : **
Son nombre de côtés est une variable nombre_cotes
La longueur de ses côtés est une variable également.
L'angle formé par les côtés d'un polygone régulier à nombre_cotes côtés est donné par la formule suivante :
La démonstration de cette formule est dans l'extension Angles d'un polygone régulier, au cas où vous voudriez y jeter un oeil par curiosité.
Variable de boucle
Une boucle for fait partie des
jeux de mots avec boucle :
ca tourne en rond ca frise FAIRE UNE ACTIVITE appelée "CA FRISE" où il y aura pleins de boucles !
-> pro tip : travailler sur des projets a cote pour s'entraîner, puis revenir sur le projet général -> par la suite, introduire les boucles, et remarquer qu'on peut carrément raccourcir le code ! -> Puis utiliser boucles pour dessiner plusieurs fenêtres.
-> A l'intro du prochain chapitre (fonctions), proposer un défi difficile et une introspection sur comment on pense le code en isolation, puis introduire fonctions, paramètres etc.
Extensions
Angles d'un polygone régulier
TODO ajouter démo de pourquoi 180 - (360 / n)
Paréidolie
TODO ajouter activité sur le fait que la maison de l'intro ressemble un peu a un visage, et qu'on peut faire un même en faisant varier la hauteur ou la largeur de la maison (moi qui réussit l'exercice. Mon pote "prends pas la grosse tete" ma tete : ). Ptet renvoyer sur la DAO ? peut etre une remarque sur pourquoi la porte est décalée à gauche histoire d'éviter que ca ressemble trop a un dicateur allemand ?
-
N'est-ce pas hilarant de dessiner un octogone dans Basthon ? ↩