如何提取数据文件以找到平均值?逻辑帮助 C++

How do I pull out the data file to find Average? Logic Help C++

我的项目中有这样一个 .txt 文件。

4567 4 180 140 170 150
4693 1 119
4690 5 200 120 135 136
4693 2 149 133
4783 3 133 123 140
4824 3 130 155 120
4833 2 119 186

第一列是患者 ID
第二列是患者进行了多少次测试
第 3 列及以后是所有血压读数。

如何计算数据的平均值?我遇到的问题是如何从文本文件中提取这些血压读数并将它们全部相加以除以我的变量 howMany。代码工作正常我只需要 average.Thanks

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int main(){
//Initialize Required Variables For Program
int patientCount = 0;
string id;
int avg = 0;
int howMany = 0;
ifstream reader ("data.txt"); //Open The Data File To Be Read From

while( reader >> id && reader >> howMany ){ //as long as you can read another pacient data
    int sum = 0; //sum accumulates the pressure readings per pacient
    cout << "The Patient ID Is: " << id << endl;
    cout << "The Number Of Blood Pressure Record This Patient Has Is: " << howMany << endl;
    for(int K = 0; K < howMany; ++K){
        int number;
        reader >> number;
        sum += number;

    }
    //going to complete average here but I don't know how to pull out the data

}
system("pause");
return 0;
}

只做除法:

while( reader >> id && reader >> howMany ){ //as long as you can read another pacient data
    int sum = 0; //sum accumulates the pressure readings per pacient
    double avg;

    cout << "The Patient ID Is: " << id << endl;
    cout << "The Number Of Blood Pressure Record This Patient Has Is: " << howMany << endl;
    for(int K = 0; K < howMany; ++K){
        int number;
        reader >> number;
        sum += number;
    }
    //going to complete average here but I don't know how to pull out the data
    avg = (double) sum / howMany; 
    cout << "The Average Blood Pressure For This Patient Is: " << avg << endl;
}

你的输入循环有点奇怪。如果患者的 ID 为 0 或血压读数为 0,则它将停止读取输入并正常退出。

同时,在典型情况下,您的程序可能会通过抛出异常(或无限循环)退出。您可能想用 try-catch 块包装您的输入循环。

您从按行排列的数据开始,换行符很重要。

由于它最初是面向行的数据,所以我会从一次读取一行数据开始。然后将每一行分解成组成部分。一种明显的方法是将行中的数据放入字符串流中。

所以,我们可以这样做:

std::string line;

while (std::getline(infile, line)) {
    int id, num, total=0, reading;

    std::istringstream buffer(line);
    buffer >> id >> num;
    for (int i=0; i<num && buffer >> reading; i++)
        total += reading;
    int average = total / num;

    std::cout << "ID: " << id << ", average: " <<average << "\n";
}

这还有一个未成年人 problem:it 没有真正验证输入数据。例如,您在问题中显示的第三行输入数据指定它包含 5 个读数,但实际上只包含 4 个。前面的代码不会对此进行诊断,但这样做可能是个好主意(并且您的代码将不同步——因为它缺少读数,它会从下一行读取 ID 作为读数,并产生错误结果,然后将下一行读数的数量视为 ID,之后的读数作为大量的阅读材料,并且......现在我希望你明白为什么我建议将面向行的数据作为行来阅读)。

如果您确定您的数据将始终格式正确,您可能不在乎 - 但您在问题中显示的数据并非如此,您可能想要对此进行诊断。这样做的一种方法是将缓冲区中的数据读入 vector<int>,如果读取的项目数与该行应该包含的项目数不同,则打印出一条错误消息。

while (std::getline(infile, line)) {
    int id, num, total=0, reading;

    std::istringstream buffer(line);
    buffer >> id >> num;
    std::vector<int> readings { std::istream_iterator<int>(buffer), 
                                std::istream_iterator<int>() };

    if (num != readings.size())
        throw std::runtime_error("Bad input data");

    std::cout << "ID: " << id << ", average: " << 
         std::accumulate(readings.begin(), readings.end(), 0.0) / num;
}