2012-04-16 2 views
0

Bonjour J'ai écrit le code nécessaire pour une base de générateur roulant de dés sur rand() et time.h. Il demande essentiellement à l'utilisateur d'entrer le nombre de fois qu'il veut que les dés soient roulés, puis il les fait rouler X fois. Il enregistre les temps de chacun des numéros 1-6 dans un tableau et le pourcentage de chaque numéro dans un autre tableau.Histogramme de dés de roulement

Maintenant, ce que je veux faire est de créer un histogramme qui a les numéros 1-6 et - sur l'axe des X, les pourcentages et | sur l'axe Y et les étoiles (*) pour les colonnes.

Quelque chose comme ceci:

10% | * 
8% |* * * 
6% |* * * * * 
4% |* * * * * * 
2% |* * * * * * 
    +------------ 
    1 2 3 4 5 6 

J'ai une recherche google throught pour trouver quelque chose pour commencer, mais je l'ai vraiment trouvé quelque chose de semblable à mon cas les thats aide va commencer par moi.

Mon code ainsi pour est:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int random_number(); 
float calc_percentage(int totals, int nums); 
float calc_maxper(float perc[6]); 
float calc_minper(float perc[6]); 
float permin; 
float permax; 


int main(void) 
{ 
    int nums; 
    int i; 
    int totals[6] = {0}; 
    float percentages[6] = {0}; 

    srand(time(NULL)); 

    printf("How many numbers to generate?"); 
    scanf("%d", &nums); 

    for (i = 1; i <= nums; i++) 
    { 
    int x = random_number(); 
    totals[x-1]++; 
    } 

    for (i = 0; i<6; i++) 
    { 
    percentages[i] = calc_percentage(totals[i],nums); 
    printf("The percentage of each number is: %.2f%\n", percentages[i]); 
    } 


    permin = calc_minper(percentages); 
    permax = calc_maxper(percentages); 

    if (((permax) - (permin)) > 5) 
    printf("The generator is not good.\n"); 
    printf("The percentage difference is:%.1f\n", permax-permin); 

    system("pause"); 
    return 0; 
} 



int random_number() 
{ 
    int randnum; 
    randnum = 1 + (rand() % 6); 

    return randnum; 
} 

float calc_percentage(int totals, int numbers) 
{ 
    float a; 

    a = (totals * 100)/numbers; 

    return a; 
} 

float calc_minper(float perc[6]) 
{ 
    int i; 
    float min; 
    min = perc[0]; 

    for (i=1; i<6; i++) 
    { 
    if (perc[i] < min) 
     min = perc[i]; 
    } 
    return min; 
} 

float calc_maxper(float perc[6]) 
{ 
    int i; 
    float max; 
    max = perc[0]; 

    for (i=1; i<6; i++) 
    { 
    if (perc[i] > max) 
     max = perc[i]; 
    } 
    return max; 
} 

Ok j'ai finalement obtenu ce fait.

Un peu long et en désordre, mais il fait définitivement le travail !!

printf("20%|"); 
for (i=0; i<6; i++) 
{ 
    if (percentages[i] >= 20) 
     printf("* "); 
} 
printf("\n"); 

printf("16%|"); 
for (i=0; i<6; i++) 
{ 
    if (percentages[i] >= 16) 
     printf("* "); 
} 
printf("\n"); 


printf("12%|"); 
for (i=0; i<6; i++) 
{ 
    if (percentages[i] >= 12) 
     printf("* "); 
} 
printf("\n"); 


printf(" 8%|"); 
for (i=0; i<6; i++) 
{ 
    if (percentages[i] >= 8) 
     printf("* "); 
} 
printf("\n"); 


printf(" 4%|"); 
for (i=0; i<6; i++) 
{ 
    if (percentages[i] >= 4) 
     printf("* "); 
} 



printf("\n"); 
printf(" +------------\n"); 
printf(" 1 2 3 4 5 6\n"); 

Merci mec pour vos idées !! Si vous avez des idées rapides pour le rendre plus court, je suis tout ouïe!

+0

Où exactement obtenez-vous stucked? BTW: devoirs? – Matthias

+0

Au lieu de déboguer tout votre code, pourriez-vous nous indiquer - quel est le problème avec la solution actuelle, quelle est la sortie actuelle, etc.? –

+0

Votre fonction calc_percentage renvoie un int casted à float. Forcer les opérations à virgule flottante en utilisant 100.0 au lieu de 100. – Spidey

Répondre

1

Pour chaque plage (10%, 8%, etc.), vérifiez si le nombre de dés actuel (1-6) le dépasse, puis imprimez un * (ou un espace s'il ne correspond pas à la plage minimum) . À la fin, imprimez la base du graphique.

Vous pouvez utiliser une pour gérer les gammes:

float range; 
float interval = (permax-permin)/(NUM_INTERVALS-1); 
for (range = permax; range >= permin - EPSILON; range -= interval){ 
    int i; 
    printf("%2.2f%% | ", range); 
    for(i=0; i<6; i++){ 
     char *out = percentages[i] >= range ? "*" : " "; 
     printf("%s ", out); 
    } 
    printf("\n"); 
} 
printf("  | 1 2 3 4 5 6\n"); 
+0

Gentil homme de code! C'est exactement ce que je cherche. J'ai regardé votre code mais essaye toujours de comprendre ce que chacune de ces variables (intervalle, NUM_INTERVALS, et EPSILON) signifie? – Metalman

+0

La variable d'intervalle contient la différence entre deux "plages". Ce que j'ai appelé la gamme est en fait la limite inférieure de la gamme. – Spidey

+0

EPSILON est une erreur maximale définie pour le pointage flottant, la bibliothèque standard est fournie avec ceci. Vous pouvez le définir à 0.00001, sans conséquences pour votre solution. NUM_INTERVALS est une définition que VOUS devez définir, au nombre de lignes que votre graphique aura. Dans votre exemple, cela devrait être 5. – Spidey