-1

各学生の SSN と成績を生成し、学生の SSN を最大スコアとともに表示しながら、最小、最大、平均スコアを計算する必要がある宿題に取り組んでいます。合計ではなく、すべての学生の最小、最大、平均の反復を取得し、最大スコアの学生のSSNを取得しないことを除いて、すべて機能します。データはファイルから読み込まれます。


123-45-6789 87
123-56-9872 91
など の出力が必要です。

次に、最大スコア: 91 SSN: 123-45-6789
最小スコア: 23
平均スコア: 86 で終了します。

これがコードです。どんな助けも素晴らしいでしょう。

#include <iostream>
#include <string>
#include <fstream>          // for file I/O
#include <iomanip>

using namespace std;

int main ()
{
    string ssn, maxSSN;
    int grade = 0, totalGrades = 0, count = 0, maxScore = 0, minScore = 0;
    double avgScore = 0;

    ofstream printFile ("StudentGrades.txt");
    if (!printFile) 
    {
        cout << " Error opening printFile" << endl;
        system ("pause");
        return 100; 
    }

    //ifstream studentFile ("lab5a.dat");       // alternative open

    ifstream studentFile;
    studentFile.open("c:\\lab5a.dat");

    if (!studentFile)
    {
        cout << "Open error on lab5a.dat" << endl;
        system ("pause");
        return 101;
    }

    cout << "   SSN     Grade" << endl;
    cout << "---------  -----" << endl;



    while (!studentFile.eof())
    {
        studentFile >> ssn >> grade;
        if (count == 0)
        {
            maxScore = grade;
            minScore = grade;
        }
        else
        {
            if (grade > maxScore)
                maxScore = grade;
            if (grade < minScore)
                minScore = grade;
        }
            totalGrades += grade ;
            count++;
            cout << ssn << setw(7) << grade << endl;
    }

        if (count)
        avgScore = totalGrades / (double) count;

        cout << "\n\n";
        cout << "Maximum Score: " << maxScore << "      Student SSN:" << maxSSN << endl;
        cout << "Minimum Score: " << minScore << "\n";
        cout << "Average Score: " << avgScore << "\n";
        //studentFile >> ssn >> grade;


        printFile << ssn;
        if (grade >= 90)      
            printFile << "  A" << endl;
        else if (grade >= 80) 
            printFile << "  B" << endl;
        else if (grade >= 70) 
            printFile << "  C" << endl;
        else if (grade >= 60) 
            printFile << "  D" << endl;
        else                  
            printFile << "  F " << endl;


    studentFile.close();    
    printFile.close();      

    system ("pause");
}

コード変更後の出力。

maxScore SSN が表示されないことを除けば、すべて問題ありませんか?

4

2 に答える 2

2

問題の 1 つは次のとおりです。

while (!studentFile.eof())
{
    studentFile >> ssn >> grade;  //put read records here

    if (count == 0)
    {
        maxScore = grade;
        minScore = grade;
    }
    else
    {
        if (grade > maxScore){
            maxScore = grade;
            maxSSN = ssn
        }
        if (grade < minScore)
            minScore = grade;
    }
        totalGrades += grade ;
        count++;
  }//^^^^should end your while loop here, finish reading all then do average

    //^^^^^now compute the averageScore
    if (count)
    avgScore = totalGrades / (double) count;

最初にロジックを明確にするようにしてください。他に問題がある場合は、それを見つけることができます。while ループ内で、現在の最大 SSN を覚えていませんでした。

于 2013-03-29T23:28:22.050 に答える
0

入力ループは、以前のバージョンの質問からまだ壊れています。ループするeof()ことは悪い習慣であり、その理由は別の質問で説明されています。

これを変更してみてください:

while (!studentFile.eof())
{
    studentFile >> ssn >> grade;
    // ... the rest of your code
}

に:

while (studentFile >> ssn >> grade)
{
    // ... the rest of your code
}
于 2013-03-30T00:39:33.810 に答える