TD D1 : Boucles conditionnelles WHILE¶
L'objectif de ce notebook est de revoir assez rapidement la notion de répétitions sous la forme de boucle *tant que...*
Il y a de nombreuses façons de réaliser des répétitions en informatique, mais la plus universelle est la boucle while.
La structure d'une boucle conditionnelle en python est la suivante:
!!! note Boucle conditionnelle (simple)
while condition :
bloc d'instructions
!!!
Exemple 1¶
Dans le TDC1, on a écrit un programme qui demandait à l'utilisateur de saisir un entier entre 1 et 7 et qui affichait le jour de la semaine correspondant :
# rappel du programme version 1:
semaine = ['lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche']
rep = int(input("Saisir un entier entre 1 et 7 :"))
print(f"Vous avez choisi le {semaine[rep-1]}")
Un problème survient lorsque l'utilisateur saisit un eniter non compris entre 1 et 7, le prgoramme renvoie une erreur. On a un peu amélioré la chose ainsi :
# rappel du programme version 2:
semaine = ['lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche']
rep = int(input("Saisir un entier entre 1 et 7 :"))
if 1<= rep <= 7 :
print(f"Vous avez choisi le {semaine[rep-1]}")
else :
print("Vous devez saisir un nombre entier entre 1 et 7")
Cette fois-ci, si l'utilisateur entre un entier non compris entre 1 et 7, le programme affiche un message d'erreur, mais s'arrête. On souhaiterait modifier ce programme pour qu'il demande de saisir le nombre entier tant que la saisie n'est pas comprise entre 1 et 7...
# Programme modifié:
semaine = ['lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche']
# à compléter...
Exemple 2¶
La boucle while est très pratique par exemple pour déterminer des "seuils".
Par exemple, si l'on souhaite résoudre dans $\mathbb N$, l'inéquation $2^n>1\,000\,000$, une méthode consiste à tester toutes les valeurs de l'entier n jusqu'à trouver la première qui convienne. Compléter le programme suivant :
n = 1
while # à compléter..... :
n = n + 1
print(f"La plus petite valeur n telle que 2**n>1000000 est n={n}")
# doit afficher : ... est n=20
Remarque 1: Noter la syntaxe bien pratique des f-string (la chaine de caractère précédée de la lettre f) pour afficher le résultat...
Remarque 2: on peut bien entendu retrouver ce résultat sans boucle si l'on connait la fonction logarithme népérien :
from math import log # importe la fonction logarithme népérien depuis le module math
print(log(1000000)/log(2))
# affiche : 19.931568569324174
!!! warning Attention
Pour de telles boucles la condition de l'arrêt doit toujours être posée. Dans le cas précédent, on "sait" que la fonction $n\mapsto 2^n$ est croissante et tend vers l'infini, donc on est assuré qu'à partir d'un certain moment la condition 2**n < 1000000
sera fausse et que la boucle s'arrêtera.
!!!
Exercice 1¶
Q1. Compélter le script suivant qui doit donner le plus petit entier $n$ tel que : $\ln(n)>10$
from math import log as ln # la fonction ln rest maintenant disponible
# à compléter
print(f"le plus petit entier solution est n={n}")
Exercice 2¶
L'objectif de cet exercice est de résoudre l'inéquation suivante où $n$ est un entier positif: $$ 1+2+3+\ldots+n \geqslant 1000$$
Q2. Compléter le script suivant pour résoudre cette inéquation.
somme = 0
n = 0
while # à compléter
n = # à completer
somme = somme + # à compléter
print(f"solution : tous les entiers supérieurs ou égaux à {n}")
Solution : n = # à compléter
Exercice 3 (épargne)¶
Q3. Imaginons que l'on dispose initialement sur un compte épargne d'une somme de 1000 €. Sachant que cette somme augmente de 3% par an, compléter le script python dans la cellule suivante pour savoir après combien d'années on aura doublé notre investissement.
n = 0
capital = 1000
taux = 0.03
# à compléter
print(f"le capital double apres {n} années")
le capital double apres 24 années
Réponse : # à compléter
Exercice 4 (remoursement crédit)¶
Vous empruntez un capital de somme=100 000 €
à la banque au "taux global de taux=2%
". Pour simplifier un peu on va considérer que vous faites des remboursements annuels de remb=4 500 €
(soit un peu moins de 400 euros par mois). Le principe est le suivant : tous les ans la somme qu'il vous reste à rembourser est augmentée de 2% puis diminuée de 4500 €. Notons n
le nombres d'années nécessaires pour rembourser ce crédit. On a ainsi :
- pour n=0, somme = 100 000
- pour n=1, somme = 100 000*1.02 - 4500 = 97 500
- pour n=2, somme = 97 500*1.02 - 4500 = 94 950
Q4. Compléter le script suivant pour afficher après combien d'années le crédit aura été remboursé :
somme =100000
taux = 0.05
remb = 4500
n = 0
# à compléter
print(f"Le crédit sera remoursé après {n} années")
Réponse : # à compléter
Q5a. Au final quel est le montant total de votre remboursement ? (utilisez la cellule de code ci-dessous pour faire le calcul !)
Réponse : # à compléter
Q5b. Du coup, quel a été le coup de ce crédit ?
Réponse : # à compléter
Q6. Recopier votre script précédent de Q4. ci-dessous et passer le taux à 5%. Que se passe-t-il ?
Réponse : # à compléter
Exercice 5¶
Q7. Aller sur la page de boucles while de coding game lire le cours et faire les QCM.
Pour les plus rapides !
Exercice 6 : la suite de Syracuse¶
La suite de Syracuse est définie de la façon suivante:
!!! note principe de construction de la suite de Syracuse
« On part d'un entier $u_0$. Si cet entier est pair on note $u_1$ la moitié de $u_0$ et s'il est impair on prend pour $u_1$ le triple de $u_0$ auquel on ajoute 1. On recommence alors le procédé avec $u_1$ pour trouver $u_2$ et ainsi de suite... » !!!
Q8. On rappelle les instructions python permettant d'effectuer une division euclidienne :
a // b
: donne le quotient (entier) de la division (euclidienne) de a par b. Par exemple13//2
donne 6.a % b
: donne le reste de la division euclidienne de a par b. Par exemple13 % 2
donne 1. (Cela pourrait servir à déterminer si un nombre est pair ou pas...)
(Remarque, si on n'y arrive pas, on peut utiliser ChatGPT ou Gemini pour demander comment on fait pour déterminer si un nombre est pair en python...)
Écrire alors un script python qui affiche les termes $u_0$ à $u_{20}$ si l'on part de $u_0=13$.
# Afficher les 20 premiers termes de la suite de Syracuse avec u0 = 13
# à compléter
Q9. Une conjecture célèbre prédit que quelle que soit la valeur de $u_0$ choisie, on finit toujours par tomber sur un terme $u_n$ qui vaudra 1. On s'interresse à la suite de Syracuse partant de $u_0=19$. Écrire un script python qui affiche tous les termes jusqu'à obtenir 1. Il doit aussi donner le nombre de termes calculés (on appelle cela la durée du vol).
# Afficher tous les termes de la suite de Syracuse en partant de u0=19 jusqu'à obtenir un=1
# à compléter
Q10 - pour ceux qui sont plus à l'aise - Recopier et améliorer votre script pour qu'il affiche également la plus grande valeur atteinte par la suite (cela s'appelle la hauteur du vol).
# Déterminer la hauteur du vol de la suite de Syracuse partant de u0=19
# à compléter