0

ヒストグラム プログラムに問題があります。必要な正確なものを印刷するようにしていますが、異常な間隔の問題があり、それを回避する方法について誰か助けてくれるかどうか疑問に思っていました。90-100 ブラケットの前のすべてのスペースに間違ったスペースがあることがわかります。

ここに画像の説明を入力

数字とアスタリスクの間にスペースがないようにするには、次のようにします。

*
*
*   *
*   *
*   *
*   *
*   *
*   *
*   * *
* * * *
* * * *
0 1 2 3

また、 or の代わりに何かを使用することをお勧めできますsystem("Clear")system("PAUSE")?

コード:

#include <iostream>
#include <iomanip>

using namespace std;

void readExamMarks(int examMarks[], int sizeOfArray, int& counter1, int& counter2, int&   counter3, int& counter4,int& counter5, int& counter6,int& counter7, int& counter8, int& counter9, int& counter10){

cout << "Please enter a set of exam marks to see a histogram for:" << endl;
int x = 0;

for( int idx = 0; idx < sizeOfArray; idx++){
    cin >> x;
     if((x >=0) && (x <= 100)){
            x = x/10;

            switch(x){
            case 1:
                counter1++;

                break;
            case 2:
                counter2++;
                break;
            case 3:
                counter3++;

                break;
            case 4:
                counter4++;
                break;
            case 5:
                counter5++;

                break;
            case 6:
                counter6++;
                break;
            case 7:
                counter7++;

                break;
            case 8:
                counter8++;
                break;
            case 9:
                counter9++;

                break;
            case 10:
                counter9++;
                break;

            }

            examMarks[idx] = x;
        }
             else{
             cout << "ERROR: Value must be in range [0...100], please enter a valid value\n"; 
         }
}
}


void printExamMarksDecade(){

    cout << setw(5) << "10-20  " << "21-30  " << "31-40  " <<"41-50  " << "51-60  " << "61-70  " << "71-80  " << "81-90  " << "91-100  ";
}

void printHisto(int examMarks[], int sizeOfArray,int counter1, int counter2, int& counter3, int& counter4,int& counter5, int& counter6,int& counter7, int& counter8, int& counter9, int& counter10){
system("cls");

while(counter1 != 0 ){
    cout << setw(3) << "*" << endl;
    counter1--;
}
while(counter2 != 0 ){
    cout << setw(10) << "*" << endl;
    counter2--;
}
while(counter3 != 0 ){
    cout << setw(17) << "*" << endl;
    counter3--;
}
while(counter4 != 0 ){
    cout << setw(24) << "*" << endl;
    counter4--;
}
while(counter5 != 0 ){
    cout << setw(31) << "*" << endl;
    counter5--;
}
while(counter6 != 0 ){
    cout << setw(38) << "*" << endl;
    counter6--;
}
while(counter7 != 0 ){
    cout << setw(45) << "*" << endl;
    counter7--;
}
while(counter8 != 0 ){
    cout << setw(52) << "*" << endl;
    counter8--;
}
while(counter9 != 0 ){
    cout << setw(59) << "*" << endl;
    counter9--;
}
}

int main() 
{
int examMarks[30];
int counter1 = 0;
int counter2 = 0;
int counter3 = 0;
int counter4 = 0;
int counter5 = 0;
int counter6 = 0;
int counter7 = 0;
int counter8 = 0;
int counter9 = 0;
int counter10 = 0;

readExamMarks(examMarks, 30, counter1, counter2, counter3, counter4, counter5, counter6, counter7, counter8, counter9, counter10);
printHisto(examMarks, 30, counter1, counter2, counter3, counter4, counter5, counter6, counter7, counter8, counter9, counter10);
printExamMarksDecade();


system("PAUSE");
 }
4

1 に答える 1

0

各範囲の変数counterは、実際にやりたいことではなく、1 つの配列だけが必要です。

#include <iostream>
using namespace std;

int main() {

  // count array for brackets 0 to 10
  int *count = new int[11];
  // variable to store each mark read
  int mark;

  // Read in marks
  while (cin >> mark) {
    // Increment the count for the bracket the mark falls in 
    count[mark/10]++;
  }

  for (int i=0;i<11;i++) {
    cout << i << "\t| " << string(count[i],'*') << endl;
  }

}

これは水平方向のヒストグラムをプロットしますが、それを行うべき非常に単純な方法を示しています。

$ ./histogram.out < marks
0   | ******
1   | *********
2   | **********
3   | ************
4   | *********
5   | *****************
6   | ********
7   | *********
8   | ***
9   | ****
10  | *

このコードを変更する際の頭痛の種は少なくなります。元のコードで括弧の数を 1000 に増やしてみてください!

于 2013-04-06T13:05:20.683 に答える