假设学生的基本信息包括学号、姓名、三门课程成绩以及个人平均成绩,定义一个能够表示学生信息的结构类型。输入n(n<50)个学生的成绩信息,按照学生的个人平均分从高到低输出他们的信息。
注意: 1)平均分出现相同的分数时按学号从小到大进行排序输出。 2)平均分以四舍五入取整数保存。
输入格式: 输入一个正整数n(n<50),下面n行输入n个学生的信息,包括:学号、姓名、三门课程成绩(整数)。
输出格式: 输出从高到低排序后的学生信息,包括:学号、姓名、三门课程成绩、平均分(整数)
4
101 Zhang 78 87 85
102 Wang 91 88 90
104 chen 86 90 75
103 Li 75 90 86
102 Wang 91 88 90 90
103 Li 75 90 86 84
104 chen 86 90 75 84
101 Zhang 78 87 85 83
我的做法:
结构体版:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
typedef struct student {
int id;
char name[20];
int score1;
int score2;
int score3;
int average;
} Student;
// 以平均分和学号为关键字进行比较,返回值为比较结果
int cmp(const void* a, const void* b) {
const Student* s1 = (Student*)a;
const Student* s2 = (Student*)b;
if (s1->average != s2->average) {
return s2->average - s1->average;
}
else {
return s1->id - s2->id;
}
}
int main() {
int n;
scanf("%d", &n);
Student stu[n]; // 定义一个结构体数组
for (int i = 0; i < n; i++) {
// 输入学生信息并计算平均分
scanf("%d %s %d %d %d", &stu[i].id, stu[i].name, &stu[i].score1, &stu[i].score2, &stu[i].score3);
int sum = stu[i].score1 + stu[i].score2 + stu[i].score3;
stu[i].average = round(1.0 * sum / 3); // 平均分四舍五入取整数
}
qsort(stu, n, sizeof(Student), cmp); // 调用库函数快速排序
// 输出排过序的学生信息
for (int i = 0; i < n; i++) {
printf("%d %s %d %d %d %d\n", stu[i].id, stu[i].name, stu[i].score1, stu[i].score2, stu[i].score3, stu[i].average);
}
return 0;
}
不用结构体的版本:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int id[50];
char name[50][20];
int score1[50], score2[50], score3[50];
int average[50];
// 以平均分和学号为关键字进行比较,返回值为比较结果
int cmp(const void* a, const void* b) {
const int i = *(int*)a;
const int j = *(int*)b;
if (average[i] != average[j]) {
return average[j] - average[i];
}
else {
return id[i] - id[j];
}
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
// 输入学生信息并计算平均分
scanf("%d %s %d %d %d", &id[i], name[i], &score1[i], &score2[i], &score3[i]);
int sum = score1[i] + score2[i] + score3[i];
average[i] = round(1.0 * sum / 3); // 平均分四舍五入取整数
}
int index[n]; // 定义一个索引数组
for (int i = 0; i < n; i++) {
index[i] = i; // 初始化索引数组
}
qsort(index, n, sizeof(int), cmp); // 调用库函数快速排序
// 输出排过序的学生信息
for (int i = 0; i < n; i++) {
printf("%d %s %d %d %d %d\n", id[index[i]], name[index[i]], score1[index[i]], score2[index[i]], score3[index[i]], average[index[i]]);
}
return 0;
}