2016-10-27 5 views
0

私は、ヒストグラム関数にユーザ入力を入力して配列を使用し、配列の各インスタンスの値を比較して、表示する "*"の数を表示するカウンタを持つようにしています。ヒストグラムをC++で使用する

ヒストグラムの印刷で、ビンに分割しようとしています。 ***スコア約3点、約90点、ビン8点| *****値が80から89ポイントの配列内の5つのインスタンスに対して、以下同様に続きます。

私のforループではビン[i]のポインタを使ってみましたが、動作しませんでした。&ビン[i]を試しましたが、これは1ビンのアドレスしか与えず、 *配列のカウンタから取得します。

このヒストグラムを試して作成するために使用しているテストは次のとおりです。ケース1:100,95,90,85,80,75,70,65,60,40,20、および5。コードを短くするために、ヒストグラムの主機能と私の機能を掲載します。あなたの時間をありがとう。

int main() 
{ 
    int scores[100]; 
    int bins[10]; 
    int counter[99]; 
    int count = 0; 

    cout << "Enter a score (-1 to stop): "; 

    do { 
     cin >> scores[count++]; 
    } while (scores[count - 1] != -1); 
    count--; 
    Histogram(scores, count, counter); 
    int i; 
    for (i = 0; i < 10; i++) 
     ; 
    { 
     cout << &bins[i] << "| " << endl; 
     for (size_t k = 0; k < counter[i]; k++) { 
      cout << "*" << endl; 
      break; 
     } 
    } 
    deviation(scores, count); 

    return 0; 
} 

int* Histogram(int scores[], int count, int counter[]) 
{ 

    int k = 0; 
    for (int i = 0; i < count; i++) { 
     if (scores[i] >= 90) { 
      counter[k++]; 
     } 

     else if (scores[i] >= 80 && scores[i] < 90) { 
      counter[k++]; 
     } 

     else if (scores[i] >= 70 && scores[i] < 80) { 
      counter[k++]; 
     } 

     else if (scores[i] >= 60 && scores[i] < 70) { 
      counter[k++]; 
     } 

     else if (scores[i] >= 50 && scores[i] < 60) { 
      counter[k++]; 
     } 

     else if (scores[i] >= 40 && scores[i] < 50) { 
      counter[k++]; 
     } 
     else if (scores[i] >= 30 && scores[i] < 50) { 
      counter[k++]; 
     } 
     else if (scores[i] >= 20 && scores[i] < 30) { 
      counter[k++]; 
     } 
     else if (scores[i] >= 10 && scores[i] < 20) { 
      counter[k++]; 
     } 
     else if (scores[i] < 10) { 
      counter[k++]; 
     } 
    } 
    return counter; 
} 
+1

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低でも、あなたはあなたが行った観察と一緒に、[編集]あなたの質問あなたの問題を再現[、最小完全、かつ検証](http://stackoverflow.com/help/mcve)の例を含むようにする必要があります\しますデバッガ。 –

+0

問題は何ですか?コードをコンパイルして実行するとどうなりますか?何かエラーがありますか?タイクの出力は、あなたが望むものとどう違うのですか? –

+0

私はコンパイルして実行してもエラーはありません。出力は次のようになります。スコアのユーザー入力を取得し、-1は入力を中断し、ビンのアドレスを表示します。 "|"後のものは9です。 *** 8 | ** 7 | ** 6 | ** 5 | 4 | * 3 | 2 | * 1 | 0 | *それぞれ別の行にある – Unholypalidn

答えて

0
int k = 0; 
counter[k++]; 

上記の文は何もしません。 kをインクリメントしますが、counter[index]の値は変更されません。多分counter[k]++; k++;を意味するのでしょうか?

if (scores[i] >= 90) counter[k++]; 
else if (scores[i] >= 80 && scores[i] < 90) counter[k++]; 
else if (scores[i] >= 70 && scores[i] < 80) counter[k++]; 
... 
else if (scores[i] < 10) counter[k++]; 
else 
    printf("never reaches here!\n"); 

if/else条件が間違っています。 scores[i]は任意の値にすることができ、常に侵害の条件を満たすkを満たし、それは決して最後の条件には達しません。

for (i = 0; i < 10; i++); <== extra ; 
{ 
    cout << &bins[i] << "| " << endl; 

その他のエラーがありますが、目標が何であるかは不明です。 historgramを印刷するには、次の(それはあなたが考えているものに近いかどうこれは90度回転し、ヒストグラムを表示します、私は知らない)

#include <vector> 
... 
std::vector<int> scores; 
for (int i = 0; i < 10; i++) 
    scores.push_back(rand()%10); 

for (int i = 0; i < scores.size(); i++) 
{ 
    for (int k = 0; k < scores[i]; k++) 
    { 
     cout << "*"; 
    } 
    cout << "\n"; 
} 

または印刷ヒストグラムのような何かを試すことができます

int main() 
{ 
    std::vector<int> scores; 
    int max = 10; 
    for (int i = 0; i < 20; i++) 
     scores.push_back(rand() % max); 

    for (auto i : scores) 
     cout << i << ", "; 
    cout << "\n"; 

    for (int x = 0; x < max; x++) 
    { 
     for (int y = 0; y < scores.size(); y++) 
     { 
      if ((max - scores[y]) > x) 
       cout << " "; 
      else 
       cout << "*"; 
     } 
     cout << "\n"; 
    } 

    return 0; 
} 
+0

入力いただきありがとうございます。私はベクトルを使ってやり直すつもりです。 – Unholypalidn

+0

ヒストグラムが必要だと思いますが、それを90度反転する必要がありますか?ループを変更する必要があります。 –

関連する問題