通过本练习进一步熟悉cin.get()与cin.getline()两种输入方式的各自的特点及其区别。
题目描述
每门课的成绩分为A、B、C、D、F五个等级,为了计算平均绩点,规定A、B、C、D、F分别代表4分、3分、2分、1分、0分。
输入
有多组测试样例。每组输入数据占一行,由一个或多个大写字母组成,字母之间由空格分隔。
输出
每组输出结果占一行。如果输入的大写字母都在集合{A,B,C,D,F}中,则输出对应的平均绩点,结果保留两位小数。否则,输出“Unknown”。
样例输入
A B C D F
B F F C C A
D C E F
样例输出
2.00
1.83
Unknown
这里使用cin.get()来获取所有输入的字符,然后进行逐一甄别判断。注意代码中flag标记的作用。代码如下
#include<iostream>
#include<iomanip>
using namespace std;
int main() {
char ch;
int c=0, sum=0, flag=0;
do {
ch = cin.get();
//cout.put(ch);
switch(ch) {
case ' ': break;
case 'A': {sum += 4; c++; break;}
case 'B': {sum += 3; c++; break;}
case 'C': {sum += 2; c++; break;}
case 'D': {sum += 1; c++; break;}
case 'F': {sum += 0; c++; break;}
case EOF:
case '\n': {
if(!flag) {
if(c!=0) cout << fixed << setprecision(2) << (1.0*sum/c) << endl;
}
else {
cout << "Unknown" << endl;
}
c=0;
sum=0;
flag=0;
break;
}
default: flag=1; // ch is not in{'A','B','C','D','F','\n'}
}
} while(ch != EOF);
return 0;
}
思考,上面的代码中,语句
if(!flag) {
if(c!=0) cout << fixed << setprecision(2) << (1.0*sum/c) << endl;
}
else {
cout << "Unknown" << endl;
}
能否写成下面的形式?
if(!flag && c!=0) {
cout << fixed << setprecision(2) << (1.0*sum/c) << endl;
}
else {
cout << "Unknown" << endl;
}
这里使用cin.getline()来获取所有输入的字符,getline()属于cin类的成员方法,getline()可以一直读取输入直到遇到换行符(即读取一行),同时它会丢弃换行符换成’\0’。同样注意代码中flag标记的作用。代码如下
#include<iostream>
#include<iomanip>
using namespace std;
//getline属于cin类的成员方法,他可以一直读取输入直到遇到换行符,同时它会丢弃换行符换成’\0’。
int main() {
char chs[80];
short c, sum, flag;
while (cin.getline(chs, 80)) {
c=0;
sum=0;
flag=0;
for(int i=0; chs[i]!='\0'; i++) {
if(chs[i]==' ') continue;
if(chs[i]!='A' && chs[i]!='B' && chs[i]!='C' && chs[i]!='D' && chs[i]!='F') {
cout << "Unknown" << endl;
flag=1;
break;
}
switch(chs[i]) {
case ' ': break;
case 'A': {sum += 4; c++; break;}
case 'B': {sum += 3; c++; break;}
case 'C': {sum += 2; c++; break;}
case 'D': {sum += 1; c++; break;}
case 'F': {sum += 0; c++; break;}
}
}
if(!flag) {
//cout << c << endl;
//cout << sum << endl;
//printf("%.2f\n", 1.0*sum/c);
cout << fixed << setprecision(2) << (1.0*sum/c) << endl;
}
}
return 0;
}