程序从.txt文件中读取以下数据。
f 2.5
m 3.5
f 2.1
f 3.7
m 4.0
f 3.2
f 3.1
f 1.7
f 2.2
m 3.6
m 2.1
f 3.5
f 1.9
m 1.7
m 2.3
f 3.5
f 3.9
f 3.7
m 4.0
f 2.2
f 2.1
f 1.7
f 2.2
m 3.6
m 2.1
f 4.5
f 1.9
m 1.7
m 3.6
m 2.1
f 3.5
f 1.9
m 1.7
m 2.3
f 3.5
f 3.9
f 3.7
m 4.0
f 2.2
m 3.6
m 2.1
f 3.5
f 1.9
m 1.7
m 2.3
f 3.5
f 3.9
f 3.7
m 4.0
f 2.2
f 2.1
f 1.7
f 2.2
m 3.6
m 2.1
f 4.5
f 1.9
m 1.7
m 3.6
m 2.1
f 3.5
f 1.9
m 1.7
m 2.3
f 3.5
f 2.2
m 3.6
m 2.1
f 3.5
f 1.9
m 1.7
m 2.3
f 3.5
f 3.9
f 3.7
m 4.0
f 2.2
f 2.1
f 1.7
f 2.2
m 3.6
m 2.1
f 4.5
f 1.9
m 1.7
m 3.6
m 2.1
f 3.5
f 1.9
m 1.7
m 2.3
f 3.5
f 2.2
m 3.6
m 2.1
f 3.5
f 1.9
m 1.7
m 2.3
f 3.5
f 3.9
f 3.7
m 4.0
f 2.2
f 2.1
f 1.7
f 2.2
m 3.6
m 2.1
f 4.5
f 1.9
m 1.7
m 3.6
m 2.1
f 3.5
f 1.9
m 1.7
m 2.3
f 3.5
f 2.2
m 3.6
m 2.1
f 3.5
f 1.9
m 1.7
m 2.3
f 3.5
f 3.9
f 3.7
m 4.0
f 2.2
f 2.1
f 1.7
f 2.2
m 3.6
m 2.1
f 4.5
f 1.9
m 1.7
m 3.6
m 2.1
f 3.5
f 1.9
m 1.7
m 2.3
f 3.5
f 2.2
m 3.6
m 2.1
f 3.5
f 1.9
m 1.7
m 2.3
f 3.5
f 3.9
f 3.7
m 4.0
f 2.2
f 2.1
f 1.7
f 2.2
m 3.6
m 2.1
f 4.5
f 1.9
m 1.7
m 3.6
m 2.1
f 3.5
f 1.9
m 1.7
m 2.3
f 3.5
f 2.2
m 3.6
m 2.1
f 3.5
f 1.9
m 1.7
m 2.3
f 3.5
f 3.9
f 3.7
m 4.0
f 2.2
f 2.1
f 1.7
f 2.2
m 3.6
m 2.1
f 4.5
f 1.9
m 1.7
m 3.6
m 2.1
f 3.5
f 1.9
m 1.7
m 2.3
f 3.5
f 2.2
m 3.6
m 2.1
f 3.5
f 1.9
m 1.7
m 2.3
f 3.5
f 3.9
f 3.7
m 4.0
f 2.2
f 2.1
f 1.7
f 2.2
m 3.6
m 2.1
f 4.5
f 1.9
m 1.7
m 3.6
m 2.1
f 3.5
f 1.9
m 1.7
m 2.3
f 3.5
f 2.2
m 3.6
m 2.1
f 3.5
f 1.9
m 1.7
m 2.3
f 3.5
f 3.9
f 3.7
m 4.0
f 2.2
f 2.1
f 1.7
f 2.2
m 3.6
m 2.1
f 4.5
f 1.9
m 1.7
m 3.6
m 2.1
f 3.5
f 1.9
m 1.7
m 2.3
f 3.5
然后计算每个性别的平均值(gpa)(男性为m,女性为f)。 但是程序在新文件中输出的是:
男性平均GPA:nan
平均女性GPA:nan
#include <iostream>
#include <conio.h>
#include <fstream>
#include <iomanip>
#include <math.h>
#include "string"
using namespace std;
void openFiles(ifstream& inData, ofstream& outData)
{
inData.open("cpga.txt");
outData.open("avggpa.txt");
outData << fixed << showpoint << setprecision(2);
}
void initialize (int& countFemale, int& countMale,
float& sumFemaleGPA,float& sumMaleGPA,
float& avgMaleGrade, float& avgFemaleGrade)
{
countFemale=0;
countMale=0;
sumFemaleGPA=0;
sumMaleGPA=0;
avgMaleGrade=0;
avgFemaleGrade=0;
}
void sumGrades(int& countFemale, int& countMale, float& sumFemaleGPA,
float& sumMaleGPA)
{
char gender;
float gpa;
if(gender == 'm')
{
sumMaleGPA += gpa;
countMale++;
}
else if (gender == 'f')
{
sumFemaleGPA += gpa;
countFemale++;
}
}
void averageGrade (float& avgMaleGrade, float& avgFemaleGrade, float sumMaleGPA, int countMale, float sumFemaleGPA, int countFemale)
{
avgMaleGrade = sumMaleGPA / countMale;
avgFemaleGrade = sumFemaleGPA / countFemale;
}
void printResults(float avgMaleGrade, float avgFemaleGrade, ostream &outData)
{
outData << "Average Male GPA: " << avgMaleGrade << endl;
outData << "Average Female GPA: " << avgFemaleGrade << endl;
}
int main()
{
char gender;
float gpa, sumFemaleGPA, sumMaleGPA, avgMaleGrade, avgFemaleGrade;
ifstream inData;
ofstream outData;
int countFemale, countMale;
initialize (countFemale, countMale, sumFemaleGPA, sumMaleGPA, avgMaleGrade, avgFemaleGrade);
openFiles(inData, outData);
sumGrades(countFemale, countMale, sumFemaleGPA, sumMaleGPA);
averageGrade (avgMaleGrade, avgFemaleGrade, sumMaleGPA, countMale, sumFemaleGPA, countFemale);
printResults(avgMaleGrade, avgFemaleGrade, outData);
system("PAUSE");
return 0;
inData.close();
outData.close();
}
有人能发现这段代码有什么问题吗?干杯!
答案 0 :(得分:4)
这里有很多不妥之处:
首先,在初始化函数中,您没有初始化通过引用传递的任何浮点数。 相反,你可能想要这样做:
void initialize (int& countFemale, int& countMale,
float& sumFemaleGPA,float& sumMaleGPA,
float& avgMaleGrade, float& avgFemaleGrade)
{
countFemale=0;
countMale=0;
sumFemaleGPA=0;
sumMaleGPA=0;
avgMaleGrade=0;
avgFemaleGrade=0;
}
另外,在sumGrades函数中,你有:
while( inData >> gender >> gpa )
{
inData >> gender >> gpa;
....
您正在丢失一半的输入,因为您在while循环后立即重写新值。相反,你应该摆脱while块内的inData >>gender >>gpa
,只使用gender和gpa。
编辑:你的功能应如下所示:
void sumGrades( ifstream& inData, int& countFemale,
int& countMale, float& sumFemaleGPA, float& sumMaleGPA)
{
char gender;
float gpa;
while(inData>> gender>>gpa)
{
if(gender == 'm')
{
sumMaleGPA += gpa;
countMale++;
}
else if (gender == 'f')
{
sumFemaleGPA += gpa;
countFemale++;
}
}
}
此外,您打开输入和输出文件流但不关闭它们。这不好。
当您的流类型是ifstream和ofstream文件流时,也没有理由为sumGrades函数设置istream和ostream参数类型。
解决所有这些问题,如果仍然无法正常评论
答案 1 :(得分:3)
这里可以改进很多东西
首先,在C ++中通常的做法是将每个事物的这些函数分组为class
其次,没有必要创建函数,其唯一目的是从main
中取出代码并仅调用它们一次
第三,没有必要拥有所有这些变量。
第四,我个人更喜欢double
到float
,因为除非有严重的空间问题并且验证了精确度,否则double
会避免许多舍入问题。
第五,请不要使用using namespace std;
拼写它更清晰,如果将代码移动到常见的include
文件,也不会导致问题。
第六,请明确关闭您打开的文件。
第七,使用包含文件
这是我尝试过的方式:
包含文件 GradeCategory.h :
#ifndef GRADE_CATEGORY_H
#define GRADE_CATEGORY_H
#include <iostream>
class GradeCategory
{
public:
GradeCategory() : total(0.0), count(0) {
}
void add(double grade) {
total+=grade;
count++;
}
double average() const {
return total/count;
}
friend std::ostream& operator << (std::ostream& S, const GradeCategory& rhs) {
return S << rhs.average();
}
private:
double total;
int count;
};
#endif
这是 main.cpp 文件:
#include <fstream>
#include <iomanip>
#include "GradeCategory.h"
int main() {
std::ifstream inData;
inData.open("cpga.txt");
GradeCategory map[256];
unsigned char gender;
double gpa;
while( inData >> gender >> gpa ) {
map[gender].add(gpa);
}
inData.close();
std::ofstream outData;
outData.open("avggpa.txt");
outData << std::fixed << std::showpoint << std::setprecision(2);
outData << "Average Male GPA: " << map['m'] << std::endl;
outData << "Average Female GPA: " << map['f'] << std::endl;
outData.close();
}