1

私の課題は、gradbook テキスト ファイルから読み取り、すべての学生のプログラム、中間および最終スコア、学生 ID、姓名を平均化することです。これまでのところ、コードはスコアを適切にコンパイルして計算できますが、studentID と姓名は読み取れません。

その理由は、main() の currentStudent 変数にパラメーターがなく、コンストラクターにデフォルト値を使用させるためだと確信しています。しかし、main() で Student クラスから currentStudent 値を与える方法がわかりません。私の最善の解決策は、ReadData からすべてを main() に移動することですが、私の課題の ReadData の説明から、必要なものはすべてそこにあると思います。

「生徒のデータを読み取る ReadData(istream&) というメソッド。ID 番号 (整数)、姓名 (文字列) をこの順序で読み取り、10 のプログラムの点数 (すべて整数)、中間および試験の点数 (およびすべてのデータが正常に読み取られた場合は true を返し、それ以外の場合は false を返します。"

説明が長くなって申し訳ありません。自分の状況を効果的に説明できるかどうかを確認しているだけです。ヘルプやアドバイスをいただければ幸いです。

クラス定義、コンストラクター、ReadData、およびメインのみを以下に含めました。他のすべては、すべてが機能すると確信している方程式と get/set にすぎないためです。終えた。誰かが完全なコードを見たい場合は、残りを投稿します。

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

class Student
{
private:
    int studentID;
    string firstName,
    lastName;
    int score[ 10 ];
    int midterm, final;
public:
    Student ( int, string, string );
    bool ReadData ( istream& );
    //fstream WriteData ( ostream& ); // I need to clear up with professor first
    void setStudentID ( int );
    void setFirstName ( string );
    void setLastName ( string );
    void setMidterm ( int );
    void setFinal (int );
    const int getStudentID ( );
    const string getFirstName ( );
    const string getLastName ( );
    const int getMidterm ( );
    const int getFinal ( );
    void setProgramScore ( int, int[ ] );
    int getProgramScore ( int );
    const double ProgramAvg( );
    const double CourseAvg( );
    ~Student( );
};

Student::Student ( int id = 0, string f = "", string l = "" )
{
    setStudentID ( id );
    setFirstName ( f );
    setLastName ( l );
};

bool Student::ReadData( istream &readStudent ) 
{
    int id;
    string first, last;
    int x[ 10 ], mid, fin;

    readStudent >> id >> first >> last;

    for ( int i = 0; i <= 10 - 1; i++ )
    {
        readStudent >> x [ i ];
        setProgramScore( i, x );
    }
    readStudent >> mid >> fin;

    Student studentInfo ( id, first, last );
    setMidterm( mid );
    setFinal( fin );

    if ( readStudent.good( ) )
        return true;
    else
        return false;
};

// getter、setter、およびその間の計算

int main( )
{
    ifstream readStudent;
    int lineCount = 0;
    double totalProgramAvg = 0
        , totalFinalAvg = 0
        , totalCourseAvg = 0;

    Student currentStudent; 
    readStudent.open ( "gradebook.txt" );
    if ( readStudent.is_open ( ) )
    {

        while ( currentStudent.ReadData ( readStudent ) == true )
        {
            totalProgramAvg += currentStudent.ProgramAvg();
            totalFinalAvg += currentStudent.getFinal();
            totalCourseAvg += currentStudent.CourseAvg();
            cout << currentStudent.getStudentID() << " "
                << currentStudent.getFirstName() << " "
                << currentStudent.getLastName() << " ";
            for ( int j = 0; j < 10; j++ )
                cout << currentStudent.getProgramScore( j ) << " ";
            cout << currentStudent.getMidterm() << " "
                << currentStudent.getFinal() << endl;
            cout <<  totalProgramAvg << " " << totalCourseAvg << endl;
            lineCount++;
        };
    readStudent.close( );

        cout << lineCount << endl << totalProgramAvg / lineCount << "\n" <<     totalFinalAvg / lineCount << "\n" << totalCourseAvg / lineCount;

    system ("pause");
    };
};
4

1 に答える 1

1
bool Student::ReadData( istream &readStudent ) 
{
    int id;
    string first, last;
    int x[ 10 ], mid, fin;

    readStudent >> id >> first >> last;

    for ( int i = 0; i <= 10 - 1; i++ )
    {
        readStudent >> x [ i ];
        setProgramScore( i, x );
    }
    readStudent >> mid >> fin;

    Student studentInfo ( id, first, last );
    setMidterm( mid );
    setFinal( fin );

    if ( readStudent.good( ) )
        return true;
    else
        return false;
}; //what?

あなたのコードの残りの部分はチェックしていませんが、これは間違いです。

新しいアイテムを宣言するべきではありませんStudent studentInfo( id, first, last); 関数が返されたときに死ぬだけの新しいアイテムを作成しています。代わりに、id,first,last を使用して、現在のオブジェクト メンバーを変更する必要がありますthis。クラスヘッダーでこのアイテムを宣言しましたが、ローカルスコープ変数を宣言し、それらを使用し、それを使用して新しい学生を作成し、関数が戻ってスコープ外に出るとすべてが破棄されます。取得する関数から適切とマークしたものを削除/追加するだけです

bool Student::ReadData( istream &readStudent ) 
{
    int x[ 10 ], mid, fin; //if it ain't broke, don't fix it

    readStudent >> studentID >> firstName >> lastName;  //use your class members that you want to hold that data.  

    for ( int i = 0; i <= 10 - 1; i++ )
    {
        readStudent >> x [ i ];
        setProgramScore( i, x );
    }
    readStudent >> mid >> fin;


    setMidterm( mid );
    setFinal( fin );

    if ( readStudent.good( ) )
        return true;
    else
        return false;
}

クラス関数でクラスメンバーに直接アクセスできますStudent::ReadData( istream &readStudent)。すべてのメンバーに対してそれを行う必要がありますが、スコアシステムが機能しているとのことでしたので、そのままにしておきました。

最後に、それ;が、または、またはその束}のようなものであるかどうかはわかりませんが、関数定義ではありません。structclassstuff

わかりました、あなたのプロジェクト フローに別のバグ / 欠陥があります。

while ( currentStudent.ReadData ( readStudent ) == true ) { /*stuff*/ }正しく動作しません。ReadData 関数は現在の生徒のすべてのデータを読み込みますが、while ループもそれを試みます。私は結果を理解することはできませんが、それは間違いなく醜いでしょう. 次のように使用することをお勧めします。

if(!(currentStudent.ReadData( readStudent)) {
     //Ooops, I failed, what do I do?
}
于 2013-09-11T17:05:29.673 に答える