Probleme avec C

Résolu
pedroops -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,
J'ai un problème avec un programme qui calcule la fréquence d'obtention de chaque valeur après une suite de lancer de dés, j'ai en retour f1=0 f2=0 .... f6=0 !!!

voici le programme

Le 16/02/2010

fichier mon2meprog.c

ce que fait le programme : Pour une suite de lancers de dés,
calcul des fréquences d'obtention de chaque valeur.
*/

#include <stdio.h> // pour lecture/écriture

int main()
{
// déclaration des constantes et variables
int valeur,i,nbLancers,nb1,nb2,nb3,nb4,nb5,nb6;//compteurs
float f1,f2,f3,f4,f5,f6; // fréquences

// initialisations
printf("calcul des fréquences de chaque valeur\n");
printf("valeur = ? "); scanf("%d",&valeur); //premiere valeur de la suite de lancers
nbLancers = 0;
nb1 = 0;
nb2 = 0;
nb3 = 0;
nb4 = 0;
nb5 = 0;
nb6 = 0;
// .....
do{
//incrémentation des compteurs
switch(valeur){
case'1':
nb1 = nb1+1;
case'2':
nb2 = nb2+1;
case'3':
nb3 = nb3+1;
case'4':
nb4 = nb4+1;
case'5':
nb5 = nb5+1;
case'6':
nb6 = nb6+1;
}
nbLancers = nbLancers+1;
printf("nouvelle valeur = ? "); scanf("%d",&valeur); //valeur suivante
}while((valeur>0)&&(valeur<7));
if (nbLancers!=0){
// calcul des fréquences
f1 = nb1/nbLancers;
f2 = nb2/nbLancers;
f3 = nb3/nbLancers;
f4 = nb4/nbLancers;
f5 = nb5/nbLancers;
f6 = nb6/nbLancers;
printf("fréquence de la valeur 1 = %f ",f1);
printf("\n"); // pour passer à la ligne
printf("fréquence de la valeur 2 = %f ",f2);
printf("\n"); // pour passer à la ligne
printf("fréquence de la valeur 3 = %f ",f3);
printf("\n"); // pour passer à la ligne
printf("fréquence de la valeur 4 = %f ",f4);
printf("\n"); // pour passer à la ligne
printf("fréquence de la valeur 5 = %f ",f5);
printf("\n"); // pour passer à la ligne
printf("fréquence de la valeur 6 = %f ",f6);
printf("\n"); // pour passer à la ligne
}
else{
printf("aucune valeur entre 1 et 6 !");
}
return 0;
}

J'attend vos réponses

Merci
Configuration: Linux
Konqueror 4.2

3 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943
     
    C'est parce que tu fais une division entière et non sur les float au moment de calculer les fréquences. Typiquement 3/4 = 0.75 --> 0 une fois sur les int. Ton programme corrigé et un peu factorisé :

    #include <stdio.h> // pour lecture/écriture
    
    #define NB_FACES 6
    
    int main()
    {
        // déclaration des constantes et variables
        int   valeur, i, nbLancers;
        int   nb[NB_FACES]; //compteurs
        float f[NB_FACES]; // fréquences
    
        // initialisations
        nbLancers = 0;
        for(i=0;i<NB_FACES;++i) nb[i] = 0;
    
        // .....
        printf("calcul des fréquences de chaque valeur\n");
        do{
            // lire valeur
            printf("nouvelle valeur = ? ");
            scanf("%d",&valeur); //valeur suivante
    
            //incrémentation des compteurs
            ++nb[valeur-1];
            ++nbLancers;
        }while((valeur>0) && (valeur<=NB_FACES));
    
        if (nbLancers){
            // calcul des fréquences
            for(i=0;i<NB_FACES;++i) f[i] = (float) nb[i] / nbLancers;
    
            // affichage des fréquences
            for(i=0;i<NB_FACES;++i) printf("fréquence de la valeur %d = %lf\n",i+1,f[i]);
        }else printf("aucune valeur entre 1 et %d !\n",NB_FACES);
    
        return 0;
    }


    Ce qui donne :

    calcul des fréquences de chaque valeur
    nouvelle valeur = ? 5
    nouvelle valeur = ? 2
    nouvelle valeur = ? 4
    nouvelle valeur = ? 2
    nouvelle valeur = ? 3
    nouvelle valeur = ? 7
    fréquence de la valeur 1 = 0.000000
    fréquence de la valeur 2 = 0.333333
    fréquence de la valeur 3 = 0.166667
    fréquence de la valeur 4 = 0.166667
    fréquence de la valeur 5 = 0.166667
    fréquence de la valeur 6 = 0.000000
    


    Ou encore :

    #include <stdio.h> // pour lecture/écriture
    #include <string.h>
    
    #define NB_FACES 6
    
    int main()
    {
        // déclaration des constantes et variables
        int   valeur, i, nbLancers;
        float f[NB_FACES]; // fréquences
    
        // initialisations
        nbLancers = 0;
        memset(f,0,sizeof(float)*NB_FACES);
    
        // .....
        printf("calcul des fréquences de chaque valeur\n");
        do{
            // lire valeur
            printf("nouvelle valeur = ? ");
            scanf("%d",&valeur); //valeur suivante
    
            //incrémentation des compteurs
            ++f[valeur-1];
            ++nbLancers;
        }while((valeur>0) && (valeur<=NB_FACES));
    
        if (nbLancers){
            // calcul des fréquences
            for(i=0;i<NB_FACES;++i) f[i] /= nbLancers;
    
            // affichage des fréquences
            for(i=0;i<NB_FACES;++i) printf("fréquence de la valeur %d = %lf\n",i+1,f[i]);
        }else printf("aucune valeur entre 1 et %d !\n",NB_FACES);
    
        return 0;
    }


    Bonne chance
    2
  2. pedroops Messages postés 28 Statut Membre
     
    merci beaucoup
    0
  3. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943
     
    De rien, bonne continuation ;-)
    0