假设学生的基本信息包括学号、姓名、三门课程成绩以及个人平均成绩,定义一个能够表示学生信息的结构类型。输入n(n<50)个学生的成绩信息,按照学生的个人平均分从高到低输出他们的信息。 注意: 1)平均分出现相同的分数时按学号从小到大进行排序输出。 2)平均分以四舍五入取整数保存。 输入格式: 输入一个正整数n(n<50),下面n行输入n个学生的信息,包括:学号、姓名、三门课程成绩(整数)。 输出格式: 输出从高到低排序后的学生信息,包括:学号、姓名、三门课程成绩、平均分(整数)
时间: 2023-12-23 13:06:59 浏览: 327
下面是一个可能的解法,使用了结构体和快速排序算法:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define MAX_N 50
#define MAX_NAME_LEN 20
typedef struct {
int id;
char name[MAX_NAME_LEN];
int grades[3];
int avg_grade;
} Student;
int compare(const void *a, const void *b) {
Student *s1 = (Student*)a;
Student *s2 = (Student*)b;
if (s1->avg_grade != s2->avg_grade) {
return s2->avg_grade - s1->avg_grade; // 按平均分从高到低排序
}
return s1->id - s2->id; // 平均分相同时按学号从小到大排序
}
int main() {
int n;
Student students[MAX_N];
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %s %d %d %d", &students[i].id, students[i].name,
&students[i].grades[0], &students[i].grades[1], &students[i].grades[2]);
students[i].avg_grade = round((students[i].grades[0] + students[i].grades[1] + students[i].grades[2]) / 3.0);
}
qsort(students, n, sizeof(Student), compare);
for (int i = 0; i < n; i++) {
printf("%d %s %d %d %d %d\n", students[i].id, students[i].name,
students[i].grades[0], students[i].grades[1], students[i].grades[2],
students[i].avg_grade);
}
return 0;
}
```
其中,compare 函数用于比较两个学生的平均分和学号。qsort 函数用于对所有学生进行排序。round 函数用于将平均分四舍五入取整。
阅读全文