Éducation Nationale Française · Troisième
Programmer en blocs : boucles « répéter jusqu'à » et « Mes blocs »
I
Répéter un nombre de fois
Ce script dessine un carré : après son état initial, il prend huit blocs — quatre fois les deux mêmes. L'écrire avec moins de blocs, sans changer ce que dessine le lutin.
Le groupe « avancer de \(100\) pas, tourner \(\circlearrowright\) de \(90\) degrés » revient quatre fois : le bloc orange en forme de C « répéter 4 fois » l'enveloppe. Trois blocs écrits — le répéter et les deux blocs de son corps — au lieu de huit ; le lutin exécute toujours huit blocs de mouvement.
Définition — Le bloc répéter
Le bloc « répéter \(n\) fois » est une boucle, en forme de C : les blocs placés à l'intérieur du C — son corps — sont exécutés \(n\) fois de suite, un tour après l'autre ; puis le lutin continue avec le bloc placé sous le C. Un répéter dans un répéter s'exécute en entier à chaque tour du répéter extérieur, comme pour le robot sur papier. Méthode — Le motif répété
- Repérer le motif qui revient — un côté et un virage, une marche, un pétale — et compter les tours : ils se comptent sur papier, tour par tour.
- Vérifier la direction à la fin d'un tour : si le motif ne ramène pas le lutin dans sa direction de départ, le tour suivant part dans une autre direction — exprès ou non.
- Regarder ce qui vient après le C : il s'exécute une fois, après le dernier tour.
Méthode — Un polygone régulier
Pour dessiner un polygone régulier à \(n\) côtés (\(n\) entier, \(n \geqslant 3\)), le lutin répète \(n\) fois « avancer (d'un côté), tourner \(\circlearrowright\) de \(360 / n\) degrés ». - Pourquoi \(360 / n\) : à chaque sommet le lutin tourne de l'angle extérieur ; après \(n\) sommets il a fait un tour complet, \(360\) degrés, et regarde de nouveau dans sa direction de départ. Cet angle n'est pas, en général, l'angle intérieur du polygone : pour le carré, les deux valent \(90\), ce qui cache la différence ; pour le triangle équilatéral, l'angle intérieur vaut \(60\) et le lutin tourne de \(120\).
- Vérifier : \(n\) fois \(360 / n\) fait \(360\) — le lutin regarde de nouveau dans sa direction de départ ; et, comme les \(n\) côtés sont égaux, ainsi que les \(n\) virages, le dessin se referme sur son point de départ.
Exemple
Que dessinent ces deux scripts ?
À gauche : \(3\) tours de « \(100\) pas, tourner \(\circlearrowleft\) de \(120\) » : \(360 / 3 = 120\), un triangle équilatéral de côté \(100\), dessiné vers le haut puisque les virages sont à gauche. À droite : \(6\) tours de « \(50\) pas, tourner \(\circlearrowleft\) de \(60\) » : \(360 / 6 = 60\), un hexagone régulier de côté \(50\). Dans les deux, le lutin finit à son point de départ, en regardant vers la droite.
Exemple
Que dessine ce script ? Où est le lutin à la fin ?
Chaque tour du répéter extérieur : un carré de côté \(60\) (quatre fois « \(60\) pas, tourner \(\circlearrowleft\) de \(90\) », retour au coin, tourné vers la droite), puis un saut de \(90\) pas stylo levé. Trois tours : trois carrés à la suite, espacés de \(30\) pas — une frise. Le lutin finit \(90\) pas après le coin de départ du troisième carré, en \((70 ; 30)\), en regardant vers la droite.
Exemple
Ce script dessine un rectangle. Comment le modifier pour qu'il dessine un carré de côté \(120\), en partant toujours de \((-80 ; -30)\) ?
Le rectangle est « grand côté, virage, petit côté, virage » deux fois : \(160\) sur \(60\). Un carré a quatre côtés égaux : remplacer les deux « avancer » par « avancer de \(120\) pas » — ou, plus simple, garder un seul « avancer de \(120\) » et un virage, et répéter \(4\) fois. Deux paramètres changés, ou un motif raccourci : deux scripts justes pour le même dessin.
Le carré à trois côtés
« répéter 3 fois » avec « avancer, tourner \(\circlearrowright\) de \(90\) » depuis la direction \(90\) dessine trois côtés et laisse le lutin regarder vers le haut, pas dans sa direction de départ : le carré est ouvert. « répéter 5 fois » dessine le premier côté deux fois. Et « tourner de \(90\) » ne dessine aucun triangle équilatéral : son angle extérieur est \(120\). Le nombre de tours et l'angle se lisent ensemble — \(n\) tours de \(360 / n\).
Compétences à pratiquer
- Quelle figure ?
- Remplir les ovales
- Modifier un script
- Écrire avec un répéter
II
Si… alors… sinon
Ce script doit dire « plus grand que 10 » quand le nombre tapé est plus grand que \(10\), et « 10 ou moins » sinon. Tel quel, il dit « plus grand que 10 » quoi que tape l'utilisateur.
Avec les blocs vus jusqu'ici, le lutin peut-il dire deux choses différentes selon le nombre ? Que manque-t-il ?
Non : les blocs vus jusqu'ici s'exécutent tous, toujours, de haut en bas. Ce qui manque est un bloc qui choisit : le « si … alors … sinon » orange, avec dedans un bloc hexagonal vert — « réponse \(>\) 10 » — qui est vrai ou faux.
Pour \(7\), « \(7 > 10\) » est faux : le lutin dit « 10 ou moins ». Pour \(15\), c'est vrai : « plus grand que 10 ». Pour \(10\) exactement, « \(10 > 10\) » est faux : « 10 ou moins » — la frontière est dans la branche « sinon ».
Définition — Une condition
Une condition est un bloc vert hexagonal qui est soit vrai, soit faux : « ( ) \(<\) ( ) », « ( ) \(>\) ( ) », « ( ) \(=\) ( ) ». Sa valeur est calculée au moment où elle est testée, avec ce que contiennent alors les trous — pour « réponse \(>\) 10 », avec la dernière saisie. Un bloc hexagonal n'entre que dans un trou hexagonal, comme celui d'un « si ».Il n'y a pas de bloc « \(\leqslant\) » : « 10 ou moins » est le « sinon » de « \(>\) 10 ».
Définition — Si… alors, si… alors… sinon
- « si … alors » a une branche : quand la condition est vraie, les blocs dans le C sont exécutés ; quand elle est fausse, il ne se passe rien, et le script continue sous le C.
- « si … alors … sinon » a deux branches : les blocs de la première quand la condition est vraie, les blocs après « sinon » quand elle est fausse. Exactement une des deux branches est exécutée, jamais les deux, jamais aucune.
Méthode — La garde
Pour écrire ou lire un « si », la condition se traite comme une garde à une porte : - Écrire la condition en bloc hexagonal, avec ce qui est comparé de chaque côté : « réponse \(>\) 10 ».
- Dire ce qui se passe quand elle est vraie, et quand elle est fausse — le second cas compris : avec une seule branche, « faux » veut dire « rien ».
- Tester avec trois valeurs : une de chaque branche et la valeur frontière. Pour « \(>\) 10 » : \(7\), \(15\) et \(10\) — la frontière montre de quel côté tombe le cas d'égalité.
Exemple
Que dit le lutin si l'utilisateur tape « sésame » ? Et « Sésame » ? Et « ouvre » ?
« = » compare aussi des textes. « sésame » est égal au texte du bloc : « Bienvenue ! ». « ouvre » ne l'est pas : « Mauvais mot de passe ». Pour « Sésame », Scratch ignore la différence entre majuscules et minuscules : « Bienvenue ! » aussi. Une condition n'a pas besoin de nombre.
Exemple
Que dit le lutin pour \(8\), \(10\), \(12\), \(15\) et \(18\) ?
Un « si … sinon » dans le « sinon » d'un autre donne trois cas. \(8\) : « \(8 < 10\) » vrai, « Il faut travailler ». \(10\) : « \(10 < 10\) » faux, puis « \(10 < 15\) » vrai, « Bien » — la frontière \(10\) tombe dans la branche du milieu. \(12\) : faux, puis « \(12 < 15\) » vrai, « Bien ». \(15\) : « \(15 < 10\) » faux, « \(15 < 15\) » faux, « Très bien » — la frontière \(15\) tombe dans la dernière branche. \(18\) : « Très bien ». Trois cas, deux conditions, et les deux frontières \(10\) et \(15\) vérifiées exprès.
Définition — Modulo
Le bloc vert « ( ) modulo ( ) » donne le reste de la division d'un nombre entier par un entier autre que \(0\) : « 17 modulo 5 » vaut \(2\), puisque \(17 = 3 \times 5 + 2\). Un entier est pair quand son reste par \(2\) est \(0\), impair quand il est \(1\) : la condition « ( réponse modulo 2 ) \(=\) 0 » est vraie exactement pour les nombres pairs — à condition que la saisie soit un entier.
Exemple
Que dit le lutin pour \(14\), \(27\) et \(0\) ?
« 14 modulo 2 » vaut \(0\) : « pair ». « 27 modulo 2 » vaut \(1\) : la condition est fausse, « impair ». « 0 modulo 2 » vaut \(0\) : « pair » — zéro est pair. Le bloc intérieur est calculé d'abord, puis comparé à \(0\).
D'autres événements, et une boucle sans fin
Jusqu'ici, un script démarre au drapeau, et chaque « si » est testé une seule fois, quand le script y arrive. Un jeu doit réagir aux touches du clavier et surveiller le bord de la scène sans arrêt : il lui faut d'autres événements que le drapeau, et une boucle qui ne s'arrête pas.
Définition — Un événement de plus : une touche
Le bloc chapeau « quand la touche [flèche droite] est pressée » lance son script à chaque fois que cette touche est pressée — comme le drapeau lance un script quand on clique dessus. « ajouter 10 à x » ajoute \(10\) au \(x\) du lutin : avec ces deux scripts, chaque appui déplace le lutin de \(10\) pas vers la droite ou vers la gauche. Un lutin peut porter plusieurs scripts, chacun attendant son propre événement.
Définition — Répéter indéfiniment et un capteur
Le bloc C orange « répéter indéfiniment » n'a pas de nombre de tours : ses blocs sont exécutés tour après tour jusqu'au clic sur le signe stop. Rien ne peut être placé sous lui.Un capteur est un bloc hexagonal de la catégorie Capteurs dont la valeur vient de la scène : « touche le bord ? » est vrai quand le lutin touche un bord de la scène. Placé dans un « si » à l'intérieur d'un « répéter indéfiniment », il est testé à chaque tour — un « si » écrit une fois, hors de toute boucle, est testé une fois, au moment où le script y arrive.
Méthode — Le bord
Pour faire bouger le lutin sans qu'il quitte la scène : - L'état initial : aller à un point, s'orienter — comme pour tout script qui bouge.
- « répéter indéfiniment » : dedans, « avancer de 10 pas » — un petit pas par tour.
- La garde, dans la boucle : « si touche le bord ? alors rebondir si le bord est atteint » — le bloc rebondir retourne le lutin (la direction \(90\) devient \(-90\)), si bien que le tour suivant l'éloigne du bord.
Exemple
Le lutin porte ces quatre scripts et part de \((0 ; 0)\). L'utilisateur appuie trois fois sur la flèche droite, deux fois sur la flèche haut, puis une fois sur la flèche gauche. Où est le lutin ?
Chaque appui exécute une fois le script correspondant. Droite trois fois : \(x = 30\). Haut deux fois : \(y = 20\). Gauche une fois : \(x = 30 - 10 = 20\). Le lutin est en \((20 ; 20)\) ; sa direction n'a pas changé, puisque « ajouter à x » déplace sans tourner.
Exemple
Suivre le lutin comme un point pendant les six premiers tours de la boucle. Où est-il, et dans quelle direction regarde-t-il, après le tour \(6\) ?
| tour | après « avancer » | touche le bord ? | direction |
| 1 | \((210 ; 0)\) | faux | \(90\) |
| 2 | \((220 ; 0)\) | faux | \(90\) |
| 3 | \((230 ; 0)\) | faux | \(90\) |
| 4 | \((240 ; 0)\) | vrai : rebondit | \(-90\) |
| 5 | \((230 ; 0)\) | faux | \(-90\) |
| 6 | \((220 ; 0)\) | faux | \(-90\) |
Trois rôles, et trois pièges
Le chapeau déclenche le script, la boucle répète ses blocs, la condition teste — trois blocs différents pour trois tâches différentes.
- Un « si » sans « sinon » ne fait rien quand la condition est fausse : si le lutin doit toujours répondre, il faut deux branches.
- Un « si touche le bord ? » placé hors de toute boucle est testé une fois, au départ, quand le lutin est loin du bord : le lutin ne rebondit jamais.
- « réponse \(=\) 12 » est vrai pour la saisie « 12 » : ce qui est tapé est comparé comme un nombre quand les deux membres sont des nombres, comme un texte sinon.
Compétences à pratiquer
- Lire une condition
- Prévoir ce que dit le lutin
- Pair ou impair
- Écrire une condition
- Touches et bords
III
Une variable
Dix fois, le lutin demande un nombre entier et dit s'il est pair ou impair. À la fin, il doit aussi dire combien de nombres pairs ont été tapés. Pourquoi « réponse » ne peut-elle pas le faire ?
« réponse » contient une seule chose : la dernière saisie. Compter demande une mémoire qui garde un total d'un tour à l'autre et grandit de \(1\) à chaque nombre pair : une variable, appelée ici « pairs ». Elle est mise à \(0\) avant la boucle, augmentée de \(1\) dans le « si », et dite à la fin.
Définition — Une variable
Une variable est une boîte avec un nom, qui contient une valeur — un nombre ou un texte. « réponse » en est une, remplie par « demander » ; les autres se créent dans la catégorie « Variables ». Trois blocs se servent de celles-ci : - « mettre [total] à 0 » met une valeur dans la boîte, quel que soit son contenu précédent ;
- « ajouter 1 à [total] » ajoute \(1\) à ce que contient la boîte (avec un nombre négatif, il soustrait) ; le trou peut recevoir « réponse » ou une formule ;
- le bloc rond (total) lit la valeur, et entre dans tout trou rond : « dire (total) », « avancer de (total) pas ».
Définition — Nombre aléatoire
Le bloc vert « nombre aléatoire entre 1 et 6 » donne un entier de \(1\) à \(6\), bornes comprises, chacun des six aussi probable que les autres : un dé équilibré. À chaque évaluation du bloc, un nouveau tirage est fait : deux blocs de ce type dans le même tour peuvent donner deux valeurs différentes. Pour utiliser un tirage deux fois — le tester, puis le dire — on le range d'abord dans une variable : « mettre [dé] à (nombre aléatoire entre 1 et 6) ».
Méthode — Le compteur
Pour compter combien de fois quelque chose arrive pendant une boucle : - Avant la boucle : « mettre [compteur] à 0 » — jamais dedans, sinon le compte repart à chaque tour.
- Dans la boucle, sous la condition : « ajouter 1 à [compteur] » dans le « si » qui reconnaît la chose à compter. Sans condition, le compteur compte les tours.
- Après la boucle : lire le compteur — « dire (compteur) ».
Méthode — L'accumulateur
Pour additionner des valeurs qui arrivent une à une : - « mettre [total] à 0 » avant la boucle.
- À chaque tour : obtenir la valeur — « demander … et attendre » — puis « ajouter (réponse) à [total] » : le total grandit de la valeur, pas de \(1\).
- Après la boucle : « dire (total) ».
Méthode — Le tableau d'états
Pour suivre un script avec une variable, un tableau remplace le tableau des positions du niveau précédent : - Une colonne par variable, plus « tour », « bloc » et « dit ». La première ligne est l'état initial, après les blocs « mettre ».
- Une ligne par bloc qui change quelque chose — un « mettre », un « ajouter », un « dire » — avec la nouvelle valeur de la variable.
- Pour un script aléatoire, le tableau se remplit sur une suite de tirages donnée (« le dé donne 3, 6, 6, 1 … »). Ce que fait chaque tour se prévoit ; le total final d'une vraie exécution, non — il peut changer d'une exécution à l'autre.
Exemple
Que dit le lutin ? Remplir le tableau d'états.
| tour | bloc | n | dit |
| – | mettre n à 0 | \(0\) | |
| 1 | ajouter 1 à n | \(1\) | |
| 2 | ajouter 1 à n | \(2\) | |
| 3 | ajouter 1 à n | \(3\) | |
| 4 | ajouter 1 à n | \(4\) | |
| 5 | ajouter 1 à n | \(5\) | |
| – | dire (n) | \(5\) | « 5 » |
Exemple
L'utilisateur tape \(4\), puis \(9\), puis \(12\). Que dit le lutin ?
| tour | réponse | bloc | total |
| – | mettre total à 0 | \(0\) | |
| 1 | \(4\) | ajouter (réponse) à total | \(4\) |
| 2 | \(9\) | ajouter (réponse) à total | \(13\) |
| 3 | \(12\) | ajouter (réponse) à total | \(25\) |
Exemple
Le dé donne, dans l'ordre, \(3\), \(6\), \(6\), \(1\), \(5\), \(6\), \(2\), \(4\), \(6\), \(3\). Que dit le lutin ?
| tour | dé | dé \(=\) 6 ? | six |
| – | \(0\) | ||
| 1 | \(3\) | faux | \(0\) |
| 2 | \(6\) | vrai | \(1\) |
| 3 | \(6\) | vrai | \(2\) |
| 4 | \(1\) | faux | \(2\) |
| 5 | \(5\) | faux | \(2\) |
| 6 | \(6\) | vrai | \(3\) |
| 7 | \(2\) | faux | \(3\) |
| 8 | \(4\) | faux | \(3\) |
| 9 | \(6\) | vrai | \(4\) |
| 10 | \(3\) | faux | \(4\) |
Exemple
Le dé donne \(4\), \(2\), \(6\) et le joueur répond \(4\), \(5\), \(6\). Que dit le lutin à la fin ?
Tour \(1\) : dé \(4\), réponse \(4\), égaux : score \(1\). Tour \(2\) : dé \(2\), réponse \(5\) : le score reste \(1\). Tour \(3\) : dé \(6\), réponse \(6\) : score \(2\). Le lutin dit « Score : 2 ». Le tirage est d'abord rangé dans « dé », pour que la même valeur soit comparée à la réponse.
Exemple
Une variable dans un tracé. Que dessine ce script ? Donner la longueur de chaque côté et la position finale du lutin.
« longueur » part de \(10\) et grandit de \(10\) après chaque côté : les côtés mesurent \(10\), \(20\), \(30\), …, \(80\). Avec un virage à droite après chacun, le lutin dessine une spirale carrée : \((10 ; 0)\), \((10 ; -20)\), \((-20 ; -20)\), \((-20 ; 20)\), \((30 ; 20)\), \((30 ; -40)\), \((-40 ; -40)\), \((-40 ; 40)\). Après huit quarts de tour il regarde de nouveau vers la droite.
Exemple
Dans le script de la spirale, « mettre [longueur] à 10 » est remplacé par « ajouter 10 à [longueur] ». La variable vient d'être créée (elle vaut \(0\)). Qu'est-ce qui change quand on clique deux fois de suite sur le drapeau ?
La variable n'est plus remise à \(10\). À la fin de la première exécution, « longueur » vaut \(90\) ; la seconde commence par ajouter \(10\) : son premier côté mesure \(100\), et la spirale n'est plus la même. « mettre » donne un départ neuf, « ajouter » construit sur ce qui est là — une variable qu'on ne règle jamais garde la valeur de l'exécution précédente, exactement comme la position du lutin au niveau précédent.
Trois pièges de la variable
- Non initialisée : un compteur sans « mettre … à 0 » continue depuis la dernière exécution.
- « mettre » au lieu d'« ajouter » : « mettre [total] à (réponse) » oublie les valeurs précédentes — le total est la dernière saisie, pas la somme.
- Le hasard tiré deux fois : « si (nombre aléatoire entre 1 et 6) \(=\) 6 alors dire (nombre aléatoire entre 1 et 6) » teste un tirage et en dit un autre. Ranger le tirage dans une variable.
Compétences à pratiquer
- Lire une variable
- Suivre un script
- Tirages sur une suite donnée
- Écrire avec une variable
- Modifier un script
IV
Répéter jusqu'à
Le lutin tire un nombre secret de \(1\) à \(20\) et le joueur doit le trouver. Avec un « répéter 5 fois », le jeu demande cinq fois quoi qu'il arrive : quand le joueur trouve le nombre au deuxième essai, le lutin demande encore trois fois ; quand le joueur n'a pas trouvé après cinq essais, le jeu s'arrête quand même.
Combien de tours la boucle devrait-elle avoir ? De quelle sorte de boucle a-t-on besoin ?
Personne ne le sait d'avance : cela dépend du joueur. La boucle doit s'arrêter quand le nombre est trouvé, quel que soit le nombre de tours — un, ou trente. C'est un bloc nouveau : « répéter jusqu'à réponse \(=\) secret ». Sa condition n'est pas un nombre de tours mais une condition d'arrêt, testée avant chaque tour.
La première question est posée avant la boucle : le test « réponse \(=\) secret » se fait avant le premier tour, et il doit porter sur une vraie proposition du joueur. Au clic sur le drapeau, Scratch vide « réponse » ; mais dans une deuxième partie, ou si le script est relancé autrement, « réponse » contient encore la dernière proposition, qui pourrait arrêter la boucle avant que le joueur ait joué.
Définition — Répéter jusqu'à
Le bloc C orange « répéter jusqu'à - Si elle est déjà vraie quand le script arrive à la boucle, la boucle fait zéro tour.
- Si elle ne devient jamais vraie, la boucle ne finit jamais : « répéter indéfiniment » est un « répéter jusqu'à » dont la condition n'arrive jamais.
Définition — Ce qui doit changer
L'arrêt vient de quelque chose qui change pendant la boucle : une variable que le corps modifie (« ajouter 1 à [n] »), une saisie (« demander » dans la boucle), ou ce que voit un capteur (le lutin avance vers le bord). Si la condition est fausse au départ et que rien de ce qu'elle regarde ne change, la boucle ne finit jamais. Modifier une variable ne suffit pas non plus : la condition doit finir par devenir vraie — « jusqu'à n \(=\) 10 » avec des pas de \(3\) depuis \(0\) passe par \(9\), puis \(12\), et ne s'arrête jamais. Méthode — Jusqu'à
Pour lire ou écrire un « répéter jusqu'à » : - Écrire la condition d'arrêt — ce qui doit être vrai pour que la boucle s'arrête.
- Dire ce qui change à chaque tour et finit par la rendre vraie.
- Remplir le tableau d'états avec une colonne « arrêt ? », testée avant chaque tour : la ligne où elle devient vraie est la sortie, et le nombre de tours est le nombre de lignes où elle était fausse.
Méthode — La sentinelle
Pour prendre des saisies jusqu'à ce qu'un mot convenu — la sentinelle — soit tapé : - Un premier « demander » avant la boucle : le test d'arrêt, fait avant le premier tour, porte ainsi sur une vraie saisie — sans elle, il porterait sur une « réponse » vide (au drapeau) ou sur une saisie ancienne, qui pourrait faire sauter la boucle.
- « répéter jusqu'à réponse \(=\) stop », avec dedans : traiter la saisie (la compter, l'ajouter), puis redemander.
- Après la boucle : dire le résultat. La sentinelle elle-même n'est pas comptée : elle est testée avant le tour qui la compterait.
Exemple
Dans le script de la définition « Répéter jusqu'à » (« mettre [n] à 0 », « répéter jusqu'à n \(=\) 10 », « ajouter 1 à [n] »), combien de tours la boucle fait-elle, et que dit le lutin ? Remplir le tableau d'états. | avant le tour | n | n \(=\) 10 ? | action |
| 1 | \(0\) | faux | n \(\leftarrow\) 1 |
| 2 | \(1\) | faux | n \(\leftarrow\) 2 |
| … | … | faux | … |
| 10 | \(9\) | faux | n \(\leftarrow\) 10 |
| 11 | \(10\) | vrai | sortie |
Exemple
Deux variantes de la même boucle. Que fait chacune ?
À gauche : « n » vaut déjà \(10\) quand la boucle est atteinte, la condition est vraie au premier test : zéro tour, le lutin dit « 10 » tout de suite. À droite : « n » prend les valeurs \(3\), \(6\), \(9\), \(12\), \(15\), … et n'est jamais égal à \(10\) : la condition ne devient jamais vraie, la boucle ne finit jamais, et le « dire » n'est jamais atteint. Une condition d'arrêt doit être atteignable.
Exemple
Le lutin est suivi comme un point. Que dit-il à la fin ?
Ici ce qui change n'est pas une variable mais la position : chaque tour rapproche le lutin de \(20\) pas du bord droit, \(x = 240\). Après \(12\) tours, \(x = 240\) : « touche le bord ? » devient vrai et la boucle s'arrête. Le compteur dit « 12 ». À l'écran, le costume touche le bord plus tôt — avec le chat, dès le dixième tour ; sur papier, le lutin est un point.
Exemple
Le reste par soustractions. L'utilisateur tape \(47\), puis \(6\). Remplir le tableau d'états et donner ce que dit le lutin.
La première saisie est gardée dans « a » ; la seconde reste dans « réponse » (\(6\)). « ajouter \(0 - 6\) à [a] » retire \(6\) à chaque tour, jusqu'à ce que « a \(<\) 6 » soit vrai.
Sept soustractions : \(47 = 7 \times 6 + 5\). Le lutin dit « Reste : 5 ». Avec \(a = 0\) et \(b = 6\), « \(0 < 6\) » est vrai tout de suite : zéro tour, reste \(0\) — correct. Avec \(b = 0\), « a \(<\) 0 » n'est jamais vrai : la boucle ne finit jamais. C'est pourquoi le script demande des entiers plus grands que \(0\).
| avant le tour | a | a \(<\) 6 ? |
| 1 | \(47\) | faux |
| 2 | \(41\) | faux |
| 3 | \(35\) | faux |
| 4 | \(29\) | faux |
| 5 | \(23\) | faux |
| 6 | \(17\) | faux |
| 7 | \(11\) | faux |
| 8 | \(5\) | vrai : sortie |
Jusqu'à n'est pas tant que
- « répéter jusqu'à » s'arrête quand sa condition est vraie. D'autres langages utilisent « tant que », qui continue tant que sa condition est vraie : « jusqu'à n \(=\) 10 » est « tant que non (n \(=\) 10) ». En Python, cette boucle s'écrit « while », « tant que ».
- Une condition jamais atteinte — « jusqu'à n \(=\) 10 » avec des pas de \(3\) — est le bug le plus courant de cette boucle : le script semble figé.
- Le plus grand diviseur commun par soustractions, qui change deux variables tour à tour, attend la section suivante.
Compétences à pratiquer
- Lire un jusqu'à
- Compter les tours
- Restes par soustractions
- Écrire avec un jusqu'à
V
Plusieurs variables et conditions composées
Le jeu de la section précédente demande jusqu'à ce que le nombre soit trouvé. On veut maintenant au plus cinq essais : le jeu s'arrête quand le nombre est trouvé, ou quand le cinquième essai a été joué. Le bloc « répéter jusqu'à » n'a qu'un trou hexagonal : comment y mettre deux conditions ? Que faut-il compter ?
Il faut compter les essais : une deuxième variable, « essais », qui part de \(1\) avec la première question et augmente de \(1\) à chaque nouvelle question. Les deux conditions d'arrêt se relient par un bloc « ou », qui en fait une seule condition hexagonale : « répéter jusqu'à (réponse \(=\) secret) ou (essais \(=\) 5) » Après la boucle, un « si » dit laquelle des deux a arrêté le jeu : trouvé, ou plus d'essais.
Définition — Et, ou, non
Une condition composée est faite de conditions reliées par « et » ou « ou », ou retournée par « non ». Trois blocs hexagonaux verts les construisent : - « et » est vrai quand les deux le sont, faux dès que l'une est fausse ;
- « ou » est vrai dès qu'au moins une l'est — les deux vraies comprises ; faux seulement quand les deux sont fausses ;
- « non » est vrai quand a est fausse, et faux quand a est vraie.
Définition — L'état suivi
Un script peut utiliser plusieurs variables : deux boîtes, deux noms, deux colonnes dans le tableau. L'état suivi d'un script à un instant donné est la valeur de chaque variable que l'on suit — et la position, la direction ou « réponse » quand le script en dépend. Deux variables se règlent séparément, chacune avec son « mettre » ; en oublier une est l'erreur habituelle. Méthode — Le tableau à plusieurs colonnes
- Une colonne par variable, dans l'ordre de leurs blocs « mettre » ; la première ligne est l'état après les blocs « mettre ».
- Une ligne par tour, avec la valeur de chaque variable après le tour — une variable qui n'a pas changé est recopiée.
- La condition composée dans sa propre colonne, écrite morceau par morceau : « a \(>\) b ? », puis le « et » ou le « ou ».
Méthode — Le plus grand
Pour déterminer le plus grand de plusieurs nombres saisis : - « mettre [max] à (réponse) » après le premier « demander » : le premier nombre saisi est le plus grand pour l'instant — pas \(0\), qui resterait le plus grand si toutes les saisies étaient négatives.
- À chaque saisie suivante : « si réponse \(>\) max alors mettre [max] à (réponse) » — « max » ne fait que monter.
- Après la boucle : dire « max ». Pour le plus petit, retourner la condition.
Exemple
L'utilisateur tape \(12\), \(7\), \(15\) dans le script de la méthode « Le plus grand ». Remplir le tableau et donner ce que dit le lutin. Que se passerait-il avec « mettre [max] à 0 » et les saisies \(-3\), \(-8\), \(-1\) ? | tour | réponse | réponse \(>\) max ? | max |
| – | \(12\) | \(12\) | |
| 1 | \(7\) | faux | \(12\) |
| 2 | \(15\) | vrai | \(15\) |
Exemple
Le plus grand diviseur commun par soustractions : à chaque tour, le plus grand des deux nombres perd le plus petit ; quand ils sont égaux, cette valeur est le PGCD. Remplir le tableau à deux colonnes et donner ce que dit le lutin.
| avant le tour | a | b | a \(=\) b ? | action |
| 1 | \(84\) | \(36\) | faux | a \(\leftarrow 84 - 36\) |
| 2 | \(48\) | \(36\) | faux | a \(\leftarrow 48 - 36\) |
| 3 | \(12\) | \(36\) | faux | b \(\leftarrow 36 - 12\) |
| 4 | \(12\) | \(24\) | faux | b \(\leftarrow 24 - 12\) |
| 5 | \(12\) | \(12\) | vrai | sortie |
Exemple
Un mot de passe à trois essais. Que dit le lutin si l'utilisateur tape « a », « b », « sésame » ? Et « a », « b », « c » ?
Deux choses peuvent arrêter la boucle : le bon mot, ou le troisième essai — un « ou ».
Premier cas : la boucle s'arrête au troisième test parce que le mot est bon (et, il se trouve, essais vaut \(3\) aussi) ; le « si » après la boucle dit « Bienvenue ! ». Second cas : au troisième test le mot est faux mais essais \(= 3\) : la boucle s'arrête quand même, et le « si » dit « Bloqué. ». Le premier « demander » avant la boucle fait compter le premier essai.
| avant le tour | réponse | essais | bon ou 3 ? |
| 1 | « a » | \(1\) | faux ou faux : faux |
| 2 | « b » | \(2\) | faux ou faux : faux |
| 3 | « sésame » | \(3\) | vrai ou vrai : vrai |
Exemple
Score et vies. Le dé donne \(2\), \(5\), \(1\), \(6\), \(3\) et le joueur répond \(2\), \(3\), \(4\), \(6\), \(1\). Remplir le tableau et donner ce que dit le lutin.
| tour | dé | réponse | score | vies | vies \(=\) 0 ou score \(=\) 10 ? |
| – | \(0\) | \(3\) | faux | ||
| 1 | \(2\) | \(2\) | \(1\) | \(3\) | faux |
| 2 | \(5\) | \(3\) | \(1\) | \(2\) | faux |
| 3 | \(1\) | \(4\) | \(1\) | \(1\) | faux |
| 4 | \(6\) | \(6\) | \(2\) | \(1\) | faux |
| 5 | \(3\) | \(1\) | \(2\) | \(0\) | vrai : sortie |
Trois pièges des conditions composées
- « ou » est inclusif : « bon mot ou troisième essai » est vrai quand les deux arrivent en même temps.
- « non (a et b) » n'est pas « non a et non b » : « non (réponse \(>\) 0 et réponse \(<\) 7) » est vrai pour \(0\) et pour \(9\) ; « réponse \(\leqslant\) 0 et réponse \(\geqslant\) 7 » n'est jamais vrai : « non (a et b) » est « non a ou non b », ici « réponse \(\leqslant\) 0 ou réponse \(\geqslant\) 7 ».
- Deux variables, deux blocs « mettre » : un script qui règle « score » et oublie « vies » commence avec les vies de la partie précédente.
Compétences à pratiquer
- Évaluer une condition composée
- Suivre deux variables
- Écrire avec deux variables
VI
Mes blocs
Une frise avec un triangle, un carré et un pentagone de côté \(40\) : le même « répéter » est écrit trois fois, avec deux nombres qui changent.
Comment écrire le polygone une seule fois, et l'utiliser trois fois avec des valeurs différentes ?
En définissant un bloc à soi, « polygone », avec deux paramètres, « n » et « côté » : la définition contient le « répéter » une seule fois, et le script principal l'appelle trois fois avec les valeurs \(3\), \(4\), \(5\) et \(40\).
Le bloc « saut » se définit de la même façon (voir plus bas). Le script principal se lit maintenant comme la description du dessin. « côté » ne change pas dans cette frise ; en faire un paramètre permet de réutiliser le bloc pour d'autres tailles.
Définition — Un bloc personnalisé
Dans la catégorie « Mes blocs », « Créer un bloc » crée un bloc personnalisé : un bloc nouveau, avec un nom et, si l'on veut, des paramètres. Deux éléments apparaissent : - la définition, un script sous le chapeau « définir polygone (n) (côté) » : les ovales roses « n » et « côté » sont les entrées du bloc, et ils s'utilisent dans la définition comme des variables ;
- l'appel, un bloc rose « polygone 6 40 » placé dans n'importe quel script : son exécution lance la définition avec \(n = 6\) et côté \(= 40\), puis le script continue sous l'appel.
Définition — Avec ou sans paramètre
Un bloc personnalisé peut n'avoir aucun paramètre : « saut » avec « avancer de 70 pas » dedans saute toujours de \(70\). Son effet peut quand même varier d'un appel à l'autre — par une variable, un capteur ou un bloc aléatoire qu'il utilise. Les paramètres servent à autre chose : appeler le même bloc avec des valeurs différentes dans le même script, « saut 70 » puis « saut 30 ».
Méthode — Décomposer
Pour structurer un programme avec des blocs personnalisés : - Repérer ce qui revient — un sous-dessin, un sous-calcul, un déplacement — même avec des nombres différents.
- En faire un bloc, avec pour paramètres ce qui change d'un appel à l'autre — ou changera quand le bloc servira ailleurs ; ce qui ne change jamais reste écrit dans la définition.
- Réécrire le script principal en appels : il devient court, et se lit comme la liste des étapes du dessin.
Exemple
La rosace. Avec le bloc « polygone » défini plus haut, que dessine ce script ? Combien de blocs « avancer » sont exécutés, et dans quelle direction le lutin regarde-t-il à la fin ?
Chaque appel dessine un hexagone régulier de côté \(40\) depuis le centre et y ramène le lutin dans sa direction de départ ; puis « tourner \(\circlearrowright\) de 30 » tourne l'hexagone suivant : douze hexagones autour du centre, \(12 \times 30 = 360\) — une rosace. Chaque hexagone exécute \(6\) blocs « avancer » : \(12 \times 6 = 72\). À la fin le lutin a tourné de \(360\) degrés : il regarde vers la droite, comme au départ.
Exemple
Un bloc dans un bloc. Que dessine « maison 80 », depuis \((-40 ; -60)\) ?
« maison » appelle « carré », puis monte d'un côté jusqu'au coin en haut à gauche (tourner à gauche, avancer, tourner à droite), puis appelle « triangle » : un toit équilatéral sur le bord du haut. Les blocs peuvent appeler d'autres blocs ; le script principal est un seul appel.
Lire un programme à blocs
Pour suivre un appel, lire sa définition avec les valeurs de l'appel à la place des paramètres — comme une formule se calcule avec une valeur à la place de la lettre. La définition est écrite une fois ; chaque appel est une exécution nouvelle avec ses propres valeurs.
Compétences à pratiquer
- Lire un bloc personnalisé
- Appeler avec des valeurs
- Définir un bloc
VII
Un programme complet
L'anatomie d'un programme
Un programme complet assemble les pièces vues jusqu'ici : un état initial (position, direction, stylo, chaque variable réglée), puis des boucles — un nombre de fois, jusqu'à, indéfiniment —, des conditions dedans, des variables qui comptent ou accumulent, des blocs personnalisés pour ce qui revient, et une sortie à la fin : ce que le lutin dit ou dessine. Un lutin peut porter plusieurs scripts, chacun sous son chapeau : le drapeau en lance un, une touche un autre.
Dans un projet à plusieurs lutins, chaque lutin porte ses propres scripts et les exécute indépendamment des autres. Le bloc « envoyer à tous [départ] » envoie un message à tous les lutins ; chaque script sous le chapeau « quand je reçois [départ] » démarre aussitôt, où qu'il soit, et l'expéditeur ne les attend pas. On lit ici de tels scripts ; écrire des jeux à plusieurs lutins se fait en classe, dans Scratch.
Dans un projet à plusieurs lutins, chaque lutin porte ses propres scripts et les exécute indépendamment des autres. Le bloc « envoyer à tous [départ] » envoie un message à tous les lutins ; chaque script sous le chapeau « quand je reçois [départ] » démarre aussitôt, où qu'il soit, et l'expéditeur ne les attend pas. On lit ici de tels scripts ; écrire des jeux à plusieurs lutins se fait en classe, dans Scratch.
Méthode — Du problème au programme
- Découper le problème en sous-buts : ce qu'il faut préparer, ce qui se répète, ce qui se décide, ce qui se compte, ce qui se dit à la fin.
- Donner à chaque sous-but son schéma nommé : compteur, accumulateur, garde, bord, jusqu'à, sentinelle, plus grand, bloc personnalisé.
- Assembler, état initial d'abord, sortie en dernier ; un bloc personnalisé par morceau qui revient.
- Vérifier sur papier avec un tableau d'états sur une saisie ou une suite de tirages choisies, puis dans Scratch quand on l'a.
Exemple
La table de multiplication. L'utilisateur tape \(7\). Que dit le lutin au quatrième tour, et au dernier ? Quels schémas sont utilisés ?
« i » est un compteur qui va de \(1\) à \(10\) ; « n » garde la saisie. Au tour \(4\), « i » vaut \(4\) : le lutin dit « 7 \(\times\) 4 = 28 ». Au tour \(10\) : « 7 \(\times\) 10 = 70 ». Schémas : la saisie gardée dans une variable, le compteur, un répéter à nombre de tours fixe, un « regrouper » emboîté pour la phrase.
Exemple
Un quiz. Les tirages sont \((3 ; 4)\), \((6 ; 7)\), \((2 ; 9)\), \((5 ; 5)\), \((8 ; 3)\) et le joueur répond \(12\), \(42\), \(18\), \(20\), \(24\). Que dit le lutin à la fin ?
Deux tirages par tour, gardés dans « a » et « b », une question construite avec « regrouper », une garde, un compteur. \(3 \times 4 = 12\) juste ; \(6 \times 7 = 42\) juste ; \(2 \times 9 = 18\) juste ; \(5 \times 5 = 25\), le joueur a dit \(20\) : faux ; \(8 \times 3 = 24\) juste. Le lutin dit « Score : 4 ».
Exemple
La simulation de \(100\) tirages de \(0\) ou \(1\). Pour la vérifier sur papier, on fait comme si la boucle était « répéter 10 fois » et les tirages sont \(0\), \(1\), \(1\), \(0\), \(0\), \(1\), \(0\), \(1\), \(1\), \(1\). Que dit le lutin ? Un seul compteur suffirait-il ?
Quatre zéros, six uns : le lutin dit « 4 zéros, 6 uns ». Un seul compteur suffirait, puisque uns \(= 10 -\) zéros ici (\(100 -\) zéros dans une vraie exécution) — mais deux compteurs font dire au script ce qu'il compte, et le schéma s'étend à un dé à six faces, où un seul compteur ne suffirait pas. Simuler, c'est faire tirer au hasard par le programme une expérience un grand nombre de fois pour en observer les fréquences : sur \(100\) vrais tirages, la fréquence des uns, uns \(/ 100\), est en général proche de \(1/2\) sans lui être forcément égale, et elle peut changer d'une exécution à l'autre.
Exemple
Deux lutins. Le chat porte le script de gauche, la balle celui de droite. Décrire ce qui se passe quand on clique sur le drapeau.
Seul le script du chat démarre au drapeau : il dit « Prêt ? » pendant une seconde, puis envoie le message « départ ». Le script de la balle, sous « quand je reçois [départ] », démarre à ce moment : la balle va en \((-100 ; 0)\) et avance de \(100\) pas. Le chat n'attend pas : il dit « Partez ! » juste après l'envoi — sans attendre la balle. Deux scripts, deux lutins, un message entre eux.
Lire par schémas
Un programme complet ne se lit pas bloc à bloc mais par ses schémas : « ici un compteur, ici une garde, ici un jusqu'à ». Nommer le schéma dit ce que fait le morceau ; le tableau d'états le vérifie ensuite sur une saisie.
Compétences à pratiquer
- Lire un programme entier
- Prévoir un programme entier
- Écrire un programme entier
VIII
Projet : deviner le nombre
Le projet, en trois étapes
Le lutin tire un nombre secret de \(1\) à \(20\) ; le joueur devine, le lutin donne des indices, et dit combien d'essais il a fallu. Tout y est : un tirage gardé dans une variable, une boucle « jusqu'à », des conditions, un compteur, un bloc personnalisé.
- La boucle. « mettre [secret] à (nombre aléatoire entre 1 et 20) » ; un premier « demander » avant la boucle ; « répéter jusqu'à réponse \(=\) secret » avec « demander » dedans ; puis « dire Trouvé ! ». Sans le premier « demander », le premier test porterait sur une « réponse » vide (au drapeau) ou sur la dernière proposition d'une partie précédente, qui pourrait arrêter la boucle avant que le joueur ait joué.
- Les indices. Dans la boucle, avant de redemander : « si réponse \(<\) secret alors dire plus grand pendant 1 seconde » et « si réponse \(>\) secret alors dire plus petit pendant 1 seconde » — deux blocs « si » à une branche chacun : chacun ne parle que dans son cas, et le cas égal ne dit rien. Ici un « si … sinon » marcherait aussi, puisque la boucle ne tourne jamais quand le nombre est trouvé ; mais si l'indice était placé après le « demander », le « sinon » dirait « plus petit » au joueur qui vient de trouver.
- Les essais. « mettre [essais] à 1 » avant la boucle — la première question compte —, « ajouter 1 à [essais] » à chaque nouveau « demander », et à la fin « dire regrouper Trouvé en (essais) essais ». En variante, les deux indices sont mis dans un bloc personnalisé « indice », et la boucle se lit : indice, demander, compter.
Exemple
Voici le script terminé. Le secret est \(13\) et le joueur répond \(10\), \(15\), \(12\), \(13\). Remplir le tableau d'états et donner ce que dit le lutin.
| avant le tour | réponse | essais | réponse \(=\) 13 ? | indice |
| 1 | \(10\) | \(1\) | faux | « Plus grand » |
| 2 | \(15\) | \(2\) | faux | « Plus petit » |
| 3 | \(12\) | \(3\) | faux | « Plus grand » |
| 4 | \(13\) | \(4\) | vrai : sortie |
Exemple
La variante avec un bloc personnalisé « indice ». Change-t-elle ce que fait le lutin ? Que change-t-elle ?
Rien pour le joueur : la définition contient exactement les deux blocs « si », exécutés à chaque appel. Ce qui change est la lecture : la boucle dit maintenant « indice, demander, compter » — trois étapes, trois blocs. Le bloc n'a pas de paramètre : il lit « réponse » et « secret », qui sont partagés par tout le projet.
Compétences à pratiquer
- Le projet en trois étapes
IX
Pour aller plus loin
Compétences à pratiquer
- Problèmes
- Lire un script : format brevet
- Type brevet
- Quiz
Contrôle du chapitre
4 exercices, sur 20 points. Durée indicative : 1 h.
Ce contrôle ne modifie pas la maîtrise du chapitre, quelle que soit la note.
Aucun exercice composé.
Aller à la section