Exercice 1 : résolution en Python

 Énoncé 1 

Le programme doit lire des nombres au clavier jusqu'à trouver la valeur 0 (zéro). Le programme doit alors signaler en quelle position ce 0 est apparu dans la liste des nombres lus. Une analyse préliminaire est indispensable (notamment pour identifier le(s) "tour(s) de main" requis).

 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 signaler en quelle position sera apparu le 0 dans la liste... il faudra donc compter la quantité de nombres lus;
    • Cela nécessitera donc le tour de main du compteur.
  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
  4. Qu'est-ce qui viendra dans la répétitive ?
    • Le fait de demander un nombre à l'utilisateur et de le lire;
    • Le fait d'incrémenter le compteur, c'est-à-dire y ajouter 1 à chaque boucle.
  5. Qu'est-ce qui arrêtera la répétitive ?
    • Le fait que le nombre lu soit égal à 0;
    • Notez qu'il ne s'agit pas du caractère "0" entre guillemets mais bien de la valeur 0 sans guillemets.
  6. Qu'est-ce qui viendra après la répétitive ?
    • L'affichage qui signale la position du 0 dans la liste, ce qui revient à afficher la valeur de compteur.

 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. Il faudra veiller à ce que ce soit toujours le cas sous peine d'erreur d'exécution. C'était le cas dans le transporteur de valises, le dépouilleur d'enquêtes,... Nous aurons l'occasion d'attirer votre attention sur ce fait quand il se présentera... c'est-à-dire déjà dans cet exercice (voir ci-dessous).

Voici le programme en pseudo-code :

Affiche+nl "Ce programme va lire des nombre en s'arrêtant à 0. Il va alors afficher la position du 0 dans la liste des nombres lus."
compteur ← 0
Répète
    Affiche "Donne-moi un nombre : "
    Lis et colle sur nombre
    compteur ← compteur + 1
Jusqu'à ce que nombre = 0
Affiche+nl "0 était en position ", compteur, " dans la liste."

L'inverse de la condition nombre = 0 sera nombre ≠ 0.

 Le programme en Python 

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

  1. La première fois qu'on fera appel à la variable nombre est dans le while, c'est-à-dire en lecture, ce qui n'est pas permis (variable vide);
  2. Il faudra donc initialiser nombre avec une valeur avant la boucle while;
  3. Cette valeur peut être n'importe quoi SAUF 0 sinon le programme sautera la boucle dès qu'il y arrivera.
  4. Enfin, il faudra lire au clavier une valeur et non des caractères, ce qui est le cas par défaut pour input;
  5. On transformera directement la chaîne de caractère en entier grâce à la fonction int().
  6. Et, pour terminer, il faut toujours veiller à la robustesse du programme... que se passe-t-il si vous entrer la valeur "zéro" ? Et si vous tapez -0 ?
  7. Question : que se passe-t-il si vous supprimez la fonction int() du programme ? Comment pouvez-vous expliquer cela ?
print ("Ce programme va lire des nombres en s'arrêtant à 0. Il va alors afficher la position du 0 dans la liste des nombres lus.")
compteur = 0
nombre = 1
while nombre != 0 :
    nombre = int(input("Donne-moi un nombre : "))
    compteur += 1
print ("0 était en position", compteur, "dans la liste.")

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

Le programme ci-dessus n'est pas robuste. Si vous tapez des lettres dans vos nombres, une erreur apparaît et le programme "plante". Cela n'est pas acceptable dans des programmes professionnels. Votre qualité de codeuse ou codeur sera évaluée notamment sur la robustesse de vos programmes, c'est-à-dire leur capacité à résister à des erreurs d'entrées des utilisateurs.

Une méthode est de lire sans restriction tout ce que l'utilisateur peut taper au clavier sans que cela provoque une erreur et d'ensuite vérifier si cette entrée correspond à ce qu'on attend. Si ce n'est pas le cas, la lecture recommencera jusqu'à ce que l'entrée corresponde à ce qui est attendu.

Dans le cas qui nous occupe, une méthode Python isnumeric() permet de vérifier si une chaîne de caractères correspond à un nombre entier positif (elle retournera True) ou pas (elle retournera False).

  • Si le résultat est True, on transforme la chaîne de caractères en entier (ce n'est pas automatique) et on continue le programme;
  • Si le résultat est False, on recommence la lecture du nombre demandé jusqu'à ce qu'il soit conforme. Bien entendu, les entrées erronés ne sont pas comprises dans le comptage des nombres lus.

L'acceptation de nombres entiers négatifs demandera un traitement un peu plus complexe mais il est un peu tôt pour entrer dans ces détails.

print ("Ce programme va lire des nombres ENTIERS POSITIFS en s'arrêtant à 0. Il va alors afficher la position du 0 dans la liste des nombres lus.")
compteur = 0
nombre = 1
while nombre != 0 :
    nombre = input("Donnez-moi un nombre : ")
    while not nombre.isnumeric() :
        nombre = input("Erreur, veuillez me donner un nombre entier positif : ")
    nombre = int(nombre) # Le type de la variable va passer de chaîne de caractères à entier
    compteur += 1
print ("0 était en position", compteur, "dans la liste.")

Veuillez tester ce programme pour vérifier sa robustesse et sa correspondance avec les spécifications de départ.

Bonne poursuite de votre apprentissage.

Retour