• Aucun résultat trouvé

? Quelle marche à suivre proposeriez vous ?

2. Simulation du jeu de poker

2.6 Jeu de poker : analyse de second (et troisième) niveaux

2.6.5 Analyse de AVERTIR, INITIALISER_RESULTATS et AFFICHER_RESULTATS

2.6.5.3 AFFICHER_RESULTATS ? Comment dire ?

procedure AFFICHER_RESULTATS;

(* A l'issue des NL lancers, elle fait afficher le nombre de paires obtenues (et stocké dans la composante paire de ResultatsObtenus), puis le nombre de doubles paires, ... *)

begin

writeln('Voici les résultats des ',NL,' lancers :'); writeln;

writeln;

writeln('Nombre de paires : ',ResultatsObtenus[paire]); writeln;

writeln('Nombre de doubles paires : ',ResultatsObtenus [double]); writeln;

writeln('Nombre de brelans : ',ResultatsObtenus[brelan]); writeln;

writeln('Nombre de fulls : ',ResultatsObtenus[full]); writeln;

writeln('Nombre de carrés : ',ResultatsObtenus[carre]); writeln;

writeln('Nombre de pokers : ',ResultatsObtenus[poker]); writeln;

writeln('Appuyez sur Entrée '); readln;

end;

Il n'est plus nécessaire de redonner ici le texte de l'entièreté du programme. Je terminerai simplement en rappelant la structure générale :

Marche à suivre principale SIMULATION_POKER EVALUER_ RESULTAT AFFICHER_ LANCER AVERTIR DETERMINER AFFICHER_ RESULTATS FAIRE_UN_ LANCER INITIALISER_ RESULTATS

3. Conclusions

Nous voici au terme de cet important chapitre : nous y avons découvert que pour programmer une tâche, il ne fallait pas aller d'emblée vers une longue écriture en terme d'actions élémentaires, mais plutôt vers un décorticage de la tâche globale en actions complexes, qui seront à leur tour, ensuite, décortiquées. Cette approche (descendante) permet, lorsqu'on s'intéresse à une des actions complexes apparues lors du décorticage, d'oublier le reste du problème pour se centrer sur l'analyse de cette action complexe particulière. Elle permet donc un travail modulaire.

Cette découpe du travail est rendue possible par le fait que chaque action complexe apparue lors du décorticage initial (analyse de premier niveau) est parfaitement décrite, de manière à ce que son traitement et son analyse soient possibles, sans connaître le reste du problème où elle s'insère.

Evidemment, cette approche peut sembler fort lourde pour l'instant, essentiellement parce que les tâches abordées restent relativement simples, conduisant à des programmes de petite taille. La spécification des actions complexes (procédures) est particulièrement lassante, puisque les marche à suivre résultantes sont souvent plus courtes que ces spécifications. Comme, de plus, nous avons ici l'ensemble du problème sous les yeux, nous n'ignorons pas ce qui se trouve "au-dessus" ou "à côté" du module en train d'être traité. Il n'est donc pas vrai ici que lors de l'ananlyse d'un module nous "oublions" le reste.

Enfin, il est souvent délicat pour les débutants de mettre en oeuvre la démarche descendante : pourquoi choisir tel décorticage et telles actions complexes plutôt que d'autres. Il est vrai que ces décorticages et les modules auxquels ils conduisent sont multiples : l'analyse de premier niveau de l'un ne sera pas celle d'un autre. Pourtant, les principes de cette démarche constituent des guides méthodologiques précieux que le débutant a intérêt à maîtriser et à mettre en oeuvre.

Cette approche descendante s'incarne parfaitement en Pascal à travers les procédures et l'usage des variables de différents niveaux. Nous verrons que, comprise trop strictement, elle

devient absurde : le chapitre suivant en montrera quelques limites. Mais ce n'est pas parce qu'il faut parfois s'en écarter, qu'il n'est pas intéressant de la mettre en pratique.

4. Exercices

1. Que pensez-vous des marches à suivre suivante en ce qui concerne l'action VERIFIER précisée dans la première analyse (page 75).

a.

Place 1 dans C

Tant que C< Compteur et non Egalite

Place Tirages [C] = Tirages [Compteur] dans Egalite Place succ(C) dans C

b.

Pour C allant de 1 à pred(Compteur)

Egalite Tirages [C] = Tirages [Compteur]

c.

Pour C allant de 1 à pred(Compteur)

Si Tirages[C] = Tirages[Compteur] alors

Egalite ← vrai d.

Place 0 dans C Répéter

Place succ(C) dans C

Si Tirages[C] = Tirages[Compteur] alors

Egalite ← vrai

jusqu'à ce que C=pred(Compteur) ou Egalite e.

Place 0 dans C Répéter

Place succ(C) dans C

jusqu'à ce que C=pred(Compteur) ou Tirages[C]=Tirages[Compteur] Place Tirages[C]=Tirages[Compteur] dans Egalite

Pourriez-vous traduire en Pascal celles qui vous ont semblé correctes ?

2. Pourriez-vous programmer la seconde stratégie mise en évidence (page 67) à l'aide d'un tableau entier DejaObtenus.

3. Pourriez-vous écrire un programme qui simule 1000 tirages successifs du Lotto et indique ensuite le numéro "normal" sorti le plus fréquemment et celui sorti le moins souvent (ou la liste s'il y en a plusieurs). Donner les mêmes renseignements en ce qui concerne le numéro complémentaire.

Les divers tirages seront présentés à raison de 10 tirages par écran (avec arrêt après l'affichage de chacun d'eux jusqu'à ce que l'utilisateur presse une touche). Voici les deux premiers et le dernier écran présentant les tirages :

Je vais procéder pour vous à 1000 tirages successifs du Lotto.

Je vous dirai ensuite quel numéro est sorti le plus souvent parmi les numéros normaux et lequel est sorti le moins souvent.

Je vous donnerai aussi les mêmes renseignements pour la sortie du complémentaire.

Appuyez sur la touche Entrée.

Tirage 1 Numéros :18 3 11 25 41 28 Complémentaire :13 Tirage 2 Numéros :1 41 24 5 37 2 Complémentaire :12 Tirage 3 Numéros :20 36 9 41 37 5 Complémentaire :3 Tirage 4 Numéros :9 28 14 4 33 29 Complémentaire :27 Tirage 5 Numéros :10 14 21 32 6 8 Complémentaire :37 Tirage 6 Numéros :16 17 32 33 13 34 Complémentaire :28 Tirage 7 Numéros :23 22 37 29 5 39 Complémentaire :19 Tirage 8 Numéros :35 9 3 21 12 11 Complémentaire :39 Tirage 9 Numéros :39 21 32 4 37 41 Complémentaire :36 Tirage 10 Numéros :17 4 1 5 35 33 Complémentaire :32 Appuyez sur Entrée

Tirage 991 Numéros :26 15 22 37 5 34 Complémentaire :21 Tirage 992 Numéros :7 24 28 22 12 29 Complémentaire :6 Tirage 993 Numéros :6 15 40 32 25 12 Complémentaire :9 Tirage 994 Numéros :4 16 38 1 14 20 Complémentaire :9 Tirage 995 Numéros :29 16 5 12 10 13 Complémentaire :21 Tirage 996 Numéros :19 42 27 41 30 23 Complémentaire :32 Tirage 997 Numéros :38 27 34 4 25 3 Complémentaire :41 Tirage 998 Numéros :41 4 40 8 37 15 Complémentaire :12 Tirage 999 Numéros :9 1 39 26 18 21 Complémentaire :12 Tirage 1000 Numéros :4 15 35 30 41 34 Complémentaire :16 Appuyez sur Entrée

Numéro(s) le(s) plus fréquent(s) : 12 26

Numéro(s) le(s) moins fréquent(s) : 21

Complémentaire(s) le(s) plus fréquent(s) : 4 12 33

Complémentaire(s) le(s) moins fréquent(s) : 11 40

On veillera à adopter une approche descendante qui s'inspire d'une des stratégies développées plus haut et à réutiliser au maximum les actions complexes mises en évidence. 4.! Le traitement à automatiser (donc à programmer) est le suivant :

On souhaite fournir une somme (entière et strictement positive) représentant un montant en francs belges et obtenir sa décomposition en coupures utilisant le nombre minimal de ces dernières.

Les 8 coupures disponibles sont les billets de 2000 F, 1000 F, 500 F, 100 F et les pièces de 50 F, 20 F, 5 F et 1 F11.

Voici quelques écrans explicitant les sorties attendues.

Vous allez me fournir une somme et je vous dirai combien de billets et de pièces elle représente. Attention,

la somme ne peut depasser 32767 francs.

Quelle somme ? 27346 Cela fait 13 billets de 2000 francs 1 billet de 1000 francs 3 billets de 100 francs 2 pièces de 20 francs 1 pièce de 5 francs 1 pièce de 1 franc On continue oui ou non ?

Quelle somme ? 4002 Cela fait

2 billets de 2000 francs 2 pièces de 1 franc On continue oui ou non ?

On veillera à discuter l'influence du type de variable(s) choisi sur la taille du montant traitable par le programme.

3