输入n个学生的姓名及其3门功课成绩(整数),要求根据3门功课的平均成绩从高分到低分输出每个学生的姓名、3门功课成绩及平均成绩,若平均分相同则按姓名的字典序输出。 输入格式: 测试数据有多组,处理到文件尾。每组测试数据首先输入一个正整数n(1<n<100),表示学生人数;然后是n行信息,分别表示学生的姓名(长度不超过10且由英文字母构成的字符串)和3门课成绩(正整数)。 输出格式: 对于每组测试,输出排序后的学生信息,每行一个学生信息:姓名、3门课成绩、平均成绩(保留2位小数)。每行数据之间留一个空格。
时间: 2024-03-17 09:47:19 浏览: 52
下面是一个实现题目要求的示例代码:
```
#include <stdio.h>
#include <string.h>
struct Student {
char name[20];
int score[3];
double average;
};
void sortByAverage(struct Student *students, int n) {
int i, j;
int maxIndex;
for (i = 0; i < n - 1; i++) {
maxIndex = i;
for (j = i + 1; j < n; j++) {
if (students[j].average > students[maxIndex].average) {
maxIndex = j;
} else if (students[j].average == students[maxIndex].average &&
strcmp(students[j].name, students[maxIndex].name) < 0) {
maxIndex = j;
}
}
if (maxIndex != i) {
struct Student temp = students[i];
students[i] = students[maxIndex];
students[maxIndex] = temp;
}
}
}
int main() {
int n;
int i, j;
while (scanf("%d", &n) == 1) {
struct Student students[100];
for (i = 0; i < n; i++) {
scanf("%s", students[i].name);
for (j = 0; j < 3; j++) {
scanf("%d", &students[i].score[j]);
}
students[i].average = (double)(students[i].score[0] + students[i].score[1] + students[i].score[2]) / 3.0;
}
sortByAverage(students, n);
for (i = 0; i < n; i++) {
printf("%s", students[i].name);
for (j = 0; j < 3; j++) {
printf(" %d", students[i].score[j]);
}
printf(" %.2lf\n", students[i].average);
}
}
return 0;
}
```
这个程序使用结构体数组存储学生的信息,包括姓名、3门功课成绩和平均成绩。程序首先读入学生的信息,然后计算平均成绩。接着使用sortByAverage()函数按照平均成绩从高到低排序,如果平均成绩相同则按照姓名的字典序排序。最后输出排序后的学生信息。
阅读全文