我的代码出了什么问题?产出(女性平均绩点:nan)
Whats wrong with my code? Output (Average Female GPA: nan)
程序从.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代表女性)。但是程序在新文件中输出的是:
平均男性平均绩点:nan
女性平均绩点: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();
}
有人能发现这个代码出了什么问题吗?干杯
这里有很多错误:
首先,在初始化函数中,您没有初始化任何通过引用传递的浮点值。相反,你可能想这样做:
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参数类型。
修复所有这些问题,并在仍然不工作时进行评论
有很多地方可以改进
首先,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();
}
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 为什么这段代码返回 -nan(ind)?C++
- 运行代码时出现 NaN 错误
- 调试C++代码:捕获第一个 NaN 外观
- 我的代码出了什么问题?产出(女性平均绩点:nan)
- 避免代码重复的最佳方法,定义比较运算符"<,<=,>,>=,==,!=",但要考虑NaN?