C语言写出下列代码并给出分析,与代码解释给出n个学生的成绩表,每条信息由学号、姓名与四门功课组成,完成(1)按学号排序(2)求每位学生的平均成绩,按平均分排序,要求用C语言实现
时间: 2024-03-17 14:41:27 浏览: 68
下面是按照题目要求实现的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NUM 100 // 最多支持100个学生
typedef struct {
int id; // 学号
char name[20]; // 姓名
int score[4]; // 四门功课成绩
float ave_score; // 平均成绩
} Student;
int cmp_id(const void *a, const void *b) { // 按学号排序的比较函数
return ((Student *)a)->id - ((Student *)b)->id;
}
int cmp_ave_score(const void *a, const void *b) { // 按平均成绩排序的比较函数
if (((Student *)a)->ave_score > ((Student *)b)->ave_score) {
return -1;
} else if (((Student *)a)->ave_score < ((Student *)b)->ave_score) {
return 1;
} else {
return 0;
}
}
void print_student(Student *s, int n) { // 输出学生信息
int i, j;
printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t成绩4\t平均成绩\n");
for (i = 0; i < n; i++) {
printf("%d\t%s\t", s[i].id, s[i].name);
for (j = 0; j < 4; j++) {
printf("%d\t", s[i].score[j]);
}
printf("%.2f\n", s[i].ave_score);
}
}
int main() {
Student students[MAX_NUM];
int n, i, j;
printf("请输入学生人数(不超过100人):");
scanf("%d", &n);
printf("请依次输入每位学生的学号、姓名和四门功课的成绩:\n");
for (i = 0; i < n; i++) {
scanf("%d%s%d%d%d%d", &students[i].id, students[i].name,
&students[i].score[0], &students[i].score[1],
&students[i].score[2], &students[i].score[3]);
students[i].ave_score = 0;
for (j = 0; j < 4; j++) {
students[i].ave_score += students[i].score[j];
}
students[i].ave_score /= 4;
}
// 按学号排序
qsort(students, n, sizeof(Student), cmp_id);
printf("按学号排序:\n");
print_student(students, n);
// 按平均成绩排序
qsort(students, n, sizeof(Student), cmp_ave_score);
printf("按平均成绩排序:\n");
print_student(students, n);
return 0;
}
```
该代码中,定义了一个`Student`结构体,用于存储学生的学号、姓名、四门功课成绩和平均成绩。`cmp_id()`和`cmp_ave_score()`函数分别用于按照学号和平均成绩排序。
在`main()`函数中,首先读入学生的信息,计算平均成绩,然后按照学号和平均成绩分别排序,并输出排序结果。
需要注意的是,该代码中使用了标准库函数`qsort()`进行排序。`qsort()`函数的第一个参数是待排序的数组,第二个参数是数组元素的个数,第三个参数是每个元素的大小,第四个参数是比较函数的指针。
阅读全文