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

时间:2015-02-26 20:04:14

标签: c++ logic text-files

发生的事情是我的项目中有一个.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

第1栏是患者ID
第二栏是患者的多少次测试 第3列及以后是所有血压读数。

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

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

2 个答案:

答案 0 :(得分: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块包装输入循环。

答案 1 :(得分:0)

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

由于它是以面向行的数据开始的,所以我一开始就读取一行数据。然后将每一行分成组成部分。一种显而易见的方法是将行中的数据放入字符串流中。

所以,我们可以这样做:

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

这还有一个小问题:它并没有真正验证输入数据。例如,您在问题中显示的第三行输入数据指定它包含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;
}