平均绩点

发布时间 2023-09-11 10:59:55作者: COMEIN

https://kamacoder.com/problem.php?id=1006

题目

每门课的成绩分为A、B、C、D、F五个等级,为了计算平均绩点,规定A、B、C、D、F分别代表4分、3分、2分、1分、0分。

有多组测试样例。每组输入数据占一行,由一个或多个大写字母组成,字母之间由空格分隔。

每组输出结果占一行。如果输入的大写字母都在集合{A,B,C,D,F}中,则输出对应的平均绩点,结果保留两位小数。否则,输出“Unknown”。

getline

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string str;
	while (getline(cin, str))
	{
    	int cnt = 0;
    	bool flag = 1;
    	double res = 0.0;
	    for (int i = 0; i < str.size(); ++i)
	    {
	        if (str[i] == 'A') { res += 4.0; cnt++; }
	        else if (str[i] == 'B') { res += 3.0; cnt++; }
	        else if (str[i] == 'C') { res += 2.0; cnt++; }
	        else if (str[i] == 'D') { res += 1.0; cnt++; }
	        else if (str[i] == 'F') { res += 0.0; cnt++; }
	        else if (str[i] == ' ') continue;
	        else {
	            cout << "Unknown" << endl;
	            flag = 0;
	            break;
	        }
	    }
	    if (flag)
	    {
	        printf("%.2f\n", res / cnt);
	    }
	}

	return 0;
}

getchar

比较麻烦,而且还不能通过,可能是因为while( getchar()!='\n )'死循环

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
	double res = 0.0;
	char ch;
	int cnt = 0;
	bool unknown = false;
	while (cin >> ch)
	{
		switch (ch) {
		case 'A': res += 4.0; break;
		case 'B': res += 3.0; break;
		case 'C': res += 2.0; break;
		case 'D': res += 1.0; break;
		case 'F': res += 0.0; break;
		default: unknown = true;  break;
		}
		if (unknown)
		{
		    cout << "Unknown" << endl;
		    unknown = false;
		    while (getchar() != '\n') {}
		    res = 0.0;
		    cnt = 0;
		    continue;
		}
		cnt++;
		if (getchar() == '\n')
		{
		    cout.setf(ios_base::fixed, ios_base::floatfield);
			cout << setprecision(2) << res / (1.0 * cnt) << endl;
			cnt = 0;
			res = 0.0;
			continue;
		}
	}

	return 0;
}