描述:依次输入一个学生的学号,以及3科(C语言,数学,英语)成绩,在屏幕上输出该学生的学号,3科成绩(注:输出成绩时需进行四舍五入且保留2位小数)。 数据范围:学号满足1≤n≤20000000,各科成绩使用百分制,且不可能出现负数。 输入描述:学号以及3科成绩,学号和成绩之间用英文分号隔开,成绩之间用英文逗号隔开。 输出描述:学号,3科成绩,输出格式详见输出样例。 示例1 输入:17140216;80.845,90.55,100.00 输出: The each subject score of No. 17140216 is 80.85,90.55,100.00. 示例2 输入:123456;93.33,99.99,81.20 输出:The each subject score of No. 123456 is 93.33,99.99, 81.20.
时间: 2025-03-08 22:02:05 浏览: 103
<<
为了解决这个问题,我们可以按以下步骤操作:
1. **读取并解析输入**:我们需要从标准输入中读取一行字符串,并将其分割成学号和各个科目的成绩。
2. **处理成绩的四舍五入与格式化输出**:根据要求对成绩进行四舍五入到两位小数点后,然后按照指定的格式将结果打印出来。
下面是完整的解决方案代码实现及其详细解释:
```cpp
#include <iostream>
#include <iomanip> // 控制流精度等
#include <sstream> // 使用stringstream解析输入
using namespace std;
int main() {
string input;
getline(cin, input); // 读取整行输入
size_t pos = input.find(";");
if (pos == string::npos) {
cout << "Invalid Input Format" << endl;
return -1;
}
string student_id = input.substr(0, pos);
stringstream ss(input.substr(pos + 1));
double scores[3];
char delimiter;
for(int i=0;i<3;++i){
if (!(ss >> scores[i])) {
cout << "Error parsing score." << endl;
return -1;
}
if(i != 2 && !(ss>>delimiter)){
cout << "Missing comma between values.";
return -1;
} else{
if(delimiter!=','){
cout<<"Delimiter should be ','"<<endl;
return -1;
}
}
// 按照需求进行四舍五入保留两位小数的操作
scores[i] = round(scores[i]*100)/100;
}
// 打印结果前设置浮点数显示规则
cout.setf(ios::fixed|ios::showpoint);
cout.precision(2);
cout << "The each subject score of No. " << student_id << " is ";
for (size_t i = 0; i < 3; ++i)
cout <<scores[i]<< ((i==2)?".":",");
return 0;
}
```
### 解释:
- `getline` 函数用于获取用户的一行输入作为整个输入串;
- 我们利用了 C++ 标准库中的 `<string>` 和 `<sstream>` 来分别处理字符串的基本操作如查找、提取子串等功能及基于字符流的数据解析任务;
- 对于每一个分数值我们做了基本验证确保它是有效的数字,并且检查相邻两个数值间的分隔符是否正确地使用了英文逗号 `,`;
- 在准备打印最终的结果之前设置了正确的浮点数格式选项以保证能够准确地控制输出中小数部分的长度(即只显示到第二位),并且采用 `round()` 方法实现了“四舍五入”的功能;
为了进一步完善程序的功能或性能优化,你可以考虑添加更多的错误检测逻辑来应对更复杂的非法输入情况。另外也可以尝试改进输出语句让其看起来更加美观易读。
阅读全文
相关推荐















