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

C++ creating a histogram with test score in txt file

本文关键字:测试 直方图 txt 文件 创建 C++      更新时间:2023-10-16

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

00s:
10s:
20s:
30s:
40s:*
50s:
etc...

这是我下面的代码,我遇到的麻烦只是确保 * 进入每个相应的分数百分位数,即 10 秒、20 秒等......

法典:

#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;
}

我会做这样的事情:

#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;
}

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

#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;
}