Informatique Cours S1.5 Boucle conditionnelle 1 Algorithme de boucle conditionnelle La structure d'un algorithme de boucle conditionnelle fait intervenir : • l'instruction de boucle conditionnelle (while en python), • un test dont le résultat est un booléen (vrai True ou faux False), • la liste des instructions à répéter tant que le test est vrai. Exemple : algorithme d'une boucle conditionnelle permettant la saisie de chiffres entiers tant qu'il s'agit effectivement de chiffre entier. Entrée : une chaine de caractères chaine supposée contenir un entier Résultat : une liste liste contenant les entiers saisis En pseudo code : Ecrire 'Entrer un chiffre entier (ou un autre caractère pour terminer la saisie) : ' chaine ← Saisir Tant que ('0' <= chaine) et (chaine <= '9') alors # les chiffres se suivent dans le codage des caractères liste ← ajouter l'entier de la chaine à la liste Afficher ('La nouvelle liste des entiers saisis est :') Afficher (liste) Ecrire ('Entrer un chiffre entier (ou un autre caractère pour terminer la saisie) : ' ) chaine ← Saisir Fin Tant que En python : chaine = input ( 'Entrer un chiffre entier (ou un autre caractère pour terminer la saisie) : ' ) while ('0' <= chaine) and (chaine <= '9'): liste = liste + [ int(chaine) ] print ('La nouvelle liste des entiers saisie est :') print (liste) chaine = input ('Entrer un chiffre entier (ou un autre caractère pour terminer la saisie) : ' ) Syntaxe obligatoire : - while en minuscule annonce le test à venir - le test est une expression dont le résultat est un booléen (True ou False) - : les deux points annoncent la fin de l'expression du test et le début des instructions à réaliser les instructions à réaliser dans le cas d'un test positif (True) doivent être indentés (décalées par - rapport à l'instruction while). Une instruction minimum est obligatoire la fin de l'indentation annonce la fin des instructions à répéter - Remarque : la variable (ici chaine) utilisée dans le test et modifiée par les instructions répétées doit avoir reçue une affectation avant l'instruction while. Remarque : - une expression est un groupe d'opérandes (nombre, chaine…) liés par des opérateurs (+,*,/,==,…) qui renvoie une valeur, Exemples : 1+2 '0' <= chaine liste + [ int(chaine) ] - une instruction est exécutée et peut contenir une ou plusieurs expressions. Exemples : print (1+2) liste ← liste + [ int(chaine) ] En d'autres termes une expression fait plutôt référence à un élément d'une ligne de commande, alors qu'une instruction correspond à une ligne complète. Lycée Jules Ferry Cannes Page 1 sur 2 TSI1 Informatique Cours S1.5 Boucle conditionnelle Les expressions du test sont les mêmes qu'avec l'instruction conditionnelle if. 2 Précaution lors de l'usage d'une boucle conditionnelle Le danger particulier d'une boucle while est de ne jamais s'arrêter : le programme tourne indéfiniment dans la boucle. Cela impose de forcer l'arrêt du programme (ctrl-c par exemple) ce qui n'est jamais souhaitable. SOLUTION : il faut s'assurer que le test pourra devenir faux : les instructions de la boucle doivent agir sur les variables du test de telle façon que le test puisse devenir faux. Idéalement lors d'opérations répétitives, on utilise un variant de boucle (entier positif) qui décroit (ou croit constamment) jusqu'à atteindre une valeur entière (zéro par exemple). Exemple : # Entrée : un tableau T de nombres triés par ordre croissant T[0..n] # un nombre x # Sortie : un tableau T de nombres triés par ordre croissant T[0..n+1] contenant x T=[ 0 , 1.5 , 1.7 , 2] # valeur initiale de la table T x=1.6 # nombre à insérer à T i= len(T)-1 # i est affecté du numéro de dernier indice de T T=T+ [ x ] # on ajoute un élément à la liste T (par défaut x est supposé être le plus grand) while (T[i] > x and i > 0) : T[i+1]=T[i] T[i]=x i=i-1 print ( 'Nouvelle liste triée :', T) i est un variant de boucle : entier positif et qui décroit à chaque boucle jusqu'à la valeur 0 (sauf si x est effectivement le plus grand élément, dans ce dernier cas les instructions de la boucle while ne sont jamais exécutées). PREUVE : Mathématiquement on peut prouver si une algorithme délivre bien le résultat attendu à partir d'un invariant de boucle : - propriété vraie lors de l'initialisation, - propriété vraie pour chaque valeur du variant de boucle, - propriété vraie en fin de boucle et qui montre que le résultat est bien celui attendu. L'invariant de boucle est souvent difficile à trouver. Exemple : l'invariant de boucle de l'algorithme précédent est : la juxtaposition des tableaux T[0, i] et T[i+ 2, n+1] est égale au tableau initial et x est plus petit que tous les éléments du deuxième tableau. Solution pratique pour vérifier que l'algorithme donne les résultats attendus : tester avec des valeurs particulières (mais ce n'est pas une preuve). Exemple : -1, 1.6 puis 3 permettraient de vérifier que l'algorithme classe correctement les valeurs. Références : http://www.mpsi-lycee-saint-exupery.fr Lycée Jules Ferry Cannes Page 2 sur 2 TSI1