Exercice 9 : résolution en Python

 Énoncé 9 

Le programme doit lire des nombres entiers positifs en demandant au préalable à l'utilisateur combien de nombres seront à lire (robustesse!). Le programme affiche alors le plus petit et le plus grand des nombres lus.

 Analyse 

La succession de questions à se poser est la suivante :

  1. Ce programme nécessite-t-il une répétitive ?
    • La réponse est "Oui";
    • Il est maintenant superflu de se demander si ce sera un Répète ou un Tant que du fait qu'en Python, seul le Tant que existe.
  2. Ce programme nécessite-t-il un ou plusieurs tours de main ?
    • Le programme doit lire une certaine quantité de nombres... il faudra donc les compter grâce au tour de main du compteur;
    • Il faudra afficher le plus petit et le plus grand nombre de la liste, il faudra utiliser le tour de main du plus petit - plus grand.
  3. Qu'est-ce qui viendra avant la répétitive ?
    • Le fait de prévenir l'utilisateur de ce que fera le programme;
    • Le fait d'initialiser le compteur à zéro
    • Le fait de demander à l'utilisateur la quantité de nombres à lire et de la lire;
      • Attention, danger... il faudra surveiller l'entrée de l'utilisateur : un entier plus grand que 0.
  4. Qu'est-ce qui viendra dans la répétitive ?
    • Le fait de demander un nombre à l'utilisateur et de le lire;
      • Attention, danger... il faudra surveiller l'entrée de l'utilisateur : un entier positif.
    • Le fait d'incrémenter le compteur, c'est-à-dire y ajouter 1 à chaque boucle.
    • Le fait d'appliquer le tour de main du plus_petit et du plus_grand, à savoir :
      • Lors de la lecture du premier nombre, le copier automatiquement dans plus_petit et dans plus_grand;
      • Par la suite, pour chaque nombre, vérifier s'il est plus petit que plus_petit. Si c'est le cas, le copier dans plus_petit;
      • Et vérifier s'il est plus grand que plus_grand. Si c'est le cas, le copier dans plus_grand.
  5. Qu'est-ce qui arrêtera la répétitive ?
    • Le fait que le compteur soit égal à quantité;
  6. Qu'est-ce qui viendra après la répétitive ?
    • Les affichages qui signalent le plus petit nombre de la liste et le plus grand nombre de la liste.

 Le programme en pseudo-code 

Nous allons prendre l'habitude d'écrire le programme en pseudo-code avec un Répète, ce qui facilitera l'établissement de la condition d'arrêt (le cerveau réfléchit plus facilement "à l'endroit" qu'à "l'envers"). Il suffira alors de transformer le Répète en Tant que en appliquant le théorème de de Morgan à la condition d'arrêt que l'on aura trouvée.

Attention : La transformation n'est pas toujours aussi simple, il faut toujours veiller à ce que la condition vérifie "quelque chose" qui existe.

Voici le programme en pseudo-code :

Affiche+nl "Le programme va vous demander combien de nombres entiers positifs seront à lire. Le programme affichera ensuite le plus petit et le plus grand des nombres lus."
compteur ← 0
Affiche+nl "Combien de nombres seront à lire (un entier > 0) : "
Lis et colle sur quantite
Tant Que (quantite n'est pas un entier positif *) OU (quantité = 0) Fais
    Affiche+nl "Erreur, veuillez donner un entier > 0 : "
    Lis et colle sur quantite
Fin Tant Que
Répète
    Affiche "Donne-moi un nombre : "
    Lis et colle sur nombre
    Tant Que (nombre n'est pas un entier positif *) Fais
        Affiche "Erreur, veuillez donner un entier positif : "
        Lis et colle sur nombre
    Fin Tant Que
    compteur ← compteur + 1
    Si compteur = 1 Alors
         plus_petit ← nombre
         plus_grand ← nombre
    Sinon
        Si nombre < plus_petit Alors
             plus_petit ← nombre
        Fin Si
        Si nombre > plus_grand Alors
             plus_grand ← nombre
        Fin Si
    Fin Si
Jusqu'à ce que compteur = quantite
Affiche+nl "Le plus petit nombre de la liste était ", plus_petit, "."
Affiche+nl "Le plus grand nombre de la liste était ", plus_grand, "."

* Nous n'allons pas nous appesantir sur la façon de vérifier si le nombre est un entier positif, une méthode toute faite existe en Python (voir exercice 1) et nous utiliserons celle-là.

L'inverse de la condition compteur = quantite sera compteur ≠ quantite.

 Le programme en Python 

Voici ce que cela donne en Python en tenant compte d'un certain nombre de points importants :

  1. Pour une fois, les deux boucles while vont tester des variables qui auront déjà été affectées. C'est assez rare pour le signaler.
  2. La robustesse nous oblige à lire une quantite entière > à 0. 0 provoquerait l'affichage des deux variables plus_petit et plus_grand vides.
  3. Comme signalé auparavant, une lecture au clavier est de type chaîne de caractères. Lorsqu'on voudra vérifier si quantite contient 0, ce sera sous la forme "0" (caractère) et non 0 (valeur) et seulement avec les comparateurs == et !=, les comparateurs < et > étant plutôt réservés aux valeurs.
  4. Les valeurs lues dans nombre doivent être des nombres entiers positifs, les chaînes de caractères ne fonctionneraient pas dans la comparaison des valeurs pour trouver le plus petit et le plus grand nombre;
  5. Lorsque vous maîtriserez mieux le langage, nous pourrons nous lancer dans la vérification de nombres décimaux, négatifs,... mais c'est encore un peu tôt.
print ("Le programme va vous demander combien de nombres entiers positifs seront à lire. Le programme affichera ensuite le plus petit et le plus grand des nombres lus.")
compteur = 0
quantite = input("Combien de nombres seront à lire (un entier > 0) : ")
while not quantite.isnumeric() or quantite == "0" :
    quantite = input("Erreur, veuillez entrer un nombre entier supérieur à 0 : ")
quantite = int(quantite)
while compteur != quantite :
    nombre = input("Donnez-moi un nombre entier positif : ")
    while not nombre.isnumeric() :
        nombre = input("Erreur, veuillez entrer un nombre entier positif correct : ")
    nombre = int(nombre)
    compteur += 1
    if compteur == 1 :
        plus_petit = nombre
        plus_grand = nombre
    else :
        if nombre < plus_petit :
            plus_petit = nombre
        if nombre > plus_grand :
            plus_grand = nombre
print ("Le plus petit nombre de la liste était", plus_petit)
print ("Le plus grand nombre de la liste était", plus_grand)

Vous pouvez "copier-coller" ce programme dans votre éditeur IDLE pour vérifier s'il fonctionne selon les spécifications de départ. Essayez toutes les possibilités afin de valider ce programme.

 Codez "robuste" !!! 

Toute lecture au clavier est un danger pour votre programme car l'utilisateur peut taper "n'importe quoi".

Nous avons fait le nécessaire pour chaque entrée au clavier étant donné qu'il n'y a que des nombres à lire. Le programme est donc sécurisé.

Bonne poursuite de votre apprentissage.

Retour