Aller au contenu

12 Exos Boucle While Correction

Exercices à programmer⚓︎

Exercice 1⚓︎

Voici un programme permettant d’afficher les carrés et les cubes des \(20\) premiers entiers naturels non nuls. Réécrivez-le avec une boucle while à la place de la boucle for.

🐍 Script Python
for n in range(1, 21):
  print("Le carré de " + str(n) + " est : " + str(n**2) + ".")
  print("Le cube de " + str(n) + " est : " + str(n**3) + ".")

Avec une boucle while :

🐍 Script Python
k = 0
while k < 21:
    print(k, ':', k * k, k ** 3)
    k += 1

Exercice 2⚓︎

Voici un programme permettant d’afficher toutes les tables de multiplication de \(0\) à \(10\). Réécrivez-le avec des boucles while à la place des boucles for.

🐍 Script Python
for k in range(0,11,1):
    print("Table de " + str(k) + " : ")
    for j in range(0,11,1):
        print(k," *",j," =",k*j)
    print()
🐍 Script Python
k = 0
while k < 11:
    print("Table de " + str(k) + " : ")
    j = 0
    while j < 11:
        print(k," *",j," =",k*j)
        j += 1
    print()
    k += 1

Exercice 3⚓︎

Écrire un programme qui affiche une table de conversion des sommes d’argent exprimées en euros et en francs suisses. La progression des valeurs sera géométrique comme dans l’exemple ci-dessous :

1 CHF = 1,07 EUR
2 CHF = 2,14 EUR
3 CHF = 3,21 EUR
4 CHF = 4,144 EUR

On s’arrêtera lorsqu'on aura dépassé 4000 euros. Ne pas déterminer le nombre de tours de boucles.

🐍 Script Python
n_suisse = 0
n_euros = 0.0
while n_euros <= 4000 :
  print(f"{n_suisse : } CHF = {n_euros : .3f} EUR")
  n_suisse += 1
  n_euros = n_suisse * 1.07

Exercice 4⚓︎

Écrire un programme qui affiche une suite de nombres dont chaque terme est égal au triple du précédent. On part avec nb = 2, et on s'arrête lorsqu'il dépasse \(1\) million.

🐍 Script Python
nb = 2
while nb < 1000000:
  print(nb)
  nb *= 3

Exercice 5⚓︎

