从标准输入连续读入n(n<10)个学生的学号(不超过int类型表示范围)、姓名(由不超过10个英文字母组成)以及数学、英语、语文三门课的成绩,计算个人的总成绩,并且按个人的总成绩由低到高排序(如果总成绩相同,按学号由低到高排序,但前面的排序序号不变,即两人排名相同),将排名结果在屏幕上显示出来(要求同一列右对齐,其中排名占4个字符、学号占10个字符,姓名占10个字符,数学、英语、语文各占5个字符)。如输入的学生人数大于等于10,则打印输出"Please input 1-9.", 然后,退出程序。
时间: 2023-12-12 13:02:24 浏览: 245
输入学生成绩并打印出排名信息
好的,这是一个关于学生成绩排序的问题,我来解答一下。
首先,我们可以定义一个结构体表示学生信息:
```c++
struct Student {
int id; // 学号
string name; // 姓名
int math; // 数学成绩
int english; // 英语成绩
int chinese; // 语文成绩
int total; // 总成绩
};
```
然后,我们可以定义一个数组保存所有学生信息,并且按照题目要求读入学生信息:
```c++
const int MAXN = 10;
Student students[MAXN];
int n; // 学生人数
// 读入学生信息
void readStudents() {
for (int i = 0; i < n; i++) {
cin >> students[i].id >> students[i].name
>> students[i].math >> students[i].english >> students[i].chinese;
students[i].total = students[i].math + students[i].english + students[i].chinese;
}
}
```
接着,我们可以实现一个比较函数,用来对学生信息进行排序。首先按照总成绩从低到高排序,如果总成绩相同,则按照学号从低到高排序:
```c++
// 比较函数,用于排序
bool cmp(Student a, Student b) {
if (a.total != b.total) {
return a.total < b.total;
} else {
return a.id < b.id;
}
}
```
最后,我们可以按照排名的格式,输出所有学生信息:
```c++
// 输出学生信息
void printStudents() {
cout << "排名\t学号\t姓名\t数学\t英语\t语文\t总成绩" << endl;
for (int i = 0; i < n; i++) {
cout << right << setw(4) << i + 1 << "\t"
<< right << setw(10) << students[i].id << "\t"
<< left << setw(10) << students[i].name << "\t"
<< right << setw(5) << students[i].math << "\t"
<< right << setw(5) << students[i].english << "\t"
<< right << setw(5) << students[i].chinese << "\t"
<< right << setw(5) << students[i].total << endl;
}
}
```
完整代码如下:
阅读全文