MPSI - 2017/2018 Les boucles ”While” http://pascal.delahaye1.free.fr/
Fiche n
◦07 : Les boucles ”While”
R´edig´ee par Pascal Delahaye
Cette fiche contient des ´el`ements de cours `a assimiler pour le cours de la semaine suivante.
Vous devez imp´erativement :
• Travailler avec un ordinateur afin de v´erifier une `a une les diff´erentes instructions qui sont pr´esent´ees.
• V´erifier et confirmer votre assimilation en effectuant tous les exercices d’entrainement propos´es `a la fin du poly.
• Pr´evoir environ 1h30 de travail personnel.
Une ´evaluation de 10mn sera effectu´ee au prochain cours pour v´erifier la qualit´e de votre travail d’auto- apprentissage.
I] Les boucles ”While”
Lorsque l’on souhaite effectuer une mˆeme s´erie d’instructions tant qu’une condition donn´ee reste v´erifi´ee, on utilise une boucle ”while”. On identifie facilement cette situation car elle correspond au cas o`u l’on ne peut d´eterminer `a l’avance le nombre d’it´erations n´ecessaires `a la r´esolution de notre probl`eme.
Les boucleswhilese structurent de la fa¸con suivante :
Python
while "condition bool´eenne" : # Tant que la condition bool´eenne est v´erifi´ee instruction 1 # Faire les diff´erentes instructions qui suivent instruction 2
. .
instruction n .
Tant que la condition bool´eenne est v´erifi´ee, on effectue les instructions qui suivent.
Exemple 1. Ainsi, les probl`emes suivants pourront se traiter `a l’aide d’une boucle ”While” : 1. Calculer le terme un d’une suite tant que celui-ci reste inf´erieur `a 1000.
Python
while U <= 100 : ... # U est le terme de la suite calcul´e
2. Demander `a l’utilisateur de choisir un nombre tant que celui-ci ne correspond pas `a un nombre myst`ere donn´e.
1
MPSI - 2017/2018 Les boucles ”While” http://pascal.delahaye1.free.fr/
Python
while N != mystere : ... # mystere est le nombre `a trouver
# N est le nombre choisi par l’utilisateur
3. Rechercher le nombre premier suivant tant que l’on n’en a pas encore trouv´e 100.
Python
while len(L) < 100 : ... # L est la liste utilis´ee pour stocker les
# nombres premiers trouv´es
Remarque 1.
1. Il est souvent possible de remplacer une boucle ”for” par une boucle ”while” mais cela n’a pas grand int´erˆet...
Python
for k in range(1,101) : instructions
# Peut se remplacer par : k = 1
while k <= 100 : instructions k = k + 1
2. Les boucles ”while” pr´esentent un risque de boucle infinie.
Deux exemples de boucles infinies :
Python
# Exemple 1 | # Exemple 2
S = 0 | L = []
while S == 0 : | while 0 == 0 :
print("je suis une boucle infinie !") | L.append(1)
• Dans l’exemple 1, le programme ne se termine jamais, seule une action de l’utilisateur peut l’interrompre.
• Dans l’exemple 2, le programme s’arrˆete avec un message d’erreur car la liste L atteind une taille maximale.
Pour ´eviter d’obtenir une boucle infinie, il faut au minimum s’assurer que la condition est bien modifi´ee par les instructions.
Exemple 2. La suite de Syracus est d´efinie de la fa¸con suivante :
u0=A
uk+1=uk/2 siuk est pair uk+1= 3uk+ 1 siuk est impair
. D’apr`es-vous, le programme suivant pr´esente-t-il un risque de boucle infinie ?
V´erifiez votre conjecture. Qu’en pensez-vous ?
Python
def syracus(A) : U=A
while U != 1 :
if U%2 == 0 : U = U/2 else : U = 3U + 1
Exemple 3. Programme de jeu o`u il s’agit de deviner un entier compris entre 0 et 9.
Python
from random import randint def jeu() :
inconnu = randint(1,10) guess = -1
while guess != inconnu :
guess = eval(input("devinez un entier compris entre 0 et 9 : ")) print("Enfin gagn´e !")
2
MPSI - 2017/2018 Les boucles ”While” http://pascal.delahaye1.free.fr/
Am´eliorer ce programme afin :
1. qu’il renvoie le nombre d’essais qu’il vous a fallu pour trouver le nombre inconnu.
2. qu’il indique `a l’utilisateur si le nombre propos´e est trop grand ou trop petit (avec une structure de contrˆole).
Deux situations usuelles `a connaˆıtre :
1. Suites divergeant vers +∞:
Ecrire en prseudo-langage, un programme permettant de savoir `a partir de quelle valeur de nle terme g´en´eralun de la suite d´epasse une valeurA.
Application : (un) d´efinie parun=
n
X
k=1
1 k. 2. Suites adjacentes :
Ecrire en pseudo-langage, un programme qui donne une approximation de la limite commune de deux suites adjacentes (un) et (vn) `aεpr`es.
Application : On consid`ere les deux suites suivantes : (un) :un =
n
X
k=1
1
k! (vn) :vn=un+ 1
n!
Nous verrons en cours de math que les suites (un) et (vn) sont adjacentes et convergent vers e.
Concevez un programme donnant la valeur dee`a une erreurεpr`es.
Remarque 2. Il est possible en python d’interrompre le d´eroulement d’une boucle (”for” ou ”while”) `a l’aide de l’ins- tructionbreak.
Python
i=1
while i < 100 : print(2*i) i = i + 1
a = input("voulez-vous arr^eter : O ou N ? ")
if a == "O" : break # Instruction permettant d’interrompre la boucle
II] Quelques exemples
1. SoitA >0.
Construire un programme permettant de connaˆıtre la premi`ere valeur den∈N∗ telle que n1 < A.
R´eponse Id´ee : On incr´emente la valeur de ntant que n1 ≥A.
Python
def recherche(A) : n = 1
while 1/n >= A : n = n + 1 return n
3
MPSI - 2017/2018 Les boucles ”While” http://pascal.delahaye1.free.fr/
2. Construire un programme de jeu qui compte le nombre d’essais n´ecessaires `a un joueur pour trouver un nombre myst`ere.
R´eponse
Id´ee : On s’inspire d’un programme pr´ec´edent et on ajoute un compteur.
Python
from random import randint def jeu() :
myst = randint(1,10) N = 1
A = eval(input("Choisisser un entier entre 1 et 10 : ")) while A != myst :
A = eval(input("Recommencer : ")) N = N + 1
print("Il vous a fallu ", N, " essais pour trouver")
3. Construire un programme permettant de tester si un entier naturel est un nombre premier et de renvoyer son premier diviseur si celui-ci ne l’est pas.
R´eponse Id´ee : On regarde si les nombres de2 `a⌊√
n⌋sont des diviseurs de net on s’arrˆete d`es qu’on en a trouv´e un.
Python
from math import sqrt def test_prem(n) :
d = 2
fin = int(sqrt(n))
while n%d != 0 and d <= fin:
d = d+1
if d == fin + 1 : print(n," est premier")
else : print(n, " n’est pas premier car il est divisible par ", d)
4. Construire une fonction bool´eenne permettant de savoir si un ´el´ementeest contenu dans une listeL: R´eponse
Id´ee : On parcourt tous les ´el´ements de la listeLjusqu’`a trouver e.
Python
def test(e,L) :
i = 0 # i est l’indice courant
while i < len(L) and L[i] != e : i = i+1 if i == len(L) : return False
else : return True
Expliquer pourquoi la commandewhile L[i] != e and i < len(L) : i = i+1renvoie un message d’erreur lorsqueene se trouve pas dans la listeL.
R´eponse
Parce que dans ce cas, i finit par prendre la valeur len(L) et que dans ce cas, le test L[i] != e n’est pas possible puisqueL[i]n’a pas de sens.
4