题目描述
山治同学所在的班级共有 N名同学,期末考试时进行了数学、语文、英语、地理四门功课的 测试。现要将班里总分最高的同学评为“学习小状元”。
如 3 名学生,4 门课程的成绩如下:
数学 语文 英语 地理
hong 98 90 87 74
Ming 96 92 85 97
zhang 95 78 56 91
请同学们帮助计算:
每位同学的总分是多少?
找出总分最高的那位同学。
找出所有成绩中最高的分数和最小的分数。
输入
输入共有 2N+1 行: 第一行:有一个整数 N,表示有N 名同学(已知 1≤N≤30)。 后 2N行,
每两行代表一个人的信息记录:包括学生的姓名及 4 门功课的分数:其中分数为 数,每个分数互不相同(不需判断),各数据之间空 1 个格。
输出
输出共有 N+2 行:前 N 行:每行一个数据是每位同学的总分;
第 N+1 行:是总分最高的那位同学的姓名
第 N+2 行:是所有成绩中最高的分数和最小的分数(数据之间空1格)。
样例输入1
3
hong
98 90 87 74
ming
96 92 85 97
zhang
95 78 56 91
样例输出1
349
370
320
ming
98 56
代码
#include <stdio.h>
#include <stdlib.h>
struct stu {
char name[10];
int score[4];
int sum;
};
int main () {
int n;
scanf("%d", &n);
struct stu* student;
// 动态分配结构体数组空间
student = (struct stu*) calloc(n, sizeof(struct stu));
for (int i = 0; i < n; i++) {
scanf("%s\n%d%d%d%d",
student[i].name,
&student[i].score[0],
&student[i].score[1],
&student[i].score[2],
&student[i].score[3]);
for (int j = 0; j < 4; j++) {
student[i].sum += student[i].score[j];
}
}
// 选择排序法,对结构体数组进行排序
int maxScore, minScore;
maxScore = minScore = student[0].score[0];
for (int i = 0; i < n; i++) {
// 每位同学的总分
printf("%d\n", student[i].sum);
for (int j = 0; j < 4; j++) {
if (maxScore < student[i].score[j]) maxScore = student[i].score[j];
if (minScore > student[i].score[j]) minScore = student[i].score[j];
}
}
// 排序
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (student[i].sum > student[j].sum) {
struct stu t;
t = student[i];
student[i] = student[j];
student[j] = t;
}
}
}
// 总分最高的同学姓名
printf("%s\n", student[n - 1].name);
printf("%d %d", maxScore, minScore);
free(student); // 释放内存
return 0;
}