7-6 成绩排序 分数 10 作者 usx程序设计类课程组 单位 绍兴文理学院 输入n个学生的姓名及其3门功课成绩(整数),要求根据3门功课的平均成绩从高分到低分输出每个学生的姓名、3门功课成绩及平均成绩,若平均分相同则按姓名的字典序输出。 输入格式: 测试数据有多组,处理到文件尾。每组测试数据首先输入一个正整数n(1<n<100),表示学生人数;然后是n行信息,分别表示学生的姓名(长度不超过10且由英文字母构成的字符串)和3门课成绩(正整数)。 输出格式: 对于每组测试,输出排序后的学生信息,每行一个学生信息:姓名、3门课成绩、平均成绩(保留2位小数)。每行数据之间留一个空格。用C语言解答
时间: 2024-03-17 18:46:37 浏览: 100
PTA-公因数与公约数
5星 · 资源好评率100%
题目要求按照平均成绩从高到低输出,因此需要计算每个学生的平均成绩,并且按照平均成绩进行排序。同时,需要考虑平均成绩相同的情况下按照姓名的字典序进行排序。
可以使用结构体来存储每个学生的姓名和成绩信息,示例代码如下:
```c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_N 100
// 学生结构体
struct Student {
char name[11]; // 姓名
int score[3]; // 3门功课成绩
double avg; // 平均成绩
};
// 按照平均成绩从高到低排序
int cmp(const void *a, const void *b) {
struct Student *s1 = (struct Student *)a;
struct Student *s2 = (struct Student *)b;
if (s1->avg != s2->avg) {
return (s2->avg - s1->avg > 0) ? 1 : -1;
} else {
return strcmp(s1->name, s2->name);
}
}
int main() {
int n;
while (scanf("%d", &n) != EOF) {
struct Student students[MAX_N];
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 = (students[i].score[0] + students[i].score[1] + students[i].score[2]) / 3.0;
}
qsort(students, n, sizeof(struct 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);
}
printf("\n");
}
return 0;
}
```
代码中使用了 `qsort` 函数进行排序,排序函数是 `cmp`,实现了题目要求的排序规则。注意输出每个学生信息时需要保留两位小数,可以使用 `%.2lf` 进行输出。
阅读全文