1

以前にこのプログラムを実行したことがありますが、問題なく動作しました。次に、「if」ステートメントを「set」メソッドに追加すると、プログラムを実行したときに非常に大きな数値が表示されるようになりました。この問題を解決するにはどうすればよいですか、またはなぜこれが起こっているのか誰かが教えてくれますか?

class GradeBook{

public: 
    void setStudentID(int ID){

        if(10000 <= studentID && studentID <= 50000){

            studentID = ID;
        }
    }

    int getStudentID(){

        return studentID;
    }

    void setStudentGrade(int grade){

        if(0 <= studentGrade && studentGrade <= 100){

        studentGrade = grade;
        }
    }

    int getStudentGrade(){

        return studentGrade;
    }

    void displayMessage(){

        cout << "Student " << getStudentID() << " has a score of " << getStudentGrade() << endl;
    }

private:

    int studentGrade;
    int studentID;
};

int main(){

    int nameOfID;
    int nameOfGrade;
    GradeBook gb;

    cout << "Please enter a student ID: " << endl;
    cin >> nameOfID;
    gb.setStudentID(nameOfID);
    cout << "Please enter the student's grade: " << endl;
    cin >> nameOfGrade;
    gb.setStudentGrade(nameOfGrade);
    getchar();

    gb.displayMessage();
    getchar();
}
4

4 に答える 4

1
  1. あなたはあなたが意図した比較が間違っています。

    if(10000 >= studentID && studentID <= 50000)
    
  2. 変数が初期化されていることを確認するためのelseステートメントがないため、次のように変更します。

    if(10000 >= studentID && studentID <= 50000){
         studentID = ID;
    }
    else{
         studentID = 0; //or whatever value you want to mean invalid
    }
    

    これで問題が解決することを願っています。

于 2012-04-05T00:44:19.443 に答える
1

2つの推測(私はC ++が得意ではありません):

  1. 変数は初期化されていません。if 式が true に評価されない場合、プライベート変数は何も設定されません。「大きな数」は、変数が格納されているメモリにたまたまあるランダムな値です。
  2. cin を使用して文字列を読み取り、そのポインターを set-methods に渡しています。「大きな数」は実際には(おそらくいくつかの文字化けした表現)ポインターアドレスになります。

編集:実際には、2を忘れてください。これは、それが機能することを示唆しているようです。私のC++はやや錆びています;-)

于 2012-04-05T00:39:49.777 に答える
0

GradeBook gb を定義する場合、プライベート フィールド (studentGrade および studentID) は初期化されません。次に、gb.setStudentID は、studentID の読み取りを試みます。StudentID はランダムな値になります。

于 2012-04-05T00:43:56.040 に答える
0

私が最初に気付いたのは、ivar が初期化されていないことです。そのため、セッターの入力が検証されない場合は、特定した動作が予想されます。

デフォルトのコンストラクターを作成し、2 つの変数を 0 に初期化する必要があります。

于 2012-04-05T00:42:09.520 に答える