Tirage aléatoire et incrémentation d'un nombrdans un tableau!!

Tirage aléatoire et incrémentation d'un nombrdans un tableau!! - C - Programmation

Marsh Posté le 04-11-2008 à 19:38:39    

Bonjours à vous. Je suis quelque peux en galère vis à vis d'une programme que je dois créer en C.
En fait l'énoncé est le suivant :

 

Ecrire un 1er programme qui réalise N lancers d'un seul dé et qui calcule la distribution des valeurs obtenues, c.à.d. le nb de fois où chacune des six faces apparait au cours des N lancers. Vous définirez pour cela un tableau d'entiers dont vs incrémenterez la case i chaque fois que la face i est obtenue. Pr terminé, vous afficherez le contenu du tableau

 

Pour la premiere parti pas de souci puisqu'en effet je maitrise désormais les commandes Srand et do...while.(Je sais rien de bien compliqué) par contre pour le tableau je ne comprend pas bien ce qui m'est demandé.

 

voila pour le moment ce que moi j'ai fait :

 
Code :
  1. #include <time.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. int main(void)
  6. {
  7.        int resultat, N,S;
  8.        S=0;
  9.        printf ("combien de lance voulez vous effectuer?" );
  10.        scanf ("%d",&N);
  11.        srand(time(0));
  12.        
  13.        do
  14.        {
  15.            resultat=1+rand()%6;
  16.            printf("resultat de lancement du de : %d\n",resultat);
  17.            S=S+1;
  18.        }
  19.        while (S!=N);
  20.        
  21.        
  22.        system("pause" );
  23.        return 0;
  24. }


Attention je ne demande pas une réponse car là n'est pas le but ce que je voudrais c'est comprendre ce qui m'est demandé et savoir comment je peux arriver par la suite à repondre aux exigences posées dans l'énoncé.

 

Ainsi je vous remercie d'avance de bien vouloir me faire partager vos connaissance en la matiere.

 

Édité par Elmoricq : ajout des balises code pour plus de lisibilité.


Message édité par Elmoricq le 04-11-2008 à 20:00:50
Reply

Marsh Posté le 04-11-2008 à 19:38:39   

Reply

Marsh Posté le 04-11-2008 à 20:08:42    

Alors, plusieurs remarques en vrac :

  • la fonction time() attend comme argument un time_t*, donc une adresse. Dans l'absolu écrire time(0) est correct, mais il est beaucoup plus propre d'écrire time(NULL) dans ce contexte.


  • l'utilisation de scanf() est à proscrire tant que tu ne maîtrises pas la saisie formatée. Bien qu'enseignée par de trop nombreux professeurs, cette fonction est casse-gueule et son utilisation ne s'adresse pas à des débutants (par. ex. ici, essaie de saisir une chaîne de caractères au lieu du nombre attendu, et observe le désastre). Préfère la fonction fgets(), avec en plus la fonction de conversion chaîne=>entier strtol(). C'est non seulement plus propre, mais ça te servira bien plus à l'avenir de savoir manier ces fonctions.


  • Pour retenir le nombre de tirages effectués, tu dois stocker les différents résultats, dans un tableau. Tu dois donc mémoriser combien de fois chaque tirage a été obtenu, il te faut donc au moins 6 cases. Donc, résumons : déclarer un tableau d'entiers de 6 cases, initialiser chaque case à 0, puis incrémenter la bonne case en fonction du tirage obtenu. Ce petit bout de code devrait t'aider :
Code :
  1. unsigned foobar[6];
  2. for(unsigned i = 0; i < 6; ++i) {
  3.   foobar[i] = 0;
  4. }


