我的代码出了什么问题?产出(女性平均绩点:nan)

Whats wrong with my code? Output (Average Female GPA: nan)

本文关键字:nan 代码 什么 问题 产出 我的      更新时间:2023-10-16

程序从.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();
}