1

Accelerated C++ の問題 4-6 に取り組んでいます。この質問では、Student_info構造体、read()関数、およびgrade()関数を書き直して、最終的な成績がすぐに計算され、唯一の成績として に格納されるようにすることを求めていStudent_infoます。

以前は、プログラムは次のように機能していました。

  1. read()入力ストリームから読み取り、データをStudent_infoオブジェクトに格納します
  2. 各オブジェクトはベクトルに追加されます
  3. すべてのオブジェクトが読み取られて追加されると、ベクター内のgrade()すべてのオブジェクトで呼び出されますStudent_info

read()新しい制約では、関数と関数を組み合わせる必要があると感じているgrade()ため、中間グレードを保存する必要はありません。問題は、ストリームから読み取るときに、ファイルの終わりに到達するまでわからないことです。grade()これを行うとき、ファイルデータの最後で関数 を呼び出そうとします。

制約がデータを読み取ってすぐに処理することであることを考えると、回避策はありません。これはどのように処理できますか?

struct Student_info 
{
    std::string name;
    double final_grade;
};

istream& read(istream& is, Student_info& s)
{
    double midterm, final;
    is >> s.name >> midterm >> final;

    // Error, when EOF is read, grade() will process bad data
    s.final_grade = grade(midterm, final);
    return is;
}

void main()
{
    vector<Student_info> students;
    Student_info record;
    while (read(cin, record))
        students.push_back(record);
}
4

1 に答える 1

2

関数内でレコードが正常に読み取られたかどうかを確認できreadます。たとえば、次のようにします。

istream& read(istream& is, Student_info& s)
{
    string name;
    double midterm, final;

    if( is >> name >> midterm >> final ) {
        s.name = name;
        s.final_grade = grade(midterm, final);
    }

    return is;
}

元のコードのように直接読み取ることもできますが、私の実装にはトランザクションのセマンティクスがあることに注意してくださいs.name。構造全体を読み取るか、すべてのフィールドの読み取りに失敗した場合に備えてそのままにしておきます。

于 2013-04-17T12:36:26.847 に答える