(unsigned == entier non signé. Tu indiques ici explicitement dans ton code que tu ne travailles pas avec des nombres négatifs, mais si tu préfères tu peux utiliser int, ça n'a pas de conséquence ici)

 


Tu devrais avoir tous les éléments pour terminer ton exercice maintenant. [:dawa]


Message édité par Elmoricq le 04-11-2008 à 20:10:55
Reply

Marsh Posté le 04-11-2008 à 20:17:51    

Merci pour ton aide et tes conseil avisés je m'en vais de suite essayé et je reviens en cas de probleme.

Reply

Marsh Posté le 04-11-2008 à 20:59:47    

ceto13 a écrit :

   *  Pour retenir le nombre de tirages effectués, tu dois stocker les différents résultats, dans un tableau. Tu dois donc mémoriser combien de fois chaque tirage a été obtenu, il te faut donc au moins 6 cases. Donc, résumons : déclarer un tableau d'entiers de 6 cases, initialiser chaque case à 0, puis incrémenter la bonne case en fonction du tirage obtenu. Ce petit bout de code devrait t'aider :

Code :
  1. unsigned foobar[6];
  2. for(unsigned i = 0; i < 6; ++i) {
  3. foobar[i] = 0;
  4. }


 
 
(unsigned == entier non signé. Tu indiques ici explicitement dans ton code que tu ne travailles pas avec des nombres négatifs, mais si tu préfères tu peux utiliser int, ça n'a pas de conséquence ici)


 
Désolé mais en feit je ne maitrise pas du tout ces notions et je ne comprend donc pas leur utilisation. Du coup j'ai utilisé une autre méthode qui me semble néanmoins pas très pratique pourrais tu me donner ton avis stp.
 

Code :
  1. #include <time.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. int main(void)
  5. {
  6.         int resultat, N,S;
  7.         int u,d,t,q,c,s;
  8.         u=0;
  9.         d=0;
  10.         t=0;
  11.         q=0;
  12.         c=0;
  13.         s=0;
  14.         S=0;
  15.         srand(time(0));
  16.        
  17.         printf ("combien de lance voulez vous effectuer?" );
  18.         scanf ("%d",&N);
  19.        
  20.         do
  21.         {
  22.             resultat=1+rand()%6;
  23.             printf("resultat de lancement du de : %d\n",resultat);
  24.             S=S+1;
  25.            
  26.             if (resultat==1)
  27.                 u=u+1;
  28.             if (resultat==2)
  29.                 d=d+1;
  30.             if (resultat==3)
  31.                 t=t+1;
  32.             if (resultat==4)
  33.                 q=q+1;
  34.             if (resultat==5)
  35.                 c=c+1;
  36.             if (resultat==6)
  37.                 s=s+1;
  38.            
  39.         }
  40.         while (S!=N);
  41.        
  42.         printf ("il est sortie :\n%d fois le nombre 1\n%d fois le nombre 2\n%d fois le nombre 3\n%d fois le nombre 4\n%d fois le nombre 5\n%d fois le nombre 6\n",u,d,t,q,c,s);
  43.        
  44.          
  45.        
  46.        
  47.         system("pause" );
  48.         return 0;
  49. }


Reply

Marsh Posté le 04-11-2008 à 21:37:29    

L'exercice indique qu'il faut utiliser un tableau. Surtout que là c'est un dé de 6, mais si tu lances des dés de 100, tu ne vas quand même pas créer 100 variables ?
 
Un petit lien trouvé vite fait et qui me semble bien résumer l'affaire : http://inferno.cs.univ-paris8.fr/~ [...] urs-7.html

Reply

Marsh Posté le 10-11-2008 à 08:23:18    

Hormis le tableau, regarde ce que fait le couple if/ else if.
Dans ton cas j'aurai aussi remplace les if / else if par un switch car c'est bien plus rapide mais comme le dit Elmoricq tu dois utiliser un tableau :)
Aussi si N == 0 tu as une boucle infinie :) (de meme pour toute 'fausse' valeur)


Message édité par gee le 10-11-2008 à 08:24:00

---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 10-11-2008 à 15:13:32    

en pseudo code
 
uint tab[MAX]
 
for ()
{
int rand = rand(MAX)
tab[rand]++  
}


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed