检查我的逻辑? (平均gpa计算程序)

时间:2010-12-19 02:24:44

标签: c++

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

1 个答案:

答案 0 :(得分:3)

这些行不会:跳过其他所有行:

while( inData >> gender >> gpa )
{
  inData >> gender >> gpa;

您正在使用&gt;&gt;的返回运算符指示while循环测试成功,但每次执行时,它是否消耗该行并移动到下一行,因此当您在while循环内再次执行它时,您有效地覆盖第1行的数据使用第2行的数据并忽略第1行。