题目描述
有N名学生,每个学生的数据包括学号、姓名、数学成绩、语文成绩,从键盘输入N名学生的数据,并计算出每个学生的平均成绩,最后显示最高平均分的学生的信息,包括学号,姓名,两门课的成绩,平均分数(保留小数点后一位)。需要完成两个函数;
函数接口定义:
void InputData(STU *p,int num);
STU *FindMaxIndex(STU *p,int num);
裁判测试程序样例:
在这里给出函数被调用进行测试的例子。例如:
#include <stdio.h>
#define N 5
typedef struct
{
int id;
char name[20];
int math;
int chinese;
double aver;
}STU;
void InputData(STU *p,int num);
STU *FindMaxIndex(STU *p,int num);
int main(void)
{
STU classone[N];
STU *pmax;
InputData(classone,N);
pmax=FindMaxIndex(classone,N);
printf("maxinfo:%d %s %d %d %.1f\n",pmax->id,pmax->name,pmax->math,pmax->chinese,pmax->aver);
return 0;
}
/* 请在这里填写答案 */
输入样例:
2 张 78 34
1 李 67 89
4 王 90 67
3 刘 85 95
5 赵 56 89
输出样例:
maxinfo:3 刘 85 95 90.0
参考答案
// 输入学生信息的函数
void InputData(STU *p, int num) {
// 遍历每个学生
for (int i = 0; i < num; i++) {
// 输入:学号、姓名、数学成绩、语文成绩
// 注意:p[i] 表示第 i 个学生,p 是指针,p[i] 就是结构体
scanf("%d %s %d %d", &p[i].id, p[i].name, &p[i].math, &p[i].chinese);
// 计算平均分,注意除以 2.0(浮点数),避免整型除法丢失小数
p[i].aver = (p[i].math + p[i].chinese) / 2.0;
}
}
// 找到平均分最高的学生,并返回指向该学生的指针
STU *FindMaxIndex(STU *p, int num) {
int max_index = 0; // 假设第一个学生是最高分的
// 从第二个学生开始遍历
for (int i = 1; i < num; i++) {
// 如果当前学生的平均分比当前记录的最高分还高
if (p[i].aver > p[max_index].aver) {
max_index = i; // 更新最高分学生的位置
}
}
// 返回指向平均分最高学生的指针
return &p[max_index];
}