#include <iostream>
using std::cout;
using std::cin;
using std::endl;
int main()
{
int grade,
aCount = 0,
bCount = 0,
cCount = 0,
dCount = 0,
fCount = 0;
cout << "Enter the letter grades." << endl
<< "Enter the EOF character to end input." << endl;
while ( ( grade = cin.get() ) != EOF ) {
switch ( grade ) {
case 'A':
case 'a':
++aCount;
break;
case 'B':
case 'b':
++bCount;
break;
case 'C':
case 'c':
++cCount;
break;
case 'D':
case 'd':
++dCount;
break;
case 'F':
case 'f':
++fCount;
break;
case '\n':
case '\t':
case ' ':
break;
default:
cout << "Incorrect letter grade entered."
<< " Enter a new grade." << endl;
break;
}
}
cout << "\n\nTotal for each letter grade are:"
<< "\nA: " << aCount
<< "\nB: " << bCount
<< "\nC: " << cCount
<< "\nD: " << dCount
<< "\nF: " << fCount << endl;
return 0;
}
我构建并运行它并且它说'#34; EOF尚未宣布&#34;在第19行,即带有while标题的行。我逐个输入了确切的代码。
答案 0 :(得分:1)
EOF
中定义了cstdio
宏,但使用C ++风格的IO通常比C风格的IO更好。不是检查返回值以查看它是EOF
,而是最好检查cin.eofbit
(或者,因为其他问题可能是cin.failbit
)。您可以通过尝试将其评估为failbit
来检查流的bool
,如下所示。
如果用for循环替换while循环,则为
for (char grade = cin.get(); cin; grade = cin.get()) {
它应该工作得更好(在这种情况下你也应该删除最初的grade
声明,因为它只在循环中使用,应该在那里声明)。
编辑:
这可以进一步简化。 get
方法支持传入字符引用,因此您可以调用cin.get(grade)
而不是grade = cin.get()
。这样做的好处是,当传递字符引用时,get
返回流的副本,因此您可以同时执行读取和检查状态。使用此方法,您需要提前声明grade
,但循环可以从
while (cin.get(grade)) {
答案 1 :(得分:-2)
while ( ( grade = cin.get() ) != EOF ) {
在上面一行中,您只是将成绩作为输入。
EOF也应该有cin.get()
,除非它不起作用。
当你这样做时,你需要首先将EOF声明为char,就像在上面的行中一样,比较是在两个字符之间。