Skip to content
Snippets Groups Projects
Commit 5e5fa802 authored by mathieu.schiess@edu.ge.ch's avatar mathieu.schiess@edu.ge.ch
Browse files

séparations propre du NB sur les boucle while

parent b297368f
Branches main
No related tags found
No related merge requests found
%% Cell type:markdown id: tags:
<div style="padding:20px;background-color:papayawhip;" >
<h3 style="color:chocolate"> <i class="fa fa-info" aria-hidden="true"> </i> &nbsp; Remarque introductive &nbsp; <i class="fa fa-info" aria-hidden="true"></h3>
<p> Ce fichier est fait pour être lu sur le site <a href="https://notebook.basthon.fr/"><img src='https://notebook.basthon.fr/assets/efede5218c9087496f16.png' style="border: 0; display:inline; margin: 0 5px; height:30px" alt="Basthon"/></a>. <br>
Si vous l'avez ouvert avec un autre programme, comme Jupyter notebook, vous riquez de rencontrer quelques bugs. <br>
Veuillez cliquez sur <a href="https://notebook.basthon.fr/">ce lien</a> et y charger ce fichier à l'aide du bouton "Ouvrir" &nbsp; <i class="fa fa-folder" aria-hidden="true"> </i>
</p> </div>
%% Cell type:markdown id: tags:
# 7 - Boucle `while`
# 7 - Boucle `while`, partie 1
Dans ce chapitre, nous découvrons un deuxième type de boucle, la boucle `while`. Elle est souvent utilisée pour attendre quelque chose. Nous allons voir que :
- la boucle `while` répète aussi longtemps qu'une condition est vraie,
- le mot-clé `break` permet de sortir de la boucle.
Dans ce chapitre, nous découvrons un deuxième type de boucle, la boucle `while`.
## Boucles « tant que »
Nous avons déjà rencontré d'une part la structure de la boucle `for`, qui permet d'effectuer un nombre prédéfini d'itérations d'un bloc d'instructions, et d'autre part le branchement conditionnel `if`, qui permet d'exécuter ou non un bloc d'instructions en fonction d'un test effectué sur le moment.
Les boucles « tant que », ou boucle `while`, combinent ces deux principes d'une nouvelle manière en conditionnant la poursuite des itérations à un test effectué préalablement à chaque tour de boucle.
%% Cell type:markdown id: tags:
<h3 style="color:chocolate;background-color:papayawhip;" > <i class="fa fa-question" aria-hidden="true"> </i> &nbsp; Quizz </h3>
```
En Python, while permet de réaliser :
A) une fonction
B) une condition
C) une boucle
D) aucune des réponses précédentes
```
%% Cell type:raw id: tags:
Ma réponse:
%% Cell type:markdown id: tags:
<details>
<summary style="border-left:3px solid #3c763d; border-radius:2pt; width:100%; color:#3c763d; padding:6px; background-color: #dff0d8">
Réponse
</summary>
<div style="border-left:3px solid #3c763d; border-radius:2pt; color:#3c763d; padding:6px; background-color: #eff0e8">C) une boucle
</div>
</details>
%% Cell type:markdown id: tags:
## Boucles « tant que » en Python
La syntaxe de la boucle while est :
![Sytaxe d'une boucle while](https://githepia.hesge.ch/info_sismondi/exercices-1ere/-/raw/main/Notebooks/imgs_chap7/while-loop.png)
`condition` a pour valeur `True` ou `False`.
## Lien avec les boucle `for`
Il est toujours possible de remplacer une boucle `for` par une boucle `while` comme ceci est illustré dans l'exemple suivant.
%% Cell type:markdown id: tags:
### Exemple 1 : Compteur trivial
L'exemple suivant permet d'afficher un compteur allant de 1 à 10. À chaque début
de boucle, le programme va évaluer la condition `compteur <= 10` puis exécuter le
bloc d'instruction si elle vaut `True` et sortir de la boucle si elle vaut `False`.
%% Cell type:code id: tags:
``` python
compteur = 1
while compteur <= 10:
print(compteur)
compteur = compteur + 1
```
%% Cell type:markdown id: tags:
Avec une boucle `for`, on pourrait réécrire le programme comme
%% Cell type:code id: tags:
``` python
compteur = 1
for _ in range(10):
print(compteur)
compteur = compteur + 1
```
%% Cell type:markdown id: tags:
Ou plus simplement en utilisant l'indice
%% Cell type:code id: tags:
``` python
for i in range(10):
print(i+1)
```
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 1: Compteur </h3>
Écrire un programme avec une boucle `while` qui affiche les nombres de 0 à 50.
%% Cell type:code id: tags:
``` python
# votre programme
```
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 2: Compteur pair </h3>
Tester ci-dessous le programme suivant:
```python
x = 0
for _ in range(26):
print(x)
x = x + 2
```
Puis réécrire ce programme en remplaçant la boucle `for` par une boucle `while`.
%% Cell type:code id: tags:
``` python
# votre programme
```
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 3: Compteur décroissant </h3>
Écrire un programme qui affiche une compte à rebour de 20 à 0
%% Cell type:code id: tags:
``` python
# votre programme
```
%% Cell type:markdown id: tags:
## Quand utiliser une boucle `while`
!!! info Utilisation
Bien qu'il est possible d'utiliser une boucle `while` à la place d'une boucle `for`, il est recommendé d'utiliser systématiquement la boucle `for` lorsqu'elle est suffisante et de limiter l'usage de la boucle `while` aux cas dans lesquels on ne connait pas à l'avance le nombre d'itérations ou les valeurs de la variable de la boucle.
La boucle while est typiquement utilisée pour traiter des problèmes tels que :
👉 Faire quelque chose tant qu'une condition est vraie
!!!
%% Cell type:markdown id: tags:
<h3 > Exemple 2: Faire une somme</h3>
Nous utilisons une boucle `while` pour demander des nombres à l'utilisateur-trice.
On ne peut pas savoir à l'avance combien de nombres il y aura, et donc nous ne pouvons pas utiliser la boucle `for`. Nous prenons comme condition de terminaison une réponse avec le nombre 0.
Entrez les frais de vos 3 derniers achats.
%% Cell type:code id: tags:
``` python
somme = 0
nombre = float(input('Entrez un nombre: '))
while nombre != 0:
somme = somme + nombre
nombre = float(input('Entrez un nombre: '))
print('somme =', somme)
```
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 4: Faire une moyenne</h3>
1. En utilisant l'exemple du programme précédent, compléter le programme suivant en remplaçant les ... afin d'avoir un programme qui permet de calculer des moyennes.
2. Utiliser le programme pour calculer votre moyenne générale au premier semestre.
%% Cell type:code id: tags:
``` python
somme = 0
nombre_de_note = 0
note = float(input('Entrez une note: '))
while note != 0:
# compléter le code à la place des ...
somme = ...
nombre_de_note = ...
note = float(input('Entrez un nombre: '))
print('moyenne =', somme/nombre_de_note)
```
%% Cell type:raw id: tags:
Votre moyenne générale au premier semestre est :
Réponse :
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 5: Les interêts </h3>
On place un capital de 500CHF sur un compte rémunéré à 3% par an.
Le programme ci-dessous a pour but de calculer le nombre d'années au bout desquelles le capital
sera doublé (plus grand que 1000CHF).
```Python
S = 500
annee = 0
while S < 1000 :
S = S + (3/100) * S
annee = annee + 1
print("Le capital sera doublé après ",annee, " ans")
```
Le problème est que le programme contient une erreur !
1. Corriger le programme afin qu’il atteigne le but espéré, puis le tester.
%% Cell type:code id: tags:
``` python
# version à corriger du programme
S = 500
annee = 0
while S < 1000 :
S = S + (3/100) * S
annee = annee + 1
print("Le capital sera doublé après ",annee, " ans")
```
%% Cell type:raw id: tags:
Après combien d'année le capital aura doublé?
Réponse:
%% Cell type:markdown id: tags:
2. Modifier le programme précédent de telle sorte que le capital et le taux de rémunération soient saisis en entrée (instruction `input`). Tester le programme pour savoir au bout de combien d'année un capital de 5 CHF aura doublé si il est rémunéré à 4% par an.
%% Cell type:code id: tags:
``` python
# version du programme avec des input
```
%% Cell type:raw id: tags:
Après combien d'année un capital de 5 CHF rémunéré à 4% aura doublé?
Réponse:
%% Cell type:code id: tags:
``` python
```
%% Cell type:markdown id: tags:
## Les pièges
### Piège 1: oublier d'initialiser les variables présenta dans la condition du `while`
On veut un programme qui demande un mot de passe qui reste bloqué tant que le bon mot de passe n'est par fourni. On serait tenter d'écrire
%% Cell type:code id: tags:
``` python
while mot_de_passe != "123456" :
mot_de_passe = input("Entrez le mot de passe : ")
```
%% Cell type:markdown id: tags:
Le programme génère une erreur car pour tester la condition `mot_de_passe != "123456"` il faut en premier attribuer une valeur à la variable `mot_de_passe` comme cela est fait dans le programme suivant:
%% Cell type:code id: tags:
``` python
mot_de_passe = "" # Initialisation de la variable
while mot_de_passe != "123456" :
mot_de_passe = input("Entrez le mot de passe : ")
```
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 5: Saisie sécurisée </h3>
Ecrire une programme qui demande une note. Tant que la note n'est pas valable (c'est-à-dire entre 0 et 6), le programme repose la question (`input`).
%% Cell type:code id: tags:
``` python
# mon programme
```
%% Cell type:markdown id: tags:
### Piège 2: tomber dans une boucle infinie
Il est fréquent d'oublier une ligne de code, et d'écrire une boucle while qui ne se termine pas.
Par exemple, dans le programme
```python
n = 0
while n < 10 :
print(n)
```
La condition `n < 10` sera toujours vraie car on a oublié d'incrémenter la variable. Il aurait fallut écrire
```python
n = 0
while n < 10 :
print(n)
n = n + 1
```
%% Cell type:markdown id: tags:
<h3 style="color:chocolate;background-color:papayawhip;" > <i class="fa fa-question" aria-hidden="true"> </i> &nbsp; Quizz </h3>
Parmi les programme suivant choisi celui qui part en boucle infini.
<input type="checkbox" > **Programme A**
```python
i = A - 1
while i < A :
i = i - 1
```
<input type="checkbox" > **Programme B**
```python
i = A + 1
while i < A :
i = i - 1
```
<input type="checkbox" > **Programme C**
```python
i = A + 1
while i < A :
i = i + 1
```
<input type="checkbox" > **Programme D**
```python
i = A - 1
while i < A :
i = i + 1
```
%% Cell type:markdown id: tags:
<details>
<summary style="border-left:3px solid #3c763d; border-radius:2pt; width:100%; color:#3c763d; padding:6px; background-color: #dff0d8">
Réponse
</summary>
<div style="border-left:3px solid #3c763d; border-radius:2pt; color:#3c763d; padding:6px; background-color: #eff0e8">Programme A) car i est décrémenté, donc il devient de plus en plus petit et il ne dépassera jamais A et la condition i < A sera toujours vraie
</div>
</details>
%% Cell type:markdown id: tags:
## Simuler l'exécution d'une boucle while
Il est parfois difficile de debugger un programme avec une boucle `while`. Dans cette optique, il est utile de simuler l'exécution de la boucle en notant l'évolution des variables et de la condition d'arrêt dans un tableau.
<h3 > Exemple 3: Simuler l'exécution d'un programme</h3>
Le programme suivant
```python
n = 100
p = 1
while p < n:
p = 2 * p
print(p)
```
cherche la première puissance de 2 plus grande qu’un entier `n` donné. La boucle fait prendre à `p` les valeurs 2, 4, 8, 16,. . . Elle s’arrête dès que la puissance de 2 est supérieure ou égale à `n`, donc ici ce programme affiche toutes les puissante jusqu'à 128 (compris). Le détail de l’exécution du programme est résumé dans le tableau ci-dessous:
| `p` | `n` | `p < n ` |
| :---: |:-------:| :-------:|
| 1 | 100 | `True` |
| 2 | 100 | `True` |
| 4 | 100 | `True` |
| 8 | 100 | `True` |
| 16 | 100 | `True` |
| 32 | 100 | `True` |
| 64 | 100 | `True` |
| 128 | 100 | `False` |
Dans les notebook, on peut toujours vérifier l'exécution d'un programme avec le module `tutor`.
!!! info Utilisation de tutor
Pou exécuter un programme "pas à pas", il suffit d'importer le module `tutor` au début de votre programme avec l'instruction `from tutor import tutor` puis de terminer le programme avec l'instruction `tutor()`
!!!
**A faire:**
Vérifier que le tableau ci-dessus est correct en éxécutant le programme ci-dessous:
%% Cell type:code id: tags:
``` python
from tutor import tutor
n = 100
p = 1
while p < n:
p = 2 * p
print(p)
tutor()
```
%% Cell type:markdown id: tags:
<h3 style="color:chocolate;background-color:papayawhip;" > <i class="fa fa-question" aria-hidden="true"> </i> &nbsp; Quizz </h3>
Quelle est la valeur affichée par le programme ci-dessous ?
```python
u = 5
n = 0
while u != 656:
u = 5 * u + 1
n = n + 1
print ( n )
```
%% Cell type:raw id: tags:
Réponse:
%% Cell type:markdown id: tags:
<details>
<summary style="border-left:3px solid #3c763d; border-radius:2pt; width:100%; color:#3c763d; padding:6px; background-color: #dff0d8">
Réponse
</summary>
<div style="border-left:3px solid #3c763d; border-radius:2pt; color:#3c763d; padding:6px; background-color: #eff0e8">C'est 3 car après 3 itérations u vaut 656
</div>
</details>
%% Cell type:markdown id: tags:
<h3 style="color:chocolate;background-color:papayawhip;" > <i class="fa fa-question" aria-hidden="true"> </i> &nbsp; Quizz </h3>
Quelle est la valeur affichée par le programme ci-dessous ?
```python
u = 5
v = 12
i = 1
while u < v:
u = 3 * u + 2
v = 2 * v + 3
i = i + 1
print ( i )
```
%% Cell type:raw id: tags:
Réponse:
%% Cell type:markdown id: tags:
<details>
<summary style="border-left:3px solid #3c763d; border-radius:2pt; width:100%; color:#3c763d; padding:6px; background-color: #dff0d8">
Réponse
</summary>
<div style="border-left:3px solid #3c763d; border-radius:2pt; color:#3c763d; padding:6px; background-color: #eff0e8">C'est 3 car après 3 itérations u vaut 656
</div>
</details>
%% Cell type:markdown id: tags:
<h3 style="color:chocolate;background-color:papayawhip;" > <i class="fa fa-question" aria-hidden="true"> </i> &nbsp; Quizz </h3>
Quelle valeur faut-il donner à la variable `k` pour que le programme ci-dessous affiche 7?
```python
k = int(input("Quel valeur pour k ? "))
n = 0
while k != 1:
n = n + 1
k = k / 2
print ( n )
```
%% Cell type:raw id: tags:
Réponse:
%% Cell type:markdown id: tags:
<details>
<summary style="border-left:3px solid #3c763d; border-radius:2pt; width:100%; color:#3c763d; padding:6px; background-color: #dff0d8">
Réponse
</summary>
<div style="border-left:3px solid #3c763d; border-radius:2pt; color:#3c763d; padding:6px; background-color: #eff0e8">C'est 128. En effet il faut diviser 7 fois 128 par 2 pour avoir 1.
</div>
</details>
%% Cell type:markdown id: tags:
---
# 🎯 **Conclusion : Quand utiliser `while` ?**
| Situation | `for` | `while` |
|-----------|-------|---------|
| Nombre d'itérations connu à l'avance | ✅ Oui | ❌ Non |
| Nombre d'itérations inconnu (dépend d'une condition) | ❌ Non | ✅ Oui |
| Répéter une action jusqu'à un événement spécifique | ❌ Non | ✅ Oui |
| Interaction utilisateur (ex: attendre une entrée correcte) | ❌ Non | ✅ Oui |
| Boucles infinies avec condition d’arrêt | ❌ Risqué | ✅ Plus adapté |
## 📌 **À retenir**
- **Utilise `for`** lorsque **le nombre d'itérations est fixé** (ex: parcourir une liste, boucle de comptage).
- **Utilise `while`** lorsque **la boucle dépend d’une condition** qui peut varier (ex: entrée utilisateur, événement aléatoire, suivi d'une valeur dynamique).
- **Attention aux boucles infinies !** Toujours s'assurer que la condition de sortie est bien définie.
🚀 **Exercez-vous** en adaptant les exercices et en créant vos propres scénarios d'utilisation de `while` !
---
%% Cell type:markdown id: tags:
## Pour aller plus loin...
%% Cell type:markdown id: tags:
<h3> Exemple 4: Décomposer en facteurs premiers</h3>
Le programme suivant réalise la décomposition en facteurs premiers d'un nombre donné par l'utilisateur-trice.
%% Cell type:code id: tags:
``` python
nombre = int(input('Entrez un entier: '))
i = 2
print(nombre, "=", end=" ")
while i < nombre:
if nombre % i == 0: # % est le reste de la division entière
print(i, "·", end=" ")
nombre = nombre // i # // correspond à la division entière
else:
i = i + 1
print(nombre)
```
%% Cell type:markdown id: tags:
<h3 > Exemple 5: En code binaire</h3>
Le programme transforme l'entier en code binaire.
%% Cell type:code id: tags:
``` python
n = int(input('Entrez un entier: '))
code = ''
while n > 0:
if n % 2 == 1:
code = '1' + code
else:
code = '0' + code
n = n // 2
print(code)
```
%% Cell type:markdown id: tags:
## Sortir avec `break`
Le mot-clé `break`, seul sur une ligne, permet de sortir d'une boucle.
Souvent cette méthode est utilisée pour avoir une boucle où la condition est testée à la fin.
%% Cell type:code id: tags:
``` python
while True:
mot_de_passe = input("Entrez le mot de passe : ")
if mot_de_passe == "123456":
print("Mot de passe valide")
break
print("Mot de passe invalide")
```
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 7: nombre de chiffre d'un nombre </h3>
Ecrire un programme qui demande un nombre à l'utilisateur puis affiche le combien de chiffre sont nécessaires pour écrire ce nombre. Par exemple, le nombre 74613 s'écrit avec 5 chiffres
*Indication : Faites des divisions entières par 10 successivement*
%% Cell type:code id: tags:
``` python
```
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 8: Le trait qui tourne </h3>
💡 **Objectif** : En répétant plusieurs fois je dessine un trait et je tourne d'un angle, je dessine une figure.
Suivre les indications suivantes:
- le stylo de couleur bleu avance sur un segment droit de longueur 5;
- puis tourne de 70° vers la droite.
- Ensuite, la longueur du segment est incrémentée (augmentée de 0.5).
- Répéter ces étapes tant que la longueur du segment est inférieure à 150.
Tester ensuite le programme avec une rotation de 89° au lieu de 70°.
Dessinez une usine avec un toit en dents de scie.
![Image de tourbillon](https://githepia.hesge.ch/info_sismondi/exercices-1ere/-/raw/main/Notebooks/imgs_chap7/tourbillon.png)
%% Cell type:code id: tags:
``` python
```
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 9: Ratrapper la tortue </h3>
Une tortue s'élance sur une piste de 10 mètres de long. Le jour, elle parcourt 1 mètre, la nuit, elle
se repose.
Seulement, voilà, la piste, en caoutchouc, s'étire toutes les nuits de 10 mètres. Ainsi, au deuxième
matin, la tortue se retrouve à deux mètres du début de la piste, mais à 18 mètres de son extrémité.
Lorsqu'elle s'endort le soir, il lui reste encore 17 mètres à parcourir. Et lorsqu'elle se réveille le matin suivant, la piste a 30 mètres de long, dont plus de 25 mètres sont
devant elle!
a) La tortue arrivera-t-elle au bout de la piste?
b) Si oui, en combien de temps?
c) Rédiger un script qui détermine le nombre de jours.
*Indication : calculer la fraction de la piste que la tortue parcours chaque jour.*
%% Cell type:code id: tags:
``` python
```
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 10: La balle rebondissante </h3>
Une balle rebondissante est lâchée du haut d'un immeuble de 10 mètres. A chaque rebond la hauteur diminue d'un tiers. Combien de fois la personne du premier niveau dont la fenêtre est située à 1 mètre 50 du sol verra elle passer la balle ?
%% Cell type:code id: tags:
``` python
```
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 11: La suite de Syracuse </h3>
On définit une suite $u_n$ de la manière suivante :
- $u_0 = 1000$
- si $u_n = 1$, alors la suite est finie et u n est son dernier élément (on arrête de calculer d’autres
éléments)
- si $u_n$ est pair, alors $u_{n+1} = u_n / 2$
- si $u_n$ est impair et distinct de 1, alors $u_{n+1} = 3 u_n + 1$
Écrire un programme qui affiche les termes de la suite u.
Cette suite est-elle finie ?
Pour aller plus loin, aller vous renseigner sur la Conjecture de Syracuse https://fr.wikipedia.org/wiki/Conjecture_de_Syracuse.
%% Cell type:markdown id: tags:
---
#### Remarque générale
Ce document est une adaptation d'un ressource pédagogique tiré du catalogue modulo https://modulo-info.ch/. Il est sous license Creative Commons [BY-NC-SA](https://creativecommons.org/licenses/?lang=fr)
![Licence Creative Commons](https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png)
......
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment