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