|
Rappel : ce cours d'algorithmique et de programmation est enseigné à l'Université Paris 7, dans la spécialité PISE du Master SSAMECI (ancien DESS A.I.G.E.S.) par Christophe Darmangeat |
|
PARTIE 11
Corrigés des Exercices
Exercice 11.1
Voilà un début en douceur...
Fonction Sum(a, b, c, d, e)
Renvoyer a + b + c + d + e FinFonction
Fonction NbVoyelles(Mot en Caractère)
Variables i, nb en Numérique Pour i ← 1 à Len(Mot) Si Trouve("aeiouy", Mid(Mot, i, 1)) <> 0 Alors nb ← nb + 1 FinSi i suivant Renvoyer nb FinFonction
Fonction Trouve(a, b)
Variable i en Numérique Début i ← 1 TantQue i < Len(a) - Len(b) et b <> Mid(a, i, Len(b)) i ← i + 1 FinTantQue Si b <> Mid(a, i, Len(b)) Alors Renvoyer 0 Sinon Renvoyer i FinFonction
Quelques
explications : on lit intégralement le fichier contenant la liste des mots.
Au fur et à mesure, on range ces mots dans le tableau Liste, qui est
redimensionné à chaque tour de boucle. Un tirage aléatoire intervient alors,
qui permet de renvoyer un des mots au hasard.
Fonction ChoixDuMot()
Tableau Liste() en Caractère Variables Nbmots, Choisi en Numérique Ouvrir "Dico.txt" sur 1 en Lecture Nbmots ← -1 Tantque Non EOF(1) Nbmots ← Nbmots + 1 Redim Liste(Nbmots) LireFichier 1, Liste(Nbmots) FinTantQue Fermer 1 Choisi ← Ent(Alea() * Nbmots) Renvoyer Liste(Choisi) FinFonction
retour au cours
On commence
par vérifier le nombre de mauvaises réponses, motif de défaite. Ensuite, on
regarde si la partie est gagnée, traitement qui s’apparente à une gestion de Flag
: il suffit que l’une des lettres du mot à
deviner n’ait pas été trouvée pour que la partie ne soit pas gagnée. La
fonction aura besoin, comme arguments, du tableau Verif, de son nombre
d’éléments et du nombre actuel de mauvaises réponses.
Fonction PartieFinie(t() en Booleen, n, x en Numérique)
Variables i, issue en Numerique Si x = 10 Alors Renvoyer 2 Sinon Issue ← 1 Pour i ← 0 à n Si Non t(i) Alors Issue ← 0 FinSi i suivant Renvoyer Issue FinSi FinFonction
Une même boucle nous permet de considérer une par une les lettres du mot à trouver
(variable m), et de savoir si ces lettres ont été identifiées ou non.
Procédure AffichageMot(m en Caractère par Valeur, t() en Booléen par Valeur)
Variable Aff en Caractere Variable i en Numerique Aff ← "" Pour i ← 0 à len(m) - 1 Si Non t(i) Alors Aff ← Aff & "-" Sinon Aff ← Aff & Mid(mot, i + 1, 1) FinSi i suivant Ecrire Aff FinProcédure
Remarque :
cette procédure aurait également pu être écrite sous la forme d'une
fonction, qui aurait renvoyé vers la procédure principale la chaîne de
caractères Aff. L'écriture à l'écran de cette chaîne Aff aurait alors été
faite par la procédure principale.
Voilà donc une situation où on peut assez indifféremment opter pour une sous-procédure ou pour une fonction.
On vérifie
que le signe entré (paramètre b) est bien une seule lettre, qui ne figure
pas dans les propositions précédemment effectuées (paramètre a)
Procédure SaisieLettre(a, b en Caractère par Référence)
Variable Correct en Booleen Variable Alpha en Caractere Début Correct ← Faux Alpha ← "ABCDEFGHIJKLMNOPQRSTUVWXYZ" TantQue Non Correct Ecrire "Entrez la lettre proposée : " Lire b Si Trouve(alpha, b) = 0 Ou len(b) <> 1 Alors Ecrire "Ce n’est pas une lettre !" SinonSi Trouve(a, b) <> 0 Alors Ecrire "Lettre déjà proposée !" Sinon Correct ← Vrai a ← a & b FinSi FinTantQue Fin Procédure
Les paramètres
se multiplient… L est la lettre proposée, t() le tableau de booléens, M le
mot à trouver et N le nombre de mauvaises propositions. Il n’y a pas de
difficulté majeure dans cette procédure : on examine les lettres de M une à
une, et on en tire les conséquences. Le flag sert à savoir si la lettre
proposée faisait ou non partie du mot à deviner.
Procédure VerifLettre(L, M en Caractère par Valeur, t() en Booléen par
Référence, N en Numérique par Référence)
Variable Correct en Booleen Début Correct ← Faux Pour i ← 1 à Len(M) Si Mid(M, i, 1) = L Alors Correct ← Vrai T(i - 1) ← Vrai FinSi FinTantQue Si Non Correct Alors N ← N + 1 FinSi Fin Procédure
Procédure Epilogue(M en Caractère par Valeur, N en
Numérique par Valeur)
Début Si N = 2 Alors Ecrire "Une mauvaise proposition de trop… Partie terminée !" Ecrire "Le mot à deviner était : ", M Sinon Ecrire "Bravo ! Vous avez trouvé !" FinSi Fin Procédure
Procédure Principale
Variables Lettre, Mot, Propos en Caractere Variables g i, MovRep en Numérique Tableau Verif() en Booleen Début Mot ← ChoixDuMot() Propos ← "" Lettre ← "" Redim Verif(Len(Mot)-1) Pour i ← 0 à Len(Mot)-1 Verif(i) ← Faux i suivant k ← 0 Tantque k = 0 AffichageMot(Mot, Verif()) SaisieLettre(Propos, Lettre) VerifLettre(Lettre, Mot, Verif(), MovRep) k ← PartieFinie(Verif(), len(mot), MovRep) FinTantQue Epilogue(Mot, k) Fin |