Chap. 06 — Contrôle du flot d’exécution d’un programme, les structures itératives

Chap. 06 — Contrôle du flot d’exécution d’un programme, les structures itérativesStructures itérativesRemarques.La boucle Tant que, l’instruction whilePrésentationSyntaxe de la boucle Tant que en PythonLa bouclePour (en fait Pour Chaque)PrésentationSyntaxe en PythonAttention !Syntaxe.L'itérable rangeAttention !Les instructions break et continuebreakcontinueEn résuméExercices du chapitre (version while)Exercice 1Exercice 2Exercice 3Exercice 4Exercice 5Exercice 6Exercice 7Exercice 8Exercice 9Exercice 10Exercice 11Exercice 12Exercice 13Exercice 14Exercice 15Exercice 16Exercice 17Exercices du chapitre (version for)Exercices de réflexion du chapitreExercice : Code ISBNExercice : Le taxi de RamanujanExercice : Calendrier (très difficile)


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.

Structures itératives

Les langages de programmation proposent généralement deux types de boucles, les boucles déterministes et les boucles non déterministes :

Remarques.

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.

while-avec-compteur-autonome
while-sans-compteur-autonome

Syntaxe de la boucle Tant que en Python

La bouclePour (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 bouclePour .

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.

À l’issue de chaque itération la valeur du compteur est incrémentée automatiquement.

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 du nombre n passé en argument.

Attention !

La variable qui sert de compteur de boucle (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.

Syntaxe.

Le mot clé for permet de créer une boucle Pour chaque. Python parcourt alors les éléments d’un itérable (comme une séquence, une liste, un tulle, etc.) 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, liste, tulle, etc.) pour pouvoir l’utiliser dans le bloc suite_à_répéter.

L'itérable range

L’itérable range permet d’utiliser la bouclePour chaque du langage Python d’une façon comparable aux boucles Pour des autres langages, c’est à dire en incrémentant une variable et en arrêtant la boucle une fois que la valeur finale a été atteinte.

L’itérable 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.

Trois syntaxes sont possibles :

Attention !

De façon générale, tous les intervalles, en Python, sont du type [debut, fin[.

Exemples.

Les instructions break et continue

break

L’instruction 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.

L’instruction break est très utile pour quitter des « boucles infinies », créées par exemple à l’aide de l’entête : while True:.

Exemple. 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.

continue

L’instruction 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 (peut 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):

Les deux fonctions dans l’exemple ci-dessus utilisent les deux structures de boucles implémentées en Python ; continue peut donc être utilisée quelle que soit la boucle.

En résumé

break-continue-autonome

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 :

  1. Examiner le code, repérer les instructions concernées par la boucle et déterminer l'instruction de fin de boucle.
  2. Quelle est l'instruction qui permet de modifier le résultat de l'évaluation du test de sortie de boucle ?
  3. 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.
  4. Visualiser le fonctionnement de cette fonction à l'aide du « débuggeur » intégré au logiciel Thonny.
  5. 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.
  6. Quel est le calcul réalisé par ce programme ?

Solution
  1. Code :
    
    while r != 0:
      a = b
      b = r
      r = a % b
    
    Fin de boucle lorsque r = 0.
  2. Instruction qui permet de modifier le résultat de l'évaluation de l'expression booléenne : r = a % b.
  3. Valeur retournée : 6
  4. Touches Ctrl + F5.
  5. Valeur retournée : 1
  6. Cette fonction détermine le pgcd des deux nombres.

Exercice 2

Soit la fonction suivante :

  1. Examiner le code, repérer les instructions concernées par la boucle et déterminer l'instruction de fin de boucle.
  2. Quelle est l'instruction qui permet de modifier le résultat de l'évaluation du test de sortie de boucle ?
  3. 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 ?
  4. 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.
  5. Visualiser le fonctionnement de cette fonction à l'aide du « débuggeur » intégré au logiciel Thonny.
  6. Quel est le calcul réalisé par ce programme ?

Solution
  1. Code :
    
    while i <= a:
          b *= i
          i += 1
    
    Fin de boucle lorsque i = a + 1.
  2. Instruction qui permet de modifier le résultat de l'évaluation de l'expression booléenne : i += 1.
  3. Valeur retournée : 720
  4. Touches Ctrl + F5.
  5. Cette fonction retourne le résultat du calcul : 1 x 2 x 3 x ... x 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 :


Solution

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 :


Solution

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 :


Solution

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 :


Solution

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 :


Solution

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, ...).

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 :


Solution

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 :

{{% note warning %}} La fonction 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. {{% /note %}}

La specification de la fonction est :


Solution

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.


Solution

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 :


Solution

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.


Solution

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.


Solution

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.


Solution

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


Solution

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


Solution

Exercice 17

Écrire et exécuter une fonction qui détermine les n premiers termes de la « suite de Fibonacci » définie par :

Cette fonction doit recevoir en argument la valeur de et retourner la suite de nombres sous forme de chaîne de caractères. Spécification de la fonction :


Solution

Exercices du chapitre (version for)

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.


Solution

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 soit un multiple de 11 (ici représente la valeur du ième chiffre du code, en partant de la droite).

Exemple. La somme de contrôle du code commençant par 020131452 est 5 puisque 5 est la seule valeur de comprise entre 0 et 10 (exclu) telle que 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 : Le taxi de Ramanujan

Srinivasa Ramanujan était un mathématicien indien célèbre pour son intuition dans la manipulation des nombres. Alors que le mathématicien anglais G. H. Hardy lui rendait visite, ce dernier remarqua que le numéro du taxi dans lequel ils se déplaçaient était 1729 : « Voilà un nombre sans relief ! », déclara-t-il alors. Ramanujan répondit aussitôt : « Pas du tout Hardy ! Pas du tout ! C'est au contraire un nombre très intéressant. C'est le plus petit nombre que l'on peut exprimer comme la somme de deux nombres au cube, et ce de deux façons différentes ! »

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 — 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 , , et , plus petits que , tels que .

Aide. Utiliser quatre boucles imbriquées.

Exercice : Calendrier (très difficile)

Écrire et exécuter une fonction qui affiche un calendrier qui va du 1er janvier 2001 au 31 décembre 3000. Description.

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