C ++在txt文件中创建带有测试分数的直方图

时间:2015-03-10 16:51:49

标签: c++

我是C ++的新手,我正在尝试创建一个直方图,给出一个具有以下分数的txt文件:100,95,47,88,86,92,75,89,81,70,55,80是什么程序需要做的是显示如下的直方图:

00s:

10s:

20s:

30s:

40s:*

50s:
etc...

以下是我的代码,我遇到的问题只是确保*进入每个相应的分数百分位数,即10s,20s等......

代码:

#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>


using namespace std;

void Print_Hist();

int main() {
 double nums;
ifstream data("Test_Score.txt");
if(data.is_open()){
    cout << "The file is open" << endl;
}else{
    cout << "Check if file exists" << endl;
}  

//  Declare vector<double> vecx
vector<double> vecx;
//  read data from input file to vector vecx,
while(data >> nums)
{
    vecx.push_back(nums);
}

for (int i=0; i < vecx.size(); i++){
    int num = vecx[i];

    if(num < 10){
        cout << "*" << endl; 
    }
    else if(num >= 10 && num < 20){
        cout << "*" << endl;
    }
    else if(num >= 20 && num < 30){
        cout << "*" << endl;
    }
    else if(num >= 30 && num < 40){
        cout << "*" << endl;
    }
    else if(num >= 40 && num < 50){
        cout << "*" << endl;
    }
    else if(num >= 50 && num < 60){
        cout << "*" << endl;
    }
    else if(num >= 60 && num < 70){
        cout << "*" << endl;
    }
    else if(num >= 70 && num < 80){
        cout << "*" << endl;
    }
    else if(num >= 80 && num < 90){
        cout << "*" << endl;
    }
    else if(num >= 90 && num < 100){
        cout << "*" << endl;
    }
    else if(num = 100){
        cout << "*" << endl;
    }


}

}

void Print_Hist(){
    cout << "00s: " << endl;
    cout << "10s: " << endl;
    cout << "20s: " << endl;
    cout << "30s: " << endl;
    cout << "40s: " << endl;
    cout << "50s: " << endl;
    cout << "60s: " << endl;
    cout << "70s: " << endl;
    cout << "80s: " << endl;
    cout << "90s: " << endl;
    cout << "100: " << endl;
}

2 个答案:

答案 0 :(得分:0)

我会这样做:

#include <map>
#include <iostream>

using namespace std;

class  compare {
public:
   bool operator() (int a, int b) {
      return a / 10 < b / 10;
   }
};

int main() {
   map<int, double, compare> histogram;
   int values[] = {100, 95, 47, 88, 86, 92, 75, 89, 81, 70, 55, 80};
   int count = 0;
   for (int i = 0; i < 12; i++) {
      histogram[values[i]]++;
      count++;
   }
   for (int i = 0; i <= 100; i+=10) {
      cout << i << "s:";
      for (int j = 0; j < histogram[i] / count * 10; j++) {
         cout << "*" ;
      }
      cout << endl;
   }
   return 0;
}

答案 1 :(得分:0)

如果文件是空格分隔的,你可以这样做(输入文件名是,你可以猜到&#34; filename.txt&#34;)

#include <map>
#include <iostream>
#include <fstream>

using namespace std;

class  compare {
public:
   bool operator() (int a, int b) {
      return a / 10 < b / 10;
   }
};

int main() {
   map<int, double, compare> histogram;
   ifstream f("filename.txt");
   int count;
   while (f) {
      int val;
      f >> val;
      if (!f)
          break;
      histogram[val]++;
      count++;
   }
   for (int i = 0; i <= 100; i+=10) {
      cout << i << "s:";
      for (int j = 0; j < histogram[i]; j++) {
         cout << "*" ;
      }
      cout << endl;
   }
   return 0;
}