1

外部ファイルを使用して GPA とコースの平均を計算する宿題に取り組んでいます。コードは完全には肉付けされていませんが、外部ファイル (TextWrangler で作成されたプレーン テキスト ファイル) からデータを取得し、数値を計算できることを少なくとも示すことができるように、十分にビルドしました。 .

ただし、実行すると、出力ファイルの 1 行おきにプルしているようにしか見えません。私が間違っている可能性がある場所のアイデアはありますか?

#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>>grade4while ステートメントと while ステートメント内に表示されます。while 条件にないインスタンス ( GPA=.

while ステートメントの行を読み取ってから次の行を読み取るため、2 行のうち最初の行は表示されません。コードが にあるからといって、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

Your while loop already reads the input stream into studentID, grade1, grade2, grade3, grade4.

They are already set in each iteration of the loop. By reading the input stream again after printing your header, you are updating your variables, which is why you're reading all the even numbered lines.

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

コード内で 2 回実行すると、ループが繰り返さinputFile>>studentID>>grade1>>grade2>>grade3>>grade4れるたびに入力ファイルの 2 行が読み取られます。whileこれらの 1 つ (おそらく while ループ内のもの) を削除する必要があります。

于 2012-12-09T21:33:04.667 に答える