2016-10-21 10 views
-1

このプログラムでは、指定された範囲である数のランダムなintを生成するつもりです。たとえば、0〜10の間の100の整数。数値のブロックでintの配列を出力するには? (ヒストグラムの印刷)

特定の番号が何回生成されたかを示す分布の配列(distTabと呼ばれる)を作成しました。私はその後、forループの中の星として数値を表示します。下の画像を確認してください。

enter image description here

これは0-10に適していますが、私は私の0-1000印刷機能プリントdistTabのすべてのインデックスとの間に10000個の番号を生成すると言います。私は範囲でそれをカットし、その範囲のお互いにインデックス値を追加したいと思います。たとえば、0-100 - > 20個の星、101-200 - > 21個の星などです。 (ループのために)このように作成されている

int inc=0; 

printf("\n%s\t%s\n","Number", "Histogram\n"); 
for(int i=0; i <= max; i++) { 
    if(distTab[i]==0)  
     continue; 

    printf(" %d\t",i); 
    int lim = distTab[i]; 

    for(int j=1; j<=lim; j++){   
     printf("*"); 
     inc++; 
    } 
    printf("\n"); 
} 

乱数とdistTab:

はここに私の現在のヒストグラムを印刷するためのコードですお時間を事前に

int distTab[MAX_RAND]; 
memset(distTab, 0, sizeof distTab); 

//for(0 -> desired number of ints) 
    rnd = (rand() % limit)+1; 
    if (max < rnd) 
     max = rnd; //max value generated. 
    distTab[(int)rnd]++; 
//} 

感謝をし、私はできる限り私の質問をはっきりと説明してくれることを願っています。

+1

Whatdをあなたは試してみましたか? –

+0

'int myfunc(int value)'(より適切な関数名を見つける)関数を書く必要があります。これは、 'value'が0と100の間にあれば20を返し、' value'が101と200の間にあれば21を返します、201と300の間の 'value 'のための22 ** **ヒント**:鉛筆と紙で始める。 –

答えて

0

ヒストグラムをスケールします。それともパーセンテージで印刷する方がいいですか? は、私はあなたの最も頻度の高い値が常に同じを持っている方法

lim = distTab[i]/max_distTab * max_lim; 

ような何かをするだろう。ここで

0

が、私は100の0と9999と範囲の間の数字のためにそれを行うだろうかです:

int inc=0; 
int count[10] = {0}; 
printf("\n%s\t%s\n","Number", "Histogram\n"); 
for(int i = 0; i <= max; i++) { 
    if(distTab[i]==0)  
     continue; 

    count[max % 100] += distTab[i]; 
} 

for (int i = 0; i < 10; ++i){ 
    printf("%4d-%4d\t",i * 100, (i + 1) * 100); 
    int lim = count[i]; 

    for(int j=1; j<=lim; j++){   
     printf("*"); 
     inc++; 
    } 
    printf("\n"); 
} 

しかし私は、より良い練習がどちらかになり、あなたの配列ををmallocなり、可変な長さの配列を避けるために、ハードの値を使用したり、定義を使用する。

あなたはまた、ソートされたint型の別の配列を使用でき、カスタム範囲場合:

int ranges[] = {100, 300, 450, 600, 1000}; 
// assuming ranges is sorted 
int get_index(int value, int* ranges){ 
    int count = 0; 
    if (value > ranges[ranges.size() - 1]) 
    return -1; 
    while (value < ranges[count]) 
    ++count; 
    return count; 
} 

をとすることで

for(int i = 0; i <= max; i++) { 
    if(distTab[i]==0)  
     continue; 

    count[max % 100] += distTab[i]; 
} 

を置き換える:

for(int i = 0; i <= max; i++) { 
    if(distTab[i]==0)  
     continue; 

    count[get_index(i, ranges)] += distTab[i]; 
} 
+0

ありがとう!現在私のコードにあなたの提案を実装しています。それが動作する場合はあなたの投稿を維持します。あまりにも難しくはありませんが、私はそれの周りに私の頭を包むことはできません。 –

+0

どの部分を明確にしたいですか? – banetl