Ce chapitre reprend l’étude de structures de contrôles, c’est à dire d’instructions qui permettent de modifier le « flot d’exécution implicite » d’un programme.
Après les structures conditionnelles (ou alternatives), les structures itératives (ou boucles) sont introduites.
Introduction
Les boucles sont des instructions répétitives. Comme les tests conditionnels, elles nécessitent la définition de blocs d’instructions. Les instructions de ces blocs sont répétées tant qu’une condition d’arrêt n’est pas vérifiée. Chaque passage dans la boucle s’appelle une itération.
Les langages de programmation proposent généralement deux types de boucles, les boucles déterministes et les boucles non déterministes :
-
Une boucle déterministe (ou boucle Pour) est une boucle dont on connaît à l’avance le nombre d’itérations.
Une boucle Pour utilise une variable pour compter le nombre d’itérations effectuées : le compteur de boucle. -
Une boucle non déterministe (ou boucle conditionnelle) est une boucle dont on ne connaît pas à l’avance le nombre d’itérations. La boucle s’arrête si une condition d’arrêt intervient mais on ne sait pas à l’avance quand !
Les boucles non déterministes les plus courantes sont les boucles Tant Que, Faire Tant Que et Répéter Jusqu’à.
Remarques
- Pour ce qui concerne les boucles non déterministes, le langage Python ne possède que la boucle Tant que.
- L’implémentation de la boucle déterministe Pour dans Python est particulière, c’est en fait une boucle Pour chaque.
- Faire « tourner une boucle à la main » est le seul moyen fiable pour bien comprendre son fonctionnement. On applique méthodiquement les instructions et on compare les résultats obtenus à chaque itération avec les valeurs espérées.
- Il est nécessaire de porter une grande attention à la condition d’arrêt d’une boucle non déterministe. Si cette dernière n’est jamais réalisée, on parle de « boucle infinie », c’est à dire d’un processus qui se répète infiniment.
La boucle Tant que, l’instruction while
Présentation
L’expression conditionnelle d’une boucle Tant que est évaluée au début de chaque itération, ce qui permet de l’exécuter un nombre quelconque de fois. Il est même possible que les instructions contenues dans cette structure ne soient jamais exécutées si l’expression booléenne vaut Faux dès sa première évaluation.
Les instructions d’une boucle Tant que sont exécutées tant que l’expression booléenne est évaluée à Vrai.
Syntaxe de la boucle Tant que en Python
|
|
La boucle Pour (en fait Pour Chaque)
Présentation
La boucle Pour Chaque s’écrit for
en Python. Cette structure de boucle n’existe pas dans tous les langages. Dans la plupart des langages l’instruction for
implémente la boucle Pour.
Les domaines d’application de cette boucle sont, par exemple, le parcours des tableaux, puisqu’on connaît le nombre de cases qui les constituent, ou les traitements de données, leur nombre étant connu à l’avance.
Syntaxe en Python
La syntaxe de la boucle Pour chaque en Python est illustrée sur un exemple. La fonction ci-dessous retourne une chaîne de caractères formée de la liste des éléments de la table de multiplication du nombre n
passé en argument.
|
|
element
dans l’exemple précédent) ne doit jamais être modifiée dans la boucle, ce qui exclut la possibilité de changer sa valeur par une affectation. Dans le cas contraire, le comportement de la boucle est indéterminé ; elle peut très bien s’arrêter immédiatement, comme devenir infinie.
La boucle for
parcourt les éléments d’un itérable (comme une séquence ou un itérateur) et se termine quand tous les éléments sont épuisés. Sa syntaxe est :
|
|
À chaque itération, la variable d’itération element
prend la valeur de l’élément courant de l’itérable (séquence, itérateur ou tout objet supportant l’itération) pour pouvoir l’utiliser dans le bloc suite_à_répéter
.
L’itérateur range
L’itérateur range
permet d’utiliser l’instruction for
du langage Python d’une façon comparable à celle des autres langages, c’est à dire en incrémentant une variable et en arrêtant la boucle une fois qu’une valeur a été atteinte, ou qu’une condition n’est plus satisfaite.
L’itérateur range
génère à la volée, et selon le besoin, des nombres entiers compris entre une valeur de départ début
et une valeur finale fin
, par pas de pas
. La syntaxe de ce générateur peut prendre trois formes :
|
|
|
|
|
|
Exemples
|
|
Les instructions break
et continue
break
break
met fin à la boucle courante et reprend l’exécution à la première instruction qui suit la structure itérative. On l’utilise généralement quand une condition externe est déclenchée (habituellement en testant avec une instruction if
), exigeant une sortie immédiate de la boucle. Elle s’utilise aussi bien dans les boucles Pour que dans les boucles Tant Que.
break
est très utile pour quitter des « boucles infinies », créées par exemple à l’aide de l’entête : while True:
.
Exemples
Les fonctions ci-dessous déterminent (par une méthode loin d’être efficace) le plus grand diviseur d’un nombre entré par l’utilisateur (variable nbre
). On teste tous les nombres qui pourraient être des diviseurs du nombre, en utilisant la variable diviseur
et en la décrémentant d’une unité pour chaque valeur qui ne divise pas le nombre. Le premier nombre qui divise exactement nbre
est le plus grand diviseur. Ce nombre trouvé, il est inutile de poursuivre la boucle, on la quitte grâce à l’instruction break
. Les deux fonctions utilisent les deux structures de boucles implémentées en Python ; break
peut donc être utilisée quelle que soit la boucle.
|
|
Dans le second exemple, on remarque que les variables définies dans une boucle Pour chaque en Python sont globales : on peut accéder à leur valeur depuis l’extérieur de la boucle.
continue
continue
termine ou ignore le reste des instructions de l’itération courante et remonte au début : le test pour une boucle non déterministe, l’itération suivante (s’il reste des itérations à parcourir) pour une boucle déterministe.
Exemple.
La fonction ci-dessous fournit une illustration (peu pertinente il est vrai !) de l’utilisation de l’instruction continue
en retournant une chaîne de caractères constituée de tous les nombres qui ne divisent pas un nombre passé en argument.
|
|
Remarque. Comme dit en introduction de ces codes, l’exemple choisi n’est pas très pertinent, on peut écrire plus clairement (sans utiliser continue
) :
|
|
continue
peut donc être utilisée quelle que soit la boucle.
En résumé
Exercices du chapitre (version while
)
Remarque. Dans cette première série d’exercices n’utiliser que la structure Tant que.
Exercice 1
Soit la fonction suivante :
|
|
- Examiner le code, repérer les instructions concernées par la boucle et déterminer l’instruction de fin de boucle.
- Quelle est l’instruction qui permet de modifier le résultat de l’évaluation du test de sortie de boucle ?
- En supposant que la fonction soit appelée avec les valeurs 30 et 42, exécuter le programme à la main et déterminer la valeur retournée. Pour s’aider, construire un tableau d’évolution du contenu de chaque variable utilisée.
Vérifier le résultat obtenu en exécutant le programme. - Visualiser le fonctionnement de cette fonction à l’aide du « débuggeur » intégré au logiciel Thonny.
- En supposant que la fonction soit appelée avec les valeurs 35 et 6, exécuter le programme à la main et déterminer la valeur retournée. Pour s’aider, construire un tableau d’évolution du contenu de chaque variable utilisée.
Vérifier le résultat obtenu en exécutant le programme. - Quel est le calcul réalisé par ce programme ?
Réponses
- Structure itérative :
|
|
Fin de boucle lorsque $r=0$.
-
Instruction qui permet de modifier le résultat de l’évaluation de l’expression booléenne :
r = a % b
. -
Valeur retournée : 6
-
Touches Ctrl + F5.
-
Valeur retournée : 1
-
Cette fonction détermine le pgcd des deux nombres.
Exercice 2
Soit la fonction suivante :
|
|
- Examiner le code, repérer les instructions concernées par la boucle et déterminer l’instruction de fin de boucle.
- Quelle est l’instruction qui permet de modifier le résultat de l’évaluation du test de sortie de boucle ?
- Quelle est la valeur initiale de la variable
i
et quelle est sa valeur en sortie de boucle ? Combien de tours sont réalisés ? - En supposant que la fonction soit appelée avec la valeur 6, exécuter le programme à la main et déterminer la valeur retournée. Pour s’aider, construire un tableau d’évolution du contenu de chaque variable utilisée.
Vérifier le résultat obtenu en exécutant le programme. - Visualiser le fonctionnement de cette fonction à l’aide du « débuggeur » intégré au logiciel Thonny.
- Quel est le calcul réalisé par ce programme ?
Réponses
|
|
Fin de boucle lorsque $i = a + 1$.
-
Instruction qui permet de modifier le résultat de l’évaluation de l’expression booléenne :
i += 1
. -
Valeur retournée : 720
-
Touches Ctrl + F5.
-
Cette fonction retourne le résultat du calcul : $1\times 2\times 3\times\ldots\times a$, c’est à dire la factorielle de $a$, $a!$.
Exercice 3
Écrire et exécuter une fonction qui retourne une chaîne de caractères formée par une suite de 12 nombres entiers dont chaque terme est égal au triple du terme précédent, à partir du premier entier a passé en argument. La spécification de la fonction est :
|
|
Réponse
|
|
Exercice 4
Écrire et exécuter une fonction qui retourne une chaîne de caractères formée par une suite des 10 premiers termes de la table de multiplication d’un entier a passé en argument. La spécification de la fonction est :
|
|
Réponse
|
|
Exercice 5
Écrire et exécuter une fonction qui retourne une chaîne de caractères formée par une suite des 10 premiers termes de la table de multiplication d’un entier a passé en argument en signalant au passage (à l’aide d’un astérisque) ceux qui sont des multiples de 3. La spécification de la fonction est :
|
|
Réponse
|
|
Exercice 6
Écrire et exécuter une fonction qui calcule les 50 premiers termes de la table de multiplication d’un nombre a passé en argument mais qui retourne une chaîne de caractères formée seulement par ceux qui sont des multiples de 7. La spécification de la fonction est :
|
|
Réponse
|
|
Exercice 7
Écrire et exécuter une fonction qui calcule et retourne une chaîne de caractères formée de la liste des diviseurs du nombre passé en argument. La spécification de la fonction est :
|
|
Réponse
|
|
Exercice 8
Écrire une fonction qui retourne une chaîne de caractère formée des 10 premiers termes de la table de multiplication de 1 à 10. Le caractère de passage à la ligne \n
doit être utilisé afin de séparer les différentes tables (de 2, de 3, etc.).
Remarque : Utiliser deux boucles imbriquées.
La spécification de la fonction est :
|
|
Remarque : Afin de visualiser le résultat sous forme d’un tableau, utiliser l’instruction suivante, dans la console, pour tester la fonction :
|
|
Réponse
|
|
input
retourne toujours une chaîne de caractères. Il est donc nécessaire d’effectuer une conversion si ce que l’utilisateur a entré est d’un autre type.
Exercice 9
Écrire et exécuter une fonction qui demande 10 nombres à l’utilisateur et qui détermine lequel est le plus grand et lequel est le plus petit. Les deux résultats sont retournés au sein d’une unique chaîne de caractères.
Remarque : la fonction qui permet de récupérer du texte entré au clavier est input
:
|
|
La specification de la fonction est :
|
|
Réponse
|
|
Exercice 10
Reprendre l’exercice précédent mais en faisant en sorte que le nombre de valeurs demandées à l’utilisateur soit passé en argument à la fonction.
Réponse
|
|
Exercice 11
Écrire et exécuter une fonction qui demande à l’utilisateur d’entrer 10 notes et qui retourne la moyenne de ces notes. La spécification de la fonction est :
|
|
Réponse
|
|
Exercice 12
Modifier le programme précédent de façon à ce que le nombre de notes à prendre en compte soit passé en argument de la fonction.
Réponse
|
|
Exercice 13
Modifier le programme précédent de façon à ce que l’utilisateur n’ait pas à indiquer le nombre de notes qu’il souhaite saisir. Une note négative terminer la saisie.
Remarque : la fonction doit afficher le nombre de notes saisies, elle retourne donc une chaîne de caractères.
Réponse
|
|
Exercice 14
Écrire et exécuter une fonction qui simule un tirage du Loto (s’aider de l’exercice 12 du chapitre 02). La spécification de la fonction est
|
|
Remarque. Normalement, lorsqu’un numéro est tiré, il ne peut pas apparaître à nouveau. On acceptera cependant qu’un même numéro puisse apparaitre plusieurs fois puisqu’on ne connaît pas encore de structure de contrôle qui permet de facilement « stocker » plusieurs valeurs.
Réponse
|
|
Exercice 15
Écrire et exécuter une fonction qui tire au hasard un nombre entier compris entre 1 et 50 et demande à l’utilisateur de le deviner.
Cette fonction doit indiquer à l’utilisateur si sa tentative est trop grande ou trop petite et quitter dès l’instant où il a deviné le nombre en indiquant le nombre de tentatives.
Remarque. La fonction ne doit rien retourner, elle doit utiliser la fonction print
pour afficher à l’écran les informations. Sa spécification est
|
|
Réponse
|
|
Exercice 16
Écrire et exécuter une fonction qui affiche l’alphabet à l’endroit si elle reçoit l’argument "croissant"
ou à l’envers si elle reçoit l’argument "decroissant"
.
Remarque. On peut obtenir le code décimal d’un caractère à l’aide de la fonction ord
. À l’opposé, le caractère correspondant à un entier naturel dans la table ASCII est obtenu (si possible) à l’aide de la fonction chr
.
La spécification de la fonction est
|
|
Réponse
|
|
Exercice 17
Écrire et exécuter une fonction qui détermine les n premiers termes de la « suite de Fibonacci » définie par : $$ \begin{aligned} u_1 &= 1\\ u_2 &= 1\\ u_n &= u_{n-1} + u_{n-2} \text{ pour } n > 2 \end{aligned} $$
Cette fonction doit recevoir en argument la valeur de $n$ et retourner la suite de nombres sous forme de chaîne de caractères. Spécification de la fonction :
|
|
Réponse
|
|
Exercices du chapitre (version for
)
Exercices
Reprendre les exercices 3, 4, 5, 6, 7, 9, 10, 11, 12, 14, 16 de la section précédente et les ré-écrire à l’aide de l’instruction for
.
Réponses
|
|
Exercices de réflexion du chapitre
Exercice : Code ISBN
L’« International Standard Book Number » (ISBN) est un code à dix chiffres qui identifie de manière unique un livre. Le chiffre le plus à droite de ce code est la somme de contrôle (Wikipedia) : il est calculé, de manière unique, à partir des valeurs des neuf autres chiffres. Sa valeur est telle que $d_1 + 2 d_2 + 3 d_3 + \ldots + 10 d_{10}$ soit un multiple de 11 (ici $d_i$ représente la valeur du ième chiffre du code, en partant de la droite).
Exemple. La la somme de contrôle du code commençant par 020131452 est 5 puisque 5 est la seule valeur de $x$ comprise entre 0 et 10 (exclu) telle que $$10 \cdot 0 + 9 \cdot 2 + 8 \cdot 0 + 7 \cdot 1 + 6 \times 3 + 5 \times 1 + 4 \times 4 + 3 \times 5+ 2 \times 2 + 1 \times x$$ soit un multiple de 11.
Écrire une fonction qui demande à l’utilisateur les 9 premiers chiffres d’un code ISBN et qui retourne le code ISBN sous forme d’une chaîne de caractères.
Exercice : Calendrier (difficile)
Écrire et exécuter une fonction qui affiche un calendrier qui va du 1er janvier 2001 au 31 décembre 3000.
Description
-
Les années multiples de quatre sont bissextiles, sauf les années multiples de cent qui ne le sont pas, à l’exception des années multiples de quatre cents qui le sont. Ainsi, 2100, 2200, 2300, 2500, 2600, 2700, 2900 et 3000 ne sont pas bissextiles mais 2400 et 2800 le sont.
-
Ajouter à ce calendrier le nombre de jours écoulés depuis le début du calendrier.
-
Ajouter à ce calendrier le jour de la semaine.
Exemple de sortie
1 lundi 1 janvier 2001 2 mardi 2 janvier 2001 … 365241 mardi 30 décembre 3000 365242 mercredi 31 décembre 3000
Exercice : Le taxi de Ramanujan (difficile)
L’objectif de la fonction que vous allez écrire est de trouver la liste de tous les entiers plus petits (ou égaux à) qu’un nombre $N$ — choisi par l’utilisateur — qui peuvent être exprimés comme la somme de deux nombres au cube, de deux façons différentes.
En d’autres termes, le problème consiste à trouver quatre entiers $a$, $b$, $c$ et $d$, plus petits que $N$, tels que $a^3 + b^3 = c^3 + d^3$.
Aide. Utiliser quatre boucles imbriquées.