2010-12-19 50 views
2

程序從.txt文件中讀取以下數據:檢查我的邏輯? (平均GPA計算程序)

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毫秒,平均成績的對於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;  
}  
+0

我認爲你在嘗試有點太難以削減成多重e文件,並且難以正確使用返回值,或者嘗試設計一些類。 – 2010-12-19 04:33:25

+0

不要在頂部聲明所有變量。在即將使用它們時聲明(並初始化)它們。 – 2010-12-19 07:33:19

回答

3

難道這些行:跳過所有其他行:

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

您使用>>操作符的迴歸表示while循環的測試成功,但是每次執行它時,它是否不會消耗該行並移到下一行,因此當您在while循環內再次執行它時,將有效地用第2行中的數據覆蓋第1行中的數據並忽略第1行。

+0

賓果,拿出來,它像一個魅力。非常感謝 – darko 2010-12-19 02:37:09

+0

我最初使用的是這種方式,但是這種方式被認爲是更好。看到我以前的帖子的答案:http://stackoverflow.com/questions/4479504/first-fstream-program/4479587#4479587 – darko 2010-12-19 02:48:15

+0

好吧,我做了一些更多的研究,我想會發生什麼是ifstream投到一個指針在while循環中用作測試時,如果設置了失敗位(當您嘗試讀取過去的EOF時發生),則返回null,該值與false相同。所以是的,這種用法很好。 – 2010-12-19 04:03:30