程序从.txt文件中读取以下数据:
f 3.40
f 4.00
m 3.56
m 3.80
f 2.30
f 3.95
m 3.90
m 4.00
m 2.00
f 4.00
f 2.80
m 3.70
m 2.98
f 3.89
m 4.00
f 3.90
m 1.90
m 2.90
f 1.50
f 2.67
m 3.80
m 2.35
然后计算每个性别的平均值(gpa)(男性为m,女性为f)
根据我的计算,有:
14 fs,f的gpas总和为46.99,因此f的平均gpa为46.99 / 14 = 3.36。
和
14 ms,m的总和为46.64,因此m的平均gpa为46.64 / 14 = 3.33。
但是程序在新文件中输出的是: 男性平均GPA:3.42 女性平均GPA:3.76
我在操作中遗漏了什么?
我的代码:
标题:
#ifndef header_h
#define header_h
#include <iostream>
#include <iomanip>
#include <fstream>
#include <cstring>
#include <cstdlib>
using namespace std;
void extern initialize(int&, int&, float&, float&, float&, float&);
void extern openFiles(ifstream&, ofstream&);
void extern sumGrades(istream&, ostream&, int&, int&, float&, float&);
void extern averageGrade (float&, float&, float, int, float, int);
void extern printResults (float, float, ostream&);
#endif
主要:
#include "header.h"
int main()
{
char gender;
float gpa, sumFemaleGPA, sumMaleGPA, maleGrade, femaleGrade;
ifstream inData;
ofstream outData;
int countFemale, countMale;
openFiles(inData, outData);
initialize (countFemale, countMale, sumFemaleGPA, sumMaleGPA, maleGrade, femaleGrade);
sumGrades(inData, outData, countFemale, countMale, sumFemaleGPA, sumMaleGPA);
averageGrade (maleGrade, femaleGrade, sumMaleGPA, countMale, sumFemaleGPA, countFemale);
printResults(maleGrade, femaleGrade, outData);
system("PAUSE");
return EXIT_SUCCESS;
}
openFiles散:
#include "header.h"
void openFiles(ifstream& inData, ofstream& outData)
{
inData.open("./Ch7_Ex4Data.txt");
outData.open("./Ch7_Ex4Dataout.txt");
outData << fixed << showpoint << setprecision(2);
}
初始化:
#include "header.h"
void initialize (int& countFemale, int& countMale, float& sumFemaleGPA, float& sumMaleGPA, float& maleGrade, float& femaleGrade)
{
countFemale = 0;
countMale = 0;
sumFemaleGPA = 0;
sumMaleGPA = 0;
maleGrade = 0;
femaleGrade = 0;
}
sumGrades :
#include "header.h"
void sumGrades(istream& inData, ostream& outData, int& countFemale, int& countMale, float& sumFemaleGPA,
float& sumMaleGPA)
{
char gender;
float gpa;
while( inData >> gender >> gpa )
{
inData >> gender >> gpa;
if(gender == 'm')
{
sumMaleGPA += gpa;
countMale++;
}
else if (gender == 'f')
{
sumFemaleGPA += gpa;
countFemale++;
}
}
}
averageGrade :
#include "header.h"
void averageGrade (float& maleGrade, float& femaleGrade, float sumMaleGPA, int countMale, float sumFemaleGPA, int countFemale)
{
maleGrade = sumMaleGPA / countMale;
femaleGrade = sumFemaleGPA / countFemale;
}
printResults :
#include "header.h"
void printResults(float maleGrade, float femaleGrade, ostream& outData)
{
outData << "average male GPA: " << maleGrade << endl;
outData << "average female GPA: " << femaleGrade << endl;
}
答案 0 :(得分:3)
这些行不会:跳过其他所有行:
while( inData >> gender >> gpa )
{
inData >> gender >> gpa;
您正在使用&gt;&gt;的返回运算符指示while循环测试成功,但每次执行时,它是否消耗该行并移动到下一行,因此当您在while循环内再次执行它时,您有效地覆盖第1行的数据使用第2行的数据并忽略第1行。