我的代码有什么问题?输出(平均女性GPA:南)

时间:2015-11-27 16:43:25

标签: c++

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

}

有人能发现这段代码有什么问题吗?干杯!

2 个答案:

答案 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中取出代码并仅调用它们一次

第三,没有必要拥有所有这些变量。

第四,我个人更喜欢doublefloat,因为除非有严重的空间问题并且验证了精确度,否则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();

}