lundi 21 novembre 2011

Corrigés des exercices(Partie11)

Exercice 11.1
Voilà un début en douceur...
Fonction Sum(a, b, c, d, e)
  Renvoyer a + b + c + d + e
FinFonction

Exercice 11.2
Fonction NbVoyelles(Mot en Caractère)
Variables i, nb en Numérique
nb ← 0
Pour i ← 1 à Len(Mot)
  Si Trouve("aeiouy", Mid(Mot, i, 1)) <> 0 Alors
    nb ← nb + 1
  FinSi
suivant
Renvoyer nb
FinFonction

Exercice 11.3
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

Exercice 11.4
Fonction PurgeSimple(a, b)
Variable Sortie en Caractère
Variable i en Numérique
Début
Sortie ← ''
Pour i ← 1 à Len(a)
   Si Mid(a, i, 1) <> b Alors
      Sortie ← Sortie & Mid(a, i, 1)
   FinSi
suivant
Renvoyer Sortie
FinFonction

Exercice 11.5
Fonction PurgeMultiple(a, b)
Variable Sortie en Caractère
Variable i en Numérique
Début
Sortie ← ''
Pour i ← 1 à Len(a)
   Si Trouve(b, Mid(a, i, 1)) = 0 Alors
      Sortie ← Sortie & Mid(a, i, 1)
   FinSi
suivant
Renvoyer Sortie
FinFonction

Exercice 11.6
Fonction TriTableau(T, n)
Variables i, posmini, temp en Numérique
Début
Pour i ← 0 à n-2
   posmini ← i
   Pour j ← i + 1 à n-1
      Si t(j) < t(posmini) Alors
         posmini ← j
      Finsi
   j suivant
   temp ← T(posmini)
   T(posmini) ← T(i)
   T(i) ← temp
suivant
Renvoyer T
FinFonction

Exercice 11.7
Fonction TableauCroissant(T, n)
Variable i en Numérique
Variable Flag en Booléen
Début
Flag ← VRAI
i ← 0
TantQue Flag et i < n-1
   Flag ← T(i) < T(i+1)
   i ← i+1
FinTantQue
Renvoyer Flag
FinFonction

Exercice 11.8
Procédure Inversion(X en Numérique par référence, Y en Numérique par référence)
Variable Temp en Numérique
Début
Temp ← X
X ← Y
Y ← Temp
FinProcédure

Exercice 11.9
Fonction TriTableau(T, n, Croissant)
Variables i, pos, temp en Numérique
Début
Pour i ← 0 à n-2
   pos ← i
   Pour j ← i + 1 à n-1
      Si Croissant Alors
         Si t(j) < t(pos) Alors
            pos ← j
         Finsi
      Sinon
         Si t(j) > t(pos) Alors
            pos ← j
         Finsi
      Finsi
   j suivant
   temp ← T(pos)
   T(pos) ← T(i)
   T(i) ← temp
suivant
Renvoyer T
FinFonction

Fonction ChoixDuMot
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

Fonction PartieFinie
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

Procédure AffichageMot
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
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.

Procédure SaisieLettre
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

Procédure VerifLettre
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
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
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
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

 
;