运用c语言的结构体知识输入n个学生的姓名及其3门功课成绩(整数),要求根据3门功课的平均成绩从高分到低分输出每个学生的姓名、3门功课成绩及平均成绩,若平均分相同则按姓名的字典序输出。 输入格式: 测试数据有多组,处理到文件尾。每组测试数据首先输入一个正整数n(1<n<100),表示学生人数;然后是n行信息,分别表示学生的姓名(长度不超过10且由英文字母构成的字符串)和3门课成绩(正整数)。 输出格式: 对于每组测试,输出排序后的学生信息,每行一个学生信息:姓名、3门课成绩、平均成绩(保留2位小数)。每行数据之间留一个空格。
时间: 2024-02-29 13:51:04 浏览: 61
C语言结构体版学生成绩管理系统
好的,这是一个经典的排序问题,我可以帮你写一个 C 程序来解决这个问题。代码如下:
```c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct student {
char name[11];
int score[3];
double average;
};
int cmp(const void* a, const void* b) {
struct student* s1 = (struct student*)a;
struct student* s2 = (struct student*)b;
if (s1->average != s2->average) {
return s2->average - s1->average > 0 ? 1 : -1;
} else {
return strcmp(s1->name, s2->name);
}
}
int main() {
int n;
while (scanf("%d", &n) != EOF) {
struct student students[n];
for (int i = 0; i < n; i++) {
scanf("%s", students[i].name);
for (int j = 0; j < 3; j++) {
scanf("%d", &students[i].score[j]);
}
students[i].average = (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", students[i].name);
for (int j = 0; j < 3; j++) {
printf(" %d", students[i].score[j]);
}
printf(" %.2f\n", students[i].average);
}
}
return 0;
}
```
程序中使用了一个结构体 `student` 来存储每个学生的信息,包括姓名、三门课成绩和平均成绩。然后使用 `qsort` 函数按照题目要求的方式排序,最后输出排序后的结果即可。
注意,程序中使用了 `printf(" %.2f\n", students[i].average);` 来输出保留两位小数的平均成绩,这是 C 语言中的格式化输出方式,可以在输出时指定输出格式,其中 `%.2f` 表示输出一个浮点数,保留两位小数。同时,由于每个学生姓名最长为 10 个字符,因此我们在结构体中使用了 `char name[11]` 来存储姓名,以保证足够的空间。
阅读全文