Les boucles
Transcription
Les boucles
Introduction à l’algorithmique et à la programmation (Info 2) Sixième cours: Les boucles Matthieu Puigt IUT du Littoral Côte d’Opale DUT Génie Industriel et Maintenance [email protected] http://www-lisic.univ-littoral.fr/~puigt/ . Retrouvez ce document sur : http://www-lisic.univ-littoral.fr/~puigt/teaching.html Année universitaire 2014–2015 M. Puigt Info 2 – Cours 6 2014–2015 1 Avant propos Boucles, aussi connue comme structures itératives ou structures répétitives Généralement un point douloureux pour les débutants (car facile à appréhender mais long pour acquérir les réflexes pour choisir les bonnes structures) Seule structure qui est propre à un langage de programmation (pas de boucle dans une feuille excel par exemple) M. Puigt Info 2 – Cours 6 2014–2015 2 A quoi ça sert ? (1) Prenons l’exemple d’une machine à café qui demande si on veut un café à un utilisateur facétieux... On attend une réponse oui ou non à la question posée par la machine... Mais il faut imaginer que l’utilisateur puisse faire une erreur de saisie (contrôle de saisie) : Variable Rep en Caractère; Début Ecrire “Voulez-vous un café ? (O/N)” ; lire Rep ; Si (Rep 6= “O”) ET (Rep 6= “N”) Alors Ecrire “Erreur ! Recommencez.” ; Lire Rep ; FinSi Fin Tout va bien sauf si... l’utilisateur fait deux erreurs de saisie ! On peut rajouter un autre test mais l’utilisateur pourrait faire trois erreurs de saisie. Et ainsi de suite M. Puigt Info 2 – Cours 6 2014–2015 3 A quoi ça sert ? (2) Seule solution : structure de boucle TantQue Booléen Instructions ; FinTantQue Principe simple : 1 2 3 lorsqu’on arrive à la ligne TantQue, on teste la valeur du Booléen. Si elle est VRAIE, on exécute toutes les instructions jusque la ligne FinTantQue, puis on retourne à la ligne TantQue et on teste la valeur du Booléen. Si elle est fausse, on saute toutes les instructions de la boucle et on exécute les instructions après la ligne FinTantQue Squelette de l’algorithme de la machine a café : Variable Rep en Caractère; Début Ecrire “Voulez-vous un café ? (O/N)” ; TantQue (Rep 6= “O”) ET (Rep 6= “N”) Lire Rep ; FinTantQue Fin Commentaires ? A quoi ça sert ? (3) Variable Rep n’a pas été affectée avant la boucle î Erreur à l’exécution. Variable Rep en Caractère; Début Lire Rep ; Ecrire “Voulez-vous un café ? (O/N)” ; TantQue (Rep 6= “O”) ET (Rep 6= “N”) Lire Rep ; FinTantQue Fin Autre grand classique : provoquer l’entrée obligatoire dans la boucle Variable Rep en Caractère; Début Ecrire “Voulez-vous un café ? (O/N)” ; Rep ← “X” ; TantQue (Rep 6= “O”) ET (Rep 6= “N”) Lire Rep ; FinTantQue Fin Remarquez la différence de structure... A quoi ça sert ? (4) Algorithmes plus élégants en rajoutant des affichages de libellés Variable Rep en Caractère; Début Lire Rep ; Ecrire “Voulez-vous un café ? (O/N)” ; TantQue (Rep 6= “O”) ET (Rep 6= “N”) Ecrire “Vous devez répondre par O ou N. Veuillez recommencer” ; Lire Rep ; FinTantQue Fin Variable Rep en Caractère; Début Rep ← “X” ; Ecrire “Voulez-vous un café ? (O/N)” ; TantQue (Rep 6= “O”) ET (Rep 6= “N”) Lire Rep ; Si (Rep 6= “O”) ET (Rep 6= “N”) Alors Ecrire “Vous devez répondre par O ou N. Veuillez recommencer” ; FinSi FinTantQue Fin A quoi ça sert ? (5) La blague du développeur Consiste à écrire des boucles en sachant que la valeur de la condition booléenne n’est jamais VRAIE. Le programme ne rentre alors jamais dans la superbe boucle sur laquelle vous avez tant sué ! Plus grave, si elle ne devient jamais FAUSSE, vous n’allez jamais quitter la boucle. On parle alors de boucle infinie Exercices : 1 Ecrire un algorithme qui demande à l’utilisateur un nombre compris entre 1 et 3 jusqu’à ce que la réponse convienne. 2 Ecrire un algorithme qui demande un nombre compris entre 10 et 20, jusqu’à ce que la réponse convienne. En cas de réponse supérieure à 20, on fera apparaître un message : "Plus petit !", et inversement, "Plus grand !" si le nombre est inférieur à 10. 3 Ecrire un algorithme qui demande un nombre de départ, et qui ensuite affiche les dix nombres suivants. Par exemple, si l’utilisateur entre le nombre 17, le programme affichera les nombres de 18 à 27. M. Puigt Info 2 – Cours 6 2014–2015 7 Boucler en comptant, ou compter en bouclant Une boucle pouvait être utilisée pour augmenter la valeur d’une variable. Cette utilisation des boucles est très fréquente, et dans ce cas, il arrive très souvent qu’on ait besoin d’effectuer un nombre déterminé de passages. Or, a priori, notre structure TantQue ne sait pas à l’avance combien de tours de boucle elle va effectuer (puisque le nombre de tours dépend de la valeur d’un booléen). Il existe une autre structure de boucle : Variable Toto en Entier; Début Toto ← 0 ; TantQue Toto < 15 Toto ← Toto +1 ; Ecrire “Passage numéro :”, Toto ; FinTantQue Fin M. Puigt Info 2 – Cours 6 2014–2015 8 Boucler en comptant, ou compter en bouclant Une boucle pouvait être utilisée pour augmenter la valeur d’une variable. Cette utilisation des boucles est très fréquente, et dans ce cas, il arrive très souvent qu’on ait besoin d’effectuer un nombre déterminé de passages. Or, a priori, notre structure TantQue ne sait pas à l’avance combien de tours de boucle elle va effectuer (puisque le nombre de tours dépend de la valeur d’un booléen). Il existe une autre structure de boucle : Cet algorithme est équivalent à : Variable Toto en Entier; Variable Toto en Entier; Début Début Toto ← 0 ; Pour Toto ← 1 à 15 TantQue Toto < 15 Ecrire “Passage numéro :”, Toto ; Toto ← Toto +1 ; Toto Suivant Ecrire “Passage numéro :”, Toto ; Fin FinTantQue Fin M. Puigt Info 2 – Cours 6 2014–2015 8 La boucle Pour n’est pas obligatoire et peut toujours être remplacée par une boucle TantQue Cependant, elle facilite la vie du programmateur (pas d’incrémentation de la variable Toto dans notre exemple) Dit autrement : la boucle Pour est une variante de la boucle TantQue quand on peut dénombrer le nombre de tours dans la boucle On peut choisir le pas d’incrémentation (1 dans notre exemple mais on peut choisir de 2 en 2, de 10 en 10, de -3 en -3, etc) Pour Compteur ← ValeurInitiale à ValeurFinale Pas ValeurPas ... Instructions ; ... Compteur Suivant M. Puigt Info 2 – Cours 6 2014–2015 9 Bien sûr, si le pas est négatif, la valeur initiale doit être plus grande que la valeur finale si on veut que la boucle soit exécutée. Sinon, nous écrirons simplement une boucle dans laquelle le programme n’ira jamais. Attention, ce n’est pas pareil avec une boucle TantQue. Par exemple : i ← 1; TantQue i ≤ 10 Ecrire “Luke, je suis ton père.” i ← i−1 ; FinTantQue Dans le premier cas, comme vu, nous n’irons jamais dans la boucle. Dans le second cas, la valeur du booléen étant VRAIE, nous rentrons dans la boucle. Cependant, puisque la valeur de i décroit, le booléen reste toujours vrai. Nous sommes dans une boucle infinie ! Pour i ← 1 à 10 Pas −1 Ecrire “Luke, je suis ton père.” i Suivant Pour conclure Une structure TantQue est utilisée quand on doit traiter de façon systématique une série d’instructions dont on ne connaît pas la quantité (par exemple les jeux : tant que la partie n’est pas finie, jouer) Une structure Pour est utilisée quand on doit traiter de façon systématique une série d’instructions dont on sait dénombrer la quantité Exercice : 4 Voici la passionnante discussion téléphonique entre un étudiant et sa grand-mère. Ré-écrivez-la sous forme d’un algorithme en mettant en valeur les différentes instructions (affectations, lire/écrire, tests, boucles). Si vous trouvez une boucle, justifiez votre choix. - Allo mamie ? J’ai 4 L de lait et 1 kg de farine. Je voudrais faire des crêpes. Comment faire ? - Combien d’œufs as-tu ? - Six. - Très bien. Voici la recette pour deux œufs. Tu dois donc la répéter trois fois. Dans un bol, mets 500 mL de lait. Ensuite, tu casses deux œufs et tu les mets dans le bol. Puis, tout en mélangeant la pâte avec un fouet, tu ajoutes petit à petit 250 g de farine, ou si tu en as, 100 g de Maïzena et 150 g de farine. - OK - Remue bien jusqu’à ce que la pâte soit homogène. - Mmmh-mmmh. - Enfin, laisse reposer la pâte pendant une heure. Elle sera prête à être cuite dans une poêle chaude. M. Puigt Info 2 – Cours 6 2014–2015 11 Des boucles dans des boucles Comme on a pu le faire pour les tests, on peut imbriquer les boucles. Par exemple, exécutez le programme suivant : Variables Tic, Tac en Entiers; Début Pour Tic ← 1 à 5 Ecrire “It’s been there.” Pour Tac ← 1 à 6 Ecrire “It will be here.” Tac Suivant Tic Suivant Fin Combien de passages y a-t-il dans la seconde boucle ? M. Puigt Info 2 – Cours 6 2014–2015 12 Des boucles dans des boucles Comme on a pu le faire pour les tests, on peut imbriquer les boucles. Par exemple, exécutez le programme suivant : Variables Tic, Tac en Entiers; Variables Tic, Tac en Entiers; Début Début Pour Tic ← 1 à 5 Pour Tic ← 1 à 5 Ecrire “It’s been there.” Ecrire “It’s been there.” Pour Tac ← 1 à 6 Tic Suivant Ecrire “It will be here.” Pour Tac ← 1 à 6 Tac Suivant Ecrire “It will be here.” Tic Suivant Tac Suivant Fin Fin Combien de passages y a-t-il dans la seconde boucle ? 5 · 6 = 30 Même question avec l’algorithme à droite. M. Puigt Info 2 – Cours 6 2014–2015 12 Des boucles dans des boucles Comme on a pu le faire pour les tests, on peut imbriquer les boucles. Par exemple, exécutez le programme suivant : Variables Tic, Tac en Entiers; Variables Tic, Tac en Entiers; Début Début Pour Tic ← 1 à 5 Pour Tic ← 1 à 5 Ecrire “It’s been there.” Ecrire “It’s been there.” Pour Tac ← 1 à 6 Tic Suivant Ecrire “It will be here.” Pour Tac ← 1 à 6 Tac Suivant Ecrire “It will be here.” Tic Suivant Tac Suivant Fin Fin Combien de passages y a-t-il dans la seconde boucle ? 5 · 6 = 30 Même question avec l’algorithme à droite. 6 Différence entre boucles imbriquées et successives Cependant, des boucles ne peuvent jamais être croisées (au contraire des rimes en poésie...) M. Puigt Info 2 – Cours 6 2014–2015 12 Et encore une bêtise à ne pas faire ! Regardez attentivement cet algorithme : Variable A en Entier; Début Pour A ← 1 à 15 A ← A ∗2 ; Ecrire “Passage numéro ”, A ; A Suivant Fin M. Puigt Info 2 – Cours 6 2014–2015 13 Et encore une bêtise à ne pas faire ! Regardez attentivement cet algorithme : Variable A en Entier; Début Pour A ← 1 à 15 A ← A ∗2 ; Ecrire “Passage numéro ”, A ; A Suivant Fin On remarque que la valeur de A change à chaque tour dans la boucle... Mais qu’en plus la même variable A voit son contenu multiplié par deux dans la boucle... î Erreur classique ! Plantage du programme ou résultat aberrant Le gag du développeur Consiste à manipuler, au sein d’une boucle Pour, la variable qui sert de compteur à cette boucle. M. Puigt Info 2 – Cours 6 2014–2015 13 Exercices 5 Ecrire un algorithme qui demande un nombre de départ, et qui ensuite écrit la table de multiplication de ce nombre, présentée comme suit (cas où l’utilisateur entre le nombre 7) : Table de 7 : 7 x 1 = 7 7 x 2 = 14 7 x 3 = 21 ... 7 x 10 = 70 6 Un grand classique : écrire un algorithme qui demande un nombre de départ, et qui calcule la somme des entiers jusqu’à ce nombre. Par exemple, si l’on entre 5, le programme doit calculer : 1 + 2 + 3 + 4 + 5 = 15 NB : on souhaite afficher uniquement le résultat, pas la décomposition du calcul. 7 Ecrire un algorithme qui demande un nombre de départ, et qui calcule sa factorielle. NB : la factorielle de 8, notée 8!, vaut 1 · 2 · 3 · 4 · 5 · 6 · 7 · 8 M. Puigt Info 2 – Cours 6 2014–2015 14 8 Ecrire un algorithme qui demande successivement 20 nombres à l’utilisateur, et qui lui dise ensuite quel était le plus grand parmi ces 20 nombres : Entrez le nombre Entrez le nombre etc. Entrez le nombre Le plus grand de numéro 1 : 12 numéro 2 : 14 numéro 20 : 6 ces nombres est : 14 Modifiez ensuite l’algorithme pour que le programme affiche de surcroît en quelle position avait été saisie ce nombre : C’était le nombre numéro 2 9 Réécrire l’algorithme précédent, mais cette fois-ci on ne connaît pas d’avance combien l’utilisateur souhaite saisir de nombres. La saisie des nombres s’arrête lorsque l’utilisateur entre un zéro. 10 Lire la suite des prix (en euros entiers et terminée par zéro) des achats d’un client. Calculer la somme qu’il doit, lire la somme qu’il paye, et simuler la remise de la monnaie en affichant les textes "10 Euros", "5 Euros" et "1 Euro" autant de fois qu’il y a de coupures de chaque sorte à rendre. M. Puigt Info 2 – Cours 6 2014–2015 15 11 Ecrire un algorithme qui permette de connaître ses chances de gagner au tiercé, quarté, quinté et autres impôts volontaires. On demande à l’utilisateur le nombre de chevaux partants, et le nombre de chevaux joués. Les deux messages affichés devront être : Dans l’ordre : une chance sur X de gagner Dans le désordre : une chance sur Y de gagner X et Y nous sont donnés par la formule suivante, si n est le nombre de chevaux partants et p le nombre de chevaux joués (on rappelle que le signe ! signifie "factorielle", comme dans l’exercice ci-dessus) : X= n! n! et Y = (n − p)! p! · (n − p)! NB : cet algorithme peut être écrit d’une manière simple, mais relativement peu performante. Ses performances peuvent être singulièrement augmentées par une petite astuce. Vous commencerez par écrire la manière la plus simple, puis vous identifierez le problème, et écrirez une deuxième version permettant de le résoudre. M. Puigt Info 2 – Cours 6 2014–2015 16