输入n个学生的姓名及其3门功课成绩(整数),要求根据3门功课的平均成绩从高分到低分输出每个学生的姓名、3门功课成绩及平均成绩,若平均分相同则按姓名的字典序输出。 输入格式: 测试数据有多组,处理到文件尾。每组测试数据首先输入一个正整数n(1<n<100),表示学生人数;然后是n行信息,分别表示学生的姓名(长度不超过10且由英文字母构成的字符串)和3门课成绩(正整数)。 输出格式: 对于每组测试,输出排序后的学生信息,每行一个学生信息:姓名、3门课成绩、平均成绩(保留2位小数)。每行数据之间留一个空格。用c语言
时间: 2024-03-07 21:48:12 浏览: 153
以下是示例C语言代码,实现了你的要求:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Student {
char name[11];
int score[3];
double avg_score;
} Student;
int cmp(const void *a, const void *b) {
Student *s1 = (Student *)a;
Student *s2 = (Student *)b;
if (s1->avg_score != s2->avg_score) {
return s2->avg_score > s1->avg_score ? 1 : -1;
} else {
return strcmp(s1->name, s2->name);
}
}
int main() {
int n;
while (scanf("%d", &n) != EOF) {
Student *students = (Student *)malloc(n * sizeof(Student));
for (int i = 0; i < n; i++) {
scanf("%s%d%d%d", students[i].name, &students[i].score[0], &students[i].score[1], &students[i].score[2]);
students[i].avg_score = (students[i].score[0] + students[i].score[1] + students[i].score[2]) / 3.0;
}
qsort(students, n, sizeof(Student), cmp);
for (int i = 0; i < n; i++) {
printf("%s %d %d %d %.2lf\n", students[i].name, students[i].score[0], students[i].score[1], students[i].score[2], students[i].avg_score);
}
free(students);
}
return 0;
}
```
解释一下代码的实现:
首先定义了一个 `Student` 结构体,包含学生的姓名、三门成绩和平均成绩。
定义了一个 `cmp` 函数作为比较函数,用于 `qsort` 函数排序。排序规则为:先按平均成绩从高到低排序,如果平均成绩相同则按姓名的字典序排序。
在 `main` 函数中,首先读入学生人数 `n`,然后动态分配 `n` 个 `Student` 结构体的空间。接下来依次读入每个学生的信息,计算平均成绩。最后使用 `qsort` 函数按照上面定义的比较函数对学生数组进行排序。
最后依次输出排序后的学生信息,其中平均成绩保留两位小数。注意,每行数据之间要留一个空格。
阅读全文