TD-Prog Lancer des dés

Préambule

On veut simuler le lancement de deux dés et étudier la fréquence d'apparition de chaque somme possible (de 2 à 12). Les résultats seront affichés sous forme numérique et sous forme graphique de la façon suivante.

 2 [ 3.30] : xxx
 3 [ 5.00] : xxxxx
 4 [ 6.60] : xxxxxxx
 5 [10.10] : xxxxxxxxxx
 6 [13.60] : xxxxxxxxxxxxxx
 7 [18.20] : xxxxxxxxxxxxxxxxxx
 8 [15.60] : xxxxxxxxxxxxxxxx
 9 [12.40] : xxxxxxxxxxxx
10 [ 7.00] : xxxxxxx
11 [ 5.40] : xxxxx
12 [ 2.80] : xxx

Chaque symbole 'x' représente 1%.

Analyse du problème

Nous allons d'une part déterminer la façon de garder les données nécessaires en mémoire et d'autre part décomposer les diverses opérations à effectuer en opérations simples qui seront des fonctions ou des procédures.

Variables et types

Nous aurons à conserver en mémoire le nombre de tirages correspondant à chaque résultat possible. Cela se fera dans un tableau d'entiers dont les indices iront de 2 à 12. De même nous aurons à calculer les fréquences correspondantes qui seront conservées dans un autre tableau contenant des nombres de type Real.

Nous définissons deux variables globales destinées à contenir ces tableaux.

var 
 eff  : array[2..12] of Integer;       { tableau des effectifs }
 freq : array[2..12] of Real;          { tableau des fréquences }

Procédures et fonctions

Le travail effectué par le programme peut se diviser en deux parties :

On peut donc prévoir les procédures et fonctions suivantes :

procedure initEff;
{ mise à 0 du tableau des effectifs }
 
function effectifTotal:Integer;
{ renvoie l'effectif total }

function unTirage:Integer;
{ tirage de 2 dés et renvoi de la somme }
 
procedure tirages(n:Integer);
{ n tirages consécutifs et inscription des résultats dans le
  tableau des effectifs }

procedure calcFreq;
{ remplissage du tableau des fréquences }

procedure afficheLigne(n:Integer);
{ affichage de la ligne correspondant au total n }

procedure afficheTout;
{ affichage de toutes les lignes de résultats }

Programme final

Le programme final aura la forme suivante :

var nbTirages:Integer;
BEGIN
 randomize;
 repeat
  write('Nombre de tirages : '); readln(nbTirages);
  if nbTirages>0 then
   begin
    initEff;
    tirages(nbTirages);
    calcFreq;    
    afficheTout;
   end; 
 until nbTirages<=0; 
END.

Il reste donc à écrire toutes les procédures et fonctions prévues.



Correction
Retour