Modifier le programme ci-dessous afin de s'assurer que l'utilisateur ne choisisse que des nombres entiers entre 0 et 10 (s'il joue autre chose, on lui redemande de saisir 𝑥 et 𝑦).

On utilise une boucle while pour redemander à l'utilisateur de saisir des valeurs tant que ce qu'il a écrit ne répond pas aux critères que l'on a fixés (que \(x\) et \(y\) soient des nombres entre \(0\) et \(10\)).

🐍 Script Python
a, b = 4, 7
print("À vous de jouer")
x = int(input("x ? "))
y = int(input("y ? "))
# ici si les nombres ne sont pas bons, on redemande
while x < 0 or x > 10:
  print("Merci de choisir un nombre entier entre 0 et 10.")
  x = int(input("x ? "))
while y < 0 or y > 10:
  print("Merci de choisir un nombre entier entre 0 et 10.")
  y = int(input("y ? "))
# fin de la boucle
if  x == a and y == b:
    print("Coulé")
else:
    if x == a or y == b:
        print("En vue")
    else:
        print("À l'eau")

On pouvait aussi faire une seule boucle en redemandant \(x\) et \(y\) dès que l'un des deux ne correspond pas à ce qui est attendu.

Pour aller plus loin

On pouvait aussi s'assurer que l'utilisateur tape bien un entier. Dans ce cas, il faut accepter que le "input" soit, par exemple, "ab", et tenter une conversion en int sans echec.

🐍 Script Python
a, b = 4, 7
print("À vous de jouer")
x = ""
while type(x) is not int or x < 0 or x > 10:
    print("Merci de choisir un nombre entier entre 0 et 10.")
    x = input("x ?")
    try:
        x = int(x) #on tente la conversion
    except:
        print("un entier, svp")

Exercice 6⚓︎

Modifier le programme ci-dessous afin de permettre à l’utilisateur de rejouer s’il le souhaite.

Si on veut permettre à l’utilisateur de rejouer "s’il le souhaite", il faut lui poser la question après un tour de jeu. On choisit une variable qui note la réponse de l'utilisateur, et on crée un boucle while qui fait jouer et rejouer tant que la valeur de la variable.
Pour commencer le jeu, la variable est initialisée à la valeur qui permet de jouer.

🐍 Script Python
a, b = 4, 7
jeu_en_cours = 'y'
while jeu_en_cours == 'y':
    print("À vous de jouer")
    x = int(input())
    y = int(input())
    if  x == a and y == b:
        print("Coulé")
    else:
        if x == a or y == b:
            print("En vue")
        else:
            print("À l'eau")
    jeu_en_cours = input("Continuer ? ('y' ou 'n') : ")

On peut imaginer une autre solution, où le fait de rejouer est lié, non pas au choix de l'utilisateur, mais au fait d'avoir trouvé la réponse, par exemple.

🐍 Script Python
a, b = 4, 7
jeu_en_cours = True
while jeu_en_cours:
    print("À vous de jouer")
    x = int(input())
    y = int(input())
    if  x == a and y == b:
        print("Coulé")
        jeu_en_cours = False #le jeu s'arrête
    else:
        if x == a or y == b:
            print("En vue")
        else:
            print("À l'eau")

Exercice 7⚓︎

Expérimenter avec la conjecture de Syracuse :
On part d'un nombre strictement positif ; s'il est pair, on le divise par 2 ; s'il est impair, on le multiplie par 3 et on ajoute 1. On s'arrête dès que l'on atteint 1.

La conjecture de Syracuse annonce qu'on finira par atteindre 1 pour n'importe quel entier de départ (mais attention, ça peut être long, et bloquer l'ordinateur).

Écrire une fonction qui prend en paramètre un entier \(n\), et qui fait affiche les termes successifs de cette suite jusqu'à ce qu'elle s'arrête. Tester avec quelques valeurs.

🐍 Script Python
def syracuse(n):
    print(n)
    while n > 1:
        if n % 2:
            n = n // 2
        else:
            n = 3 * n + 1
        print(n)

syracuse(14)

Exercices sur la terminaison des boucles While⚓︎

Pour chaque exercice ci-dessous, déterminer, en justifiant, si la boucle while se termine ou non. Si elle ne se termine pas, proposer une modification pour la faire terminer.

Exercice 8⚓︎

🐍 Script Python
y = 5
while y > 0:
    print(y)
    y = y + 1
  • La boucle ne se termine pas.
  • Justification : y est incrémenté à chaque itération, donc il restera toujours supérieur à 0.
  • Modification pour terminer : y = y - 1 au lieu de y = y + 1

Exercice 9⚓︎

🐍 Script Python
z = 100
while z != 0:
    print(z)
    z = z - 2
  • La boucle ne se termine pas.
  • Justification : z est impair et est décrémenté de 2 à chaque fois, donc il restera impair et n'atteindra jamais exactement 0.
  • Modification pour terminer : changer la condition à while z > 0:

Exercice 10⚓︎

🐍 Script Python
a = 1
while a < 10:
    print(a)
    a = a * 2
  • La boucle se termine.
  • Justification : a est multiplié par 2 à chaque itération, dépassant rapidement 10.

Exercice 11⚓︎

🐍 Script Python
b = 0
while b < 15:
    if b % 2 == 0:
        print(b)
    b = b + 1
  • La boucle se termine.
  • Justification : b est incrémenté à chaque itération et atteindra 15 en un nombre fini d'étapes.

Exercice 12⚓︎

🐍 Script Python
b = 0
while b < 15:
    if b % 2 == 0:
        print(b)
        b = b + 1
  • La boucle ne se termine pas.

  • Justification : à cause de l'indentation incorrecte, l'incrémentation de b (b = b + 1) ne se produit que lorsque b est pair. Lorsque b devient impair (1), cette ligne n'est plus exécutée, et b reste bloqué à 1, ce qui est toujours inférieur à 15. La boucle continue donc indéfiniment.

  • Modification pour terminer : corriger l'indentation de la ligne b = b + 1 pour qu'elle soit au même niveau que le if :

    🐍 Script Python
    b = 0
    while b < 15:
        if b % 2 == 0:
            print(b)
        b = b + 1
    

    Avec cette correction, b sera incrémenté à chaque itération, permettant à la boucle de se terminer.