c语言实现例9.2:设一个班级有30个人,填写如下的登记表,除姓名、学号外,还有三科成绩,编程实现对表格的计算,求出班级学生的单科平均分,求解出每个人的三科总成绩,并按总成绩由高分到低分输出。 问题分解: 、输入学生基本信息:结构体类型数组元素 实现总分、平均分的计算。按学生的总分排序。·按要求输出。
时间: 2024-03-20 16:38:36 浏览: 102
好的,请看下面的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生信息结构体
struct student {
char name[20]; // 学生姓名
char id[10]; // 学生学号
float score[3]; // 学生三科成绩
float total_score; // 学生总分
float avg_score; // 学生平均分
};
// 比较函数,用于快速排序
int cmp(const void *a, const void *b) {
struct student *s1 = (struct student *)a;
struct student *s2 = (struct student *)b;
return (int)(s2->total_score - s1->total_score);
}
int main() {
int i, j;
struct student stu[30]; // 定义结构体类型的数组,存储学生信息
// 输入学生信息
for (i = 0; i < 30; i++) {
printf("请输入第%d个学生的姓名:", i + 1);
scanf("%s", stu[i].name);
printf("请输入第%d个学生的学号:", i + 1);
scanf("%s", stu[i].id);
printf("请输入第%d个学生的三科成绩:", i + 1);
scanf("%f%f%f", &stu[i].score[0], &stu[i].score[1], &stu[i].score[2]);
// 计算学生的总分和平均分
stu[i].total_score = stu[i].score[0] + stu[i].score[1] + stu[i].score[2];
stu[i].avg_score = stu[i].total_score / 3.0;
}
// 按照学生的总分从高到低排序
qsort(stu, 30, sizeof(struct student), cmp);
// 输出学生信息
printf("按总分排序如下:\n");
printf("姓名\t学号\t成绩1\t成绩2\t成绩3\t总分\t平均分\n");
for (i = 0; i < 30; i++) {
printf("%s\t%s\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n", stu[i].name, stu[i].id,
stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].total_score, stu[i].avg_score);
}
return 0;
}
```
这段代码中,我们首先定义了一个名为 `student` 的结构体类型,包含了学生的姓名、学号、三科成绩以及总分和平均分等属性。然后,我们定义了一个长度为 30 的 `student` 类型的数组,用于存储 30 个学生的信息。
接下来,我们利用循环语句逐个输入每个学生的信息,并且计算每个学生的总分和平均分。最后,我们利用 `qsort` 函数对学生信息数组按照总分从高到低进行排序,并且输出每个学生的姓名、学号、三科成绩以及总分和平均分等信息。
需要注意的是,在 `qsort` 函数中,我们使用了一个自定义的比较函数 `cmp`,用于比较两个学生的总分大小。该函数中,我们首先将输入的两个参数强制转换为 `student` 类型的指针,然后比较它们的总分大小即可。
阅读全文