Questions : boucles non bornées
1. Aléatoire
Info
L'instruction randint(1,6)
génère un entier aléatoire entre 1 et 6 compris. Cette fonction fait partie du module random
. Pour pouvoir l'utiliser on peut écrire en début de programme : from random import randint
.
Question 1.1
Question
On simule le tirage aléatoire d'un dé, jusqu'à ce qu'on obtienne un 6.
Parmi les 4 programmes suivants, lequel permet d'afficher le nombre de coups qui ont été nécessaires ? (un premier 6 au 3e lancer doit faire afficher la valeur 3).
Programme A :
from random import randint
de = randint(1,6)
compteur = 1
while de != 6:
de = randint(1,6)
compteur = compteur + 1
print(compteur)
Programme B :
from random import randint
de = randint(1,6)
compteur = 0
while de != 6:
de = randint(1,6)
compteur = compteur + 1
print(compteur)
Programme C :
from random import randint
de = randint(1,6)
compteur = 1
while de == 6:
de = randint(1,6)
compteur = compteur + 1
print(compteur - 1)
Programme D :
from random import randint
de = 0
compteur = 0
while de != 6:
de = randint(1,6)
compteur = compteur + 1
print(compteur + 1)
- A
- B
- C
- D
- A
- B
- C
- D
Le premier lancer peut donner lieu à un 6 : le compteur doit être initialisé à 1 dès qu'un lancer est simulé. Ensuite il faut incrémenter1 le compteur à chaque fois qu'un lancer est simulé. De cette façon, compteur contient exactement le nombre de lancers jusqu'au premier 6.
Question 1.2
Question
Une grenouille monte l'escalier de 17 marches qui mène à la terrasse. A chacun de ses bonds, elle grimpe aléatoirement d'une ou de deux marches.
On simule son trajet à l'aide d'un programme.
Parmi les 4 programmes suivants, lequel permet d'afficher le nombre de bonds qui ont été nécessaires pour atteindre la terrasse ?
Programme A :
from random import randint
marche = 0
compteur = 1
while marche < 17:
bond = randint(1, 2)
compteur = compteur + 1
marche = marche + bond
print(compteur)
Programme B :
from random import randint
marche = 0
compteur = 0
while marche < 17:
bond = randint(1, 2)
compteur = compteur + 1
marche = marche + bond
print(compteur)
Programme C :
from random import randint
marche = 0
compteur = 0
while marche < 17:
bond = randint(1, 2)
compteur = compteur + bond
marche = marche + bond
print(compteur)
Programme D :
from random import randint
marche = 0
compteur = 0
while marche != 17:
bond = randint(1, 2)
compteur = compteur + 1
marche = marche + bond
print(compteur)
- A
- B
- C
- D
- A
- B
- C
- D
- Le programme A initialise la variable
compteur
à 1 alors quemarche
est initialisé à 0. - Le programme C n'incrémente 1 pas correctement
compteur
: chaque bond ne compte que pour 1. - Le programme D teste si on atteint exactement la 17e marche, or notre simulation pourrait induire un bond de 2 marches à partir de la 16e. La variable
marche
pourrait ne jamais valoir 17 et le programme ne s'arrêterait pas. - Seul le programme B convient.
2. Accumulation
Question 2.1
Question
On cherche à déterminer le plus petit entier \(n\) tel que la somme \(1 + 2 + 3 + \cdots +n\) soit supérieure à 1000. Parmi les 4 programmes suivants, lequel permet d'afficher la valeur de \(n\) cherchée ?
Programme A :
somme = 0
n = 0
while somme > 1000:
n = n + 1
somme = somme + n
print(n)
Programme B :
somme = 0
n = 0
while somme >= 1000:
somme = somme + n
n = n + 1
print(n)
Programme C :
somme = 0
n = 0
while somme < 1000:
n = n + 1
somme = somme + n
print(n)
Programme D :
somme = 0
n = 0
while somme < 1000:
somme = somme + n
n = n + 1
print(n)
- A
- B
- C
- D
- A
- B
- C
- D
- Les corps de boucles des programmes A et B ne sont jamais exécutés car les expressions
somme > 1000
etsomme >= 1000
sont évaluées àFalse
puisquesomme
vaut 0 lors de l'évaluation. - La seule différence entre les programmes C et D est l'ordre des instructions
somme = somme + n
etn = n + 1
. Dans le programme D,n
est incrémenté 1 après avoir été ajouté àsomme
: lorsque la valeur desomme
sera supérieure ou égale à 1000, mettant fin à la boucle, la valeur den
ne sera pas la dernière ajoutée àsomme
. L'instructionprint(n)
n'affichera pas la bonne valeur.
Dans le programme C,n
est incrémenté avant d'être ajouté àsomme
, et le problème précédent ne se pose plus.
Question 2.2
Question
Après exécution du programme suivant, quelle serait la valeur affichée ?
i = 1
while i <= 100:
i = 2 * i
print(i)
- 1
- 64
- 100
- 128
- 1
- 64
- 100
- 128
La variable i
prend successivement les valeurs 1, 2, 4, 8, 16, 32, 64. Pour toutes ces valeurs, l'expression i <= 100
est évaluée à True
et le corps de la boucle est exécuté. Lors de la dernière exécution i
prend la valeur 128, ce qui fait sortir de la boucle.
3. Entrer dans la boucle et en sortir
Question 3.1
Question
Voici un programme comportant une boucle non bornée. Quelle est la valeur affichée à l'issue de l'exécution de ce programme ?
a = 5
while a < 5:
a = a + 2
print(a)
- 5
- 7
- 10
- Aucune : la boucle ne termine pas
- 5
- 7
- 10
- Aucune : la boucle ne termine pas
L'expression a < 5
est évaluée à False
lorque a
vaut 5 : le corps de la boucle n'est jamais exécuté.
Question 3.2
Question
Voici un programme comportant une boucle non bornée. Quelle est la valeur affichée à l'issue de l'exécution de ce programme ?
a = 5
while a < 10:
a = a + 2
print(a)
- 5
- 9
- 11
- Aucune : la boucle ne termine pas
- 5
- 9
- 11
- Aucune : la boucle ne termine pas
La variable a
prend successivement les valeurs 5, 7 et 9. Pour toutes ces valeurs, l'expression a < 10
est évaluée à True
et le corps de la boucle est exécuté. Lors de la dernière exécution a
prend la valeur 11, ce qui fait sortir de la boucle.
Question 3.3
Question
Voici un programme comportant une boucle non bornée. Quelle est la valeur affichée à l'issue de l'exécution de ce programme ?
a = 5
while a < 10:
a = a - 2
print(a)
- 5
- 3
- 1
- Aucune : la boucle ne termine pas
- 5
- 3
- 1
- Aucune : la boucle ne termine pas
La variable a
prend les valeurs 5, 3 ,1, -1, -3, etc. Pour toutes les valeurs, l'expression a < 10
est évaluée à True
et le corps de la boucle est exécuté. Les valeurs de a
sont décroissantes, et aucune valeur prise par a
ne permettra de sortir de la boucle.