1

我正在做一项家庭作业,该作业使用外部文件计算 GPA 和课程平均值。代码并没有完全充实,但我已经构建了足够多的代码,它至少应该能够向我展示它可以从外部文件(在 TextWrangler 中创建的纯文本文件)中提取数据,并计算数字.

但是,当我运行它时,它似乎只会拉出输出文件的每一。关于我可能出错的地方有什么想法吗?

#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
using namespace std;

int main()
{

    int studentID, studentCounter=0;
    double grade1, grade2, grade3, grade4, course1Sum=0, course2Sum=0, course3Sum=0, course4Sum=0, course1Average, course2Average, course3Average, course4Average, GPA;
    ifstream inputFile;
    string filename;

    for (int x=1; x<=3; x++) {

        // Get the filename from the user.
        // /Users/etc/Desktop/HW5test.txt - valid set
        // /Users/etc/Desktop/HW5testset.txt - test set


        cout<<"Enter the filename: ";
        cin>>filename;

        // Open the file.
        inputFile.open(filename.c_str());
        // If the file successfully opened, process it.
        if (inputFile) {
            // Read the numbers from the file and display them.
            while (inputFile>>studentID>>grade1>>grade2>>grade3>>grade4)
            {
                if (studentCounter==0) // Prints header if at the start of the program.
                    cout<<"Header placeholder"<<endl;

                inputFile>>studentID>>grade1>>grade2>>grade3>>grade4;
                GPA=(grade1+grade2+grade3+grade4)/4;
                cout<<studentID<<" "<<GPA<<" "<<"Special message (if needed)."<<endl;

                // Course Average and Student Accumulators
                course1Sum+=grade1;
                course2Sum+=grade2;
                course3Sum+=grade3;
                course4Sum+=grade4;
                studentCounter++;

            } // Ends while() loop.

            if (studentCounter==0)
                cout<<"File contains no data."<<endl;

            else {

            // Perform course averages here, after all data has been read.
            course1Average=course1Sum/studentCounter;
            cout<<"Course 1 average: "<<course1Average<<endl;
            course2Average=course2Sum/studentCounter;
            cout<<"Course 2 average: "<<course2Average<<endl;
            course3Average=course3Sum/studentCounter;
            cout<<"Course 3 average: "<<course3Average<<endl;
            course4Average=course4Sum/studentCounter;
            cout<<"Course 4 average: "<<course4Average<<endl<<endl;

            } // Ends "else" of file empty error check.

            // Close the input file.
            inputFile.close();
        } // Ends "if" of if/else().
        else {
            cout<<"Error opening the file.\n";
        } // Ends "else" of if/else().


    } // Ends for() loop.

    return 0;
} // Ends main().

输入文件数据:

1001 3.0 2.7 2.0 2.8 
1002 3.7 3.5 4.0 4.0 
1003 0.0 1.0 2.2 1.0 
1004 4.0 3.0 3.5 3.5 

我的输出看起来像这样(请记住,仍在处理部分,但请注意它只是拉动所有其他条目:

Enter the filename: /Users/etc/Desktop/HW5testset.txt
Header placeholder
1002 3.8 Special message (if needed).
1004 3.5 Special message (if needed).
Course 1 average: 3.85
Course 2 average: 3.25
Course 3 average: 3.75
Course 4 average: 3.75

会发生什么?

4

3 回答 3

1

inputFile>>studentID>>grade1>>grade2>>grade3>>grade4出现在您的 while 语句和 while 语句中。删除不在while条件下的实例(GPA=.

您阅读了 while 语句中的行,然后阅读了下一行,因此永远看不到这两行中的第一行。仅仅因为代码在其中while()并不意味着它没有副作用

编辑

也让你的

if (studentCounter==0) // Prints header if at the start of the program.
    cout<<"Header placeholder"<<endl;

进入:

if (studentCounter==0) { // Prints header if at the start of the program.
    studentCounter++;
    cout<<"Header placeholder"<<endl;
    continue;
}
于 2012-12-09T21:23:36.017 回答
0

您的 while 循环已经将输入流读入 studentID、grade1、grade2、grade3、grade4。

它们已经在循环的每次迭代中设置。通过在打印标题后再次读取输入流,您正在更新变量,这就是您读取所有偶数行的原因。

while (inputFile>>studentID>>grade1>>grade2>>grade3>>grade4) { // reads 1001
    // grade1-grade4 are already set
    if (studentCounter==0) // Prints header if at the start of the program.
    cout<<"Header placeholder"<<endl;
    inputFile>>studentID>>grade1>>grade2>>grade3>>grade4; // reads 1002, remove this line
    GPA=(grade1+grade2+grade3+grade4)/4;
    ...
于 2012-12-09T21:32:13.860 回答
0

通过inputFile>>studentID>>grade1>>grade2>>grade3>>grade4在代码中执行两次,每次while循环迭代时都会读取输入文件的两行。您应该删除其中之一,可能是 while 循环内的那个。

于 2012-12-09T21:33:04.667 回答