Énoncé 3
Le programme doit lire des mots jusqu'à trouver 1 mot demandé au préalable à l'utilisateur. Le programme doit ensuite signaler si ce mot était dans les 2 premiers mots lus, entre le 3ème et le 5ème ou plus loin dans la liste. (NB: "au préalable" veut dire "avant".)
Analyse
La succession de questions à se poser est la suivante :
- 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.
- Ce programme nécessite-t-il un ou plusieurs tours de main ?
- Le programme doit signaler la position du dernier mot lu dans la liste... il faudra donc compter les mots. Le tour de main du compteur est donc nécessaire;
- Pour le reste, il suffira de vérifier à chaque boucle si le mot qu'on vient de lire est égal au mot demandé au préalable. Il n'y a donc pas d'autre tour de main.
- 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 le mot d'arrêt à l'utilisateur et de le lire;
- Qu'est-ce qui viendra dans la répétitive ?
- Le fait de demander un mot à l'utilisateur et de le lire;
- Le fait d'incrémenter le compteur, c'est-à-dire y ajouter 1 à chaque boucle.
- Qu'est-ce qui arrêtera la répétitive ?
- Le fait que le mot qu'on vient de lire soit égal au mot d'arrêt demandé au préalable à l'utilisateur;
- Qu'est-ce qui viendra après la répétitive ?
- Une cascade de Si qui permettra de signaler la position du mot qui a stoppé la lecture.
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.
En fonction de toutes les réponses ci-dessus, voici le programme en pseudo-code :
Affiche+nl "Le programme va vous demander un mot qui provoquera l'arrêt de la lecture et ensuite lire des mots jusqu'à trouver le mot demandé. Le programme va ensuite signaler la position du dernier mot lu dans la liste."compteur ← 0
Affiche+nl "Donnez-moi le mot qui provoquera l'arrêt de la lecture : "
Lis et colle sur arret
Répète
Affiche "Donne-moi un mot : "
Lis et colle sur mot
compteur ← compteur + 1
Jusqu'à ce que mot = arret
Si compteur < 3 Alors
Affiche+nl "Le mot d'arrêt était dans les 2 premiers mots lus."
Sinon
Si compteur < 6 Alors
Affiche+nl "Le mot d'arrêt était entre le 3ème et le 5ème mot lu."
Sinon
Affiche+nl "Le mot d'arrêt était plus loin que le 5ème mot dans la liste."
Fin Si
Fin Si
Remarque 1 : au second Si, il est inutile d'ajouter que le compteur soit ≥ à 3 puisqu'on est dans le Sinon du premier Si, la "zone" où d'office le compteur sera ≥ à 3. De même, pour le dernier affichage, il est inutile de remettre une condition car on se trouve dans la "zone" où le compteur est d'office ≥ à 6 (Sinon du < 6). C'est tout l'intérêt des cascades de Si.
Remarque 2 : il faut se rendre compte que l'utilisateur ne verra qu'un seul des 3 affichages. Dans le dernier affichage, il est insuffisant de signaler que "le mot était plus loin dans la liste" car l'utilisateur ne saura pas de quoi on parle.
L'inverse de la condition mot = arret sera mot ≠ arret.
Le programme en Python
Voici ce que cela donne en Python en tenant compte d'un certain nombre de points importants :
- La première fois qu'on fera appel à la variable mot est dans le while, c'est-à-dire en lecture, ce qui n'est pas permis (variable vide);
- Il faudra donc initialiser mot avec une chaîne de caractères avant la boucle while;
- Cette chaîne de caractères peut être n'importe quoi SAUF le contenu de la variable arret sinon le programme sautera la boucle dès qu'il y arrivera.
- Nous pourrions mettre la chaîne vide "" dans mot, mais c'est peut-être justement ce que recherche l'utilisateur du programme.
- Pour éviter toute erreur, nous initialiserons mot en y plaçant, par exemple, "Hello" suivi du contenu de arret. Aucune erreur possible dans ce cas.
- Concernant la robustesse du programme, question qu'il faut systématiquement se poser, on ne manipule que des chaînes de caractères en provenance du clavier, il n'y a donc rien à craindre quoi que tape l'utilisateur en entrée.
print ("Le programme va vous demander un mot qui provoquera l'arrêt de la lecture et ensuite lire des mots jusqu'à trouver le mot demandé. Le programme va ensuite signaler la position du dernier mot lu dans la liste.")
compteur = 0 arret = input("Quel sera le mot qui provoquera l'arrêt de la lecture ? ") mot = "Hello" + arret while mot != arret : mot = input("Donnez-moi un mot : ") compteur += 1 if compteur < 3 : print ("Le mot d'arrêt était dans les 2 premiers mots lus.") elif compteur < 6 : print ("Le mot d'arrêt était entre le 3ème et le 5ème mot lu.") else : print ("Le mot d'arrêt était plus loin que le 5ème mot dans la liste.") |
Remarque : la cascade de Si est tellement importante que la plupart des langages informatiques prévoient une contraction du Sinon Si grâce au mot réservé elif (contraction de else if). Ceci facilite l'écriture des cascades de Si.
Vous pouvez "copier-coller" ce programme dans votre éditeur IDLE pour vérifier s'il fonctionne selon les spécifications de départ.
Comment pourriez-vous vérifier le contenu par lequel la variable mot est initialisée ? Cela vous servira pour plus tard.
Codez "robuste" !!!
Comme indiqué plus haut, la question de la robustesse doit se poser d'office dès que votre programme effectue une lecture au clavier. Vous devez anticiper ce qui peut se passer en fonction des réactions multiples et variées de l'utilisateur.
Dans le programme actuel, seules des chaînes de caractères en provenance du clavier sont manipulées, il n'y a donc rien à craindre.
Bonne poursuite de votre apprentissage.