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