Algorithmique Boucles et Itérations Cours de BTS/CPI 1ère année Algo – Prog CPI/BTS1 – M. Dravet – 22/09/2003 Dernière modification: 22/09/2003
Introduction Dans un algo, on doit souvent répéter les mêmes blocs d’instruction … Avec quelques variations dans les paramètres pour préciser le déroulement de l’algo … Il est fastidieux d’écrire plusieurs fois la même chose Surtout que le nombre de répétitions à faire peut varier en fonction de l’algo lui-même et de ce qu’il fait : il est très dur de connaître ce nombre à l’avance.
Introduction Pour gérer ces cas, on fait appel à des instructions en boucle qui ont pour effet de répéter plusieurs fois une même instruction. Deux formes existent : si le nombre de répétitions est connu avant l'exécution de l'instruction de répétition, … et s’il n’est pas connu. On appellera itération l'exécution de la liste des instructions.
Répétition inconditionnelle Il est fréquent que le nombre de répétitions soit connu à l'avance, et que l'on ait besoin d'utiliser le numéro de l'itération afin d'effectuer des calculs ou des tests. Le mécanisme permettant cela est la boucle Pour. Pour variable de valeur initiale à valeur finale faire liste d'instructions Fin pour
Répétition inconditionnelle La variable dont on donne le nom va prendre successivement toutes les valeurs entières entre valeur initiale et valeur finale. Pour chaque valeur prise par la variable, la liste des instructions est exécutée. La valeur utilisée pour énumérer les itérations est appelée valeur d'itération, indice d'itération ou compteur. L'incrémentation par 1 de la variable est implicite.
Répétition inconditionnelle Autre forme de la boucle Pour : Pour variable décroissante de valeur initiale à valeur finale faire liste d'instructions Fin pour La variable d'itération est décrémentée de 1 après chaque itération.
Répétition inconditionnelle Exemple n° 1 Programme TableDe9 Début écrire(1*9) écrire(2*9) écrire(3*9) écrire(4*9) écrire(5*9) écrire(6*9) écrire(7*9) écrire(8*9) écrire(9*9) écrire(10*9) fin
Répétition inconditionnelle Exemple n° 1 Il est plus simple d'utiliser une boucle avec un compteur prenant d'abord la valeur 1, puis augmentant peu à peu jusqu'à atteindre 10. Programme TableDe9 Déclarations Var i : entier { compteur de la boucle } Début pour i de 1 à 10 faire écrire(i*9) fin pour fin
Répétition inconditionnelle Exemple n° 2 On veut imprimer, pour n donné, la somme des carrés des n premiers entiers. Cette somme, notée s, est obtenue en calculant le n-ième terme d'une suite définie par récurrence : sn=sn-1+n² Algorithmiquement le calcul de cette suite se fait en deux étapes : initialisation (ici, s0=0) répétition de : calcul du ième terme en fonction du terme d'indice i-1
Répétition inconditionnelle Exemple n° 2 Programme SommeCarrés Déclarations Var s : entier { résultat de la somme } n : entier { borne supérieure de la suite } i : entier { compteur de boucle } Début Écrire(‘entrez la borne max de la suite: ‘) lire(n) { 1 } s 0 { 2 } pour i de 1 à n faire { 3 } s s + i2 { 4 } Fin pour { 5 } écrire(s) fin
Répétition inconditionnelle Schéma de l'évolution de l'état des variables instruction par instruction : On suppose que la valeur introduite par l'utilisateur est 4. Instructions n s i 1 4 2 3 5 14 30 fin écrire
Répétition inconditionnelle Exercice Ecrire l'algorithme qui permet d'imprimer le maximum de n entiers positifs donnés au fur et à mesure. Le programme doit demander n à l’utilisateur, puis doit demander n fois de rentrer un nombre. Au bout de n nombre saisis, le programme affiche le maximum. On suppose que les entiers saisis par l’utilisateur sont positifs (pas besoin de vérification dans le programme)
Répétition inconditionnelle Exercice 1ère méthode: initialisation à un terme artificiel. Programme maximum Déclarations Variable n : entier { nombre d'entiers positifs donné } maximum : entier { maximum des i premiers entiers } nombre : entier { ième nombre lu } i : entier { indice d'itération } Début lire(n) { 1 } maximum -1 { 2 } pour i de 1 à n faire { 3 } lire(nombre) { 4 } si nombre > maximum alors { 5 } maximum nombre { 6 } fin si Fin fin pour écrire (maximum) { 7 } fin
Répétition inconditionnelle Schéma de l'évolution de l'état des variables instruction par instruction Instructions n maximum i nombre nombre > maximum 1 4 2 -1 3 5 Vrai 6 faux 8 7 (fin) écrire
Répétition inconditionnelle Exercice 2ème méthode: initialisation à un terme utile. Programme maximum Déclarations Variable n : entier { nombre d'entiers positifs donné } maximum : entier { maximum des i premiers entiers } nombre : entier { ième nombre lu } i : entier { indice d'itération } Début lire(n) { 1 } écrire(‘Entrez le 1er chiffre: ‘) lire(maximum) { 2 } pour i de 2 à n faire { 3 } lire(nombre) { 4 } si nombre > maximum alors { 5 } maximum nombre { 6 } fin si fin pour écrire (maximum) { 7 } fin
Répétition inconditionnelle Schéma de l'évolution de l'état des variables instruction par instruction Instructions n maximum i nombre nombre > maximum 1 4 2 3 5 faux 8 Vrai 6 7 (fin) (écrire)
Répétitions conditionnelles L'utilisation d'une boucle pour nécessite de connaître à l'avance le nombre d'itérations désiré, c'est-à-dire la valeur finale du compteur. Dans beaucoup de cas, on souhaite répéter une instruction tant qu'une certaine condition est remplie … … alors qu'il est à priori impossible de savoir à l'avance au bout de combien d'itérations cette condition cessera d'être satisfaite. Le mécanisme permettant cela est la boucle Tant que.
Répétitions conditionnelles Syntaxe de la boucle Tant que : Tant que condition faire liste d'instructions Fin tantque Exécution de l’itération basée sur un type booléen dont la valeur est vrai la liste d'instructions est répétée autant de fois que la condition de poursuite a la valeur vraie.
Répétitions conditionnelles Remarques: Du fait que la condition est évaluée avant l'exécution des instructions à répéter, il est possible que celles-ci ne soient jamais exécutées. Il faut que la liste des instructions ait une incidence sur la condition afin qu'elle puisse être évaluée à faux et que la boucle se termine. Il faut toujours s'assurer que la condition devient fausse au bout d'un temps fini.
Répétitions conditionnelles Exemple n°1: Demander à l’utilisateur de saisir un entier positif et le redemander jusqu’à ce que l’entier soit positif.
Répétitions conditionnelles Exemple n°1: Programme TestSaisie Déclaration Variable nb_lu : entier Début nb_lu -1 tant que nb_lu<0 faire écrire(‘entrez un entier positif: ‘) lire(nb_lu) fin tantque Fin
Répétitions conditionnelles Exemple n°2: Demander à un utilisateur de saisir des entiers, tant que la somme de ces entiers est inférieure à 200 Ecrire à la fin de l’algo, le nombre d’entiers que l’utilisateur a saisi pour arriver à 200.
Répétitions conditionnelles Exemple n°2: Programme TestSomme Déclaration Variable nb_lu, somme, nb : entier Début somme 0 nb 0 tant que somme<200 faire écrire(‘entrez un entier positif: ‘) lire(nb_lu) somme somme + nb_lu nb nb + 1 Fin fin tantque écrire(nb)
Boucles imbriquées Le corps d’une boucle est une suite d’instructions Or une boucle est elle-même une instruction … Donc le corps d'une boucle peut contenir une boucle dite imbriquée, puisque c’est une instruction comme une autre La boucle imbriquée utilise un compteur différent
Boucles imbriquées A chaque passage dans la boucle principale, la boucle imbriquée sera totalement exécutée … Attention aux boucles infinies, et à la gestion des compteurs !
Répétitions conditionnelles Exemple n°3: Demander à un utilisateur de saisir un entier positif Pour chaque entier N partant de 1 à l’entier saisi par l’utilisateur, écrire les nombres allant de 1 à cet entier N Exemple (saisie: 6) : 1 12 123 1234 12345 123456
Répétitions conditionnelles Exemple n°3: Programme TestSaisie Déclaration Variable nb_lu, somme, nb : entier Début lire(nb_lu) Pour i de 1 à nb_lu faire Pour j de 1 à i faire écrire (j) fin pour fin