该题属于综合题。
难点在于:
1. 指定字母和对应的数值如何匹配,
2. 如何输入不同长度的字符串,
3. 每一轮都需要考虑重置
4. 终止循环满足的条件
总结如下:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
string s;
// 注意点1:getline从标准输入中读取一行文本,并存储到字符串s中
while(getline(cin, s))
{
//注意点2:新的一轮需要重置数值
// sum需要重置为0
float sum = 0;
// 计数需要重置为0
int count = 0;
// 标记ABCDF以外的字母,flag重置为1
int flag = 1;
// 注意点3:s.size()与count的区别
for(int i = 0; i < s.size(); i++)
{
if(s[i] == 'A') {sum += 4; count++;}
else if(s[i] == 'B') {sum += 3; count++;}
else if(s[i] == 'C') {sum += 2; count++;}
else if(s[i] == 'D') {sum += 1; count++;}
else if(s[i] == 'F') {sum += 0; count++;}
// 注意点4:continue
// 在执行过程中跳过当前循环迭代的剩余部分,然后继续下一次迭代,
// 通常用于在某个特定条件下,跳过某些特定的迭代操作,但仍然继续循环。
else if(s[i] == ' ') continue;
else
{
flag = 0;
cout << "Unknown" << endl;
// 注意点5:break
// 终止离它最近的条件语句,break之后的代码都不会再执行
break;
}
}
// 法1:cout指定精度
// 使用iomanip库中的setprecision函数来设置输出的小数点位数。
// 使用fixed来指定使用固定点表示法,使用setprecision(2)来设置小数点后保留两位
if(flag) cout << fixed << setprecision(2) << (sum / count) << endl;
// 法2:printf指定精度
// 使用printf函数时,可以使用格式化字符串来指定输出的格式
// %f表示输出一个浮点数,%.2表示保留两位小数,f表示输出的浮点数
// if(flag) printf("%.2f\n", sum / count);
}
return 0;
}