Accelerated C++ の問題 4-6 に取り組んでいます。この質問では、Student_info
構造体、read()
関数、およびgrade()
関数を書き直して、最終的な成績がすぐに計算され、唯一の成績として に格納されるようにすることを求めていStudent_info
ます。
以前は、プログラムは次のように機能していました。
read()
入力ストリームから読み取り、データをStudent_info
オブジェクトに格納します- 各オブジェクトはベクトルに追加されます
- すべてのオブジェクトが読み取られて追加されると、ベクター内の
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);
}