使用C语言解决下面这个问题:有一学生成绩表,包括学号、姓名、3门课程成绩。请按如下规则排序:按总成绩降序排序,若总成绩相同,则按姓名升序排序。
时间: 2024-05-08 20:21:37 浏览: 155
以下是使用C语言实现的代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX_STUDENTS 100 // 最大学生人数
typedef struct Student {
int id; // 学号
char name[20]; // 姓名
int score[3]; // 3门课程成绩
int totalScore; // 总成绩
} Student;
void sortStudents(Student *students, int num) {
int i, j;
Student temp;
// 冒泡排序
for (i = 0; i < num - 1; i++) {
for (j = 0; j < num - i - 1; j++) {
if (students[j].totalScore < students[j+1].totalScore ||
(students[j].totalScore == students[j+1].totalScore && strcmp(students[j].name, students[j+1].name) > 0)) {
// 交换两个学生的位置
temp = students[j];
students[j] = students[j+1];
students[j+1] = temp;
}
}
}
}
int main() {
int num, i, j;
Student students[MAX_STUDENTS];
printf("请输入学生人数(最多100人):");
scanf("%d", &num);
printf("请依次输入每个学生的学号、姓名、3门课程成绩:\n");
for (i = 0; i < num; i++) {
scanf("%d %s %d %d %d", &students[i].id, students[i].name, &students[i].score[0], &students[i].score[1], &students[i].score[2]);
// 计算总成绩
students[i].totalScore = students[i].score[0] + students[i].score[1] + students[i].score[2];
}
sortStudents(students, num);
printf("排序结果:\n");
for (i = 0; i < num; i++) {
printf("%d %s %d %d %d %d\n", students[i].id, students[i].name, students[i].score[0], students[i].score[1], students[i].score[2], students[i].totalScore);
}
return 0;
}
```
代码中定义了一个 `Student` 结构体表示学生信息,包括学号、姓名、3门课程成绩和总成绩。通过 `sortStudents` 函数实现排序,采用冒泡排序算法,先按总成绩降序排序,若总成绩相同则按姓名升序排序。最后输出排序结果。
阅读全文