C5.1 : Boucles avec while

Prendre connaissance

Prendre connaissance de Mémo : Boucle while et de Mémo : Tableau pas à pas.

Application pour bien démarrer : analyse d'un code

On s'intéresse au programme suivant :

print("Début de la boucle")
i = 5
while i < 8:
    i = i + 1
    print(i)
print("Fin de la boucle")
print(i)

1) Sur feuille, construire le tableau du déroulement pas à pas du programme.

2) Sur l'ordinateur, avec Thonny :

3) Sur l'ordinateur, avec pythontutor :

Applications avec variable d'incrémentation

Application III_app1

1) Écrire la fonction affiche_nombres(nb_max:int) qui :

Remarque : cette fonction ne renvoie rien.

2) Compléter le programme principal pour tester la fonction.

Afficher la correction
def affiche_nombres(nb_max:int):
    nb = 1
    while nb <= nb_max:
        print(nb)
        nb = nb + 1

# Programme principal
affiche_nombres(10)

Application III_app2

Écrire une fonction qui affiche les lettres de l'alphabet.

Remarque : cette fonction ne prend pas de paramètre et ne renvoie rien.

Information : chr(65) renvoie la lettre 'A', chr(66) renvoie la lettre 'B'...

Afficher la correction
def affiche_alphabet():
    i = 65
    while i < 65 + 26:
        print(chr(i))
        i = i + 1

# Programme principal
affiche_alphabet()

Application III_app3

1) Écrire la fonction affiche_nombres_paires(nb_max:int) qui :

Remarque : cette fonction ne renvoie rien.

2) Compléter le programme principal pour tester la fonction.

Applications avec une variable supplémentaire

Application IV_app1

Sur feuille :

On considère le programme suivant :

def fct(n:int) -> int:
    somme = 0
    i = 1
    while i <= n:
        somme = somme + i
        i = i + 1
    return somme

1) Détailler ligne par ligne (sous forme d'un tableau) l'exécution de l'instruction fct(4).

2) Ecrire la docstring de cette fonction

3) Que faut-il modifier d'autre dans le programme si l'on inverse les lignes 4 et 5 ?

Afficher la correction
def somme_1_a_v1(n:int) -> int:
    """
    Renvoiee la somme des nombres de 1 auu nombre passé en paramètre.
    Paramètres :
        n (int): nombre entier
    Valeur renvvoyée :
        (int) : somme des nombres de 1 à n
    """
    somme = 0
    i = 1
    while i <= n:
        somme = somme + i
        i = i + 1
    return somme

def somme_1_a_v2(n:int) -> int:
    somme = 0
    i = 0
    while i < n:
        i = i + 1
        somme = somme + i
    return somme

# Programme principal
nb = int(input("Entrer un nombre entier : "))
print("La somme de 1 à " + str(nb) + " est " + str(somme_1_a_v1(nb)))
print("La somme de 1 à " + str(nb) + " est " + str(somme_1_a_v2(nb)))

Application IV_app2

Ecrire une fonction qui prend deux nombres entiers positifs n1 et n2 en paramètres et renvoie la somme des nombre de n1 à n2 si n1 ≤ n2, ou de n2 à n1 si n1 > à n2.

Afficher la correction
def somme_v1(n1:int, n2:int) -> int:
    if n1 <= n2:
        petit = n1
        grand = n2
    else:
        petit = n2
        grand = n1

    somme = 0
    i = petit
    while i <= grand:
        somme = somme + i
        i = i + 1
    return somme

def somme_v2(n1:int, n2:int) -> int:
    somme = 0
    if n1 <= n2:
        i = n1
        while i <= n2:
            somme = somme + i
            i = i + 1
    else:
        i = n2
        while i <= n1:
            somme = somme + i
            i = i + 1
    return somme

# Programme principal
print(somme_v1(4,8))
print(somme_v1(8,4))

print(somme_v2(4,8))
print(somme_v2(8,4))

Application IV_app3

Sur feuille :

On considère le programme suivant :

nb = int(input("Entrer un nombre : "))
bn = 0
while nb > 0:
    bn = bn * 10 + nb % 10
    nb = nb // 10
print(bn)

1) Détailler l'exécution du programme ligne par ligne (sous forme d'un tableau) en supposant que l'utilisateur entre le nombre 421.

2) Expliquer en une phrase ce que fait le programme.

Afficher la correction
Ligne Explication
1 nb ← 421 (récupération du nombre entré par l'utilisateur)
2 bn ← 0
3 421 > 0 renvoie true donc le programme entre dans la boucle
4 bn ← 1 car 0 * 10 + 421 % 10 = 1
5 nb ← 42 car 421 // 10 = 42
3 42 > 0 renvoie true donc le programme entre dans la boucle
4 bn ← 12 car 1 * 10 + 42 % 10 = 12
5 nb ← 4 car 42 // 10 = 4
3 4 > 0 renvoie true donc le programme entre dans la boucle
4 bn ← 124 car 12 * 10 + 4 % 10 = 142
5 nb ← 0 car 4 // 10 = 0
3 0 > 0 renvoie false donc le programme se poursuit après la boucle
6 Le programme affiche 124 dans la console

Ce programme prend un nombre en paramètre et renvoie un nombre dont les chiffres sont dans l'ordre inverse.

Application sans incrémentation

Application V_app1

Sur feuille :

def input_voyelle():
    v = input("Entrer une voyelle : ")
    while v not in "aeiouyAEIOUY":
        v = input("Ce n'est pas une voyelle. Entrer une voyelle : ")
    return v

1) Expliquer ce que fait la fonction ci-dessus.

2) Écrire la docstring de la fonction.

Application V_app2

Écrire une fonction qui permet à l'utilisateur de saisir un nombre entier compris entre 1 et 100, puis renvoie cet entier.

La fonction doit redemander un nombre entier tant que ce nombre n'est entier et pas compris entre 1 et 100.

On supposera que l'utilisateur entre effectivement un nombre entier.

Complément

Python, documentation officielle : L'instruction while