Lab 3-1 结构体定义、地址传参和最大最小
学生期末成绩的信息包括Name和 Chinese, Math, English, Physics, Chemistry五个科目的成绩。试定义一个结构体管理学生成绩,打印输出所有学生中总成绩的最高分和最低分,以及各单科成绩的最高分和最低分,要求如下:
1.在main函数中定义(自定义类型)数组,要求只能使用一个数组;
2.通过传地址方式调用函数,从键盘输入学生信息或随机产生信息;
3.修改课件上三种方法对应的minMax函数,以传值方式传入科目信息,使之能够正确计算各个单科成绩的最低和最高成绩;
4.输出格式, 其中蓝色部分作为可选输出学生姓名:
Chinese: max: 98 Zhangsan min: 63 Wangwu
Math: max: 100 Lisi min: 65 Dalin
English: max: 99 Liuda min: 90 Fengda
physics: max: 99 Liuda min: 90 Liuda
Chemistry: max: 99 Liuda min: 90 Liuda
Total: max: 99 Liuda min: 90 Liuda
#include <stdio.h>
typedef struct _student
{
char name[20];
int score[5];
}student;
int createStu(student *stu)
{
printf("请输入学生人数:");
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("请输入第%d个学生的姓名,语文、数学、英语、物理和化学成绩:\n",i+1);
scanf("%s%d%d%d%d%d",stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2],&stu[i].score[3],&stu[i].score[4]);
}
return n;
}
void minMax(student *stu,int n,int scoreIdx,int *min,int *minIdx,int *max,int *maxIdx)
{
if(scoreIdx == -1)
{
for(int i=0;i<n;i++)
{
int total = stu[i].score[0]+stu[i].score[1]+stu[i].score[2]+stu[i].score[3]+stu[i].score[4];
if(i==0)
{
*min = *max = total;
*minIdx = *maxIdx = 0;
}
else
{
if(*min > total)
{
*min = total;
*minIdx = i;
}
if(*max < total)
{
*max = total;
*maxIdx = i;
}
}
}
}
else
{
for(int i=0;i<n;i++)
{
if(i==0)
{
*min = *max = stu[i].score[scoreIdx];
*minIdx = *maxIdx = 0;
}
else
{
if(*min > stu[i].score[scoreIdx])
{
*min = stu[i].score[scoreIdx];
*minIdx = i;
}
if(*max < stu[i].score[scoreIdx])
{
*max = stu[i].score[scoreIdx];
*maxIdx = i;
}
}
}
}
}
int main()
{
char * s[5] = {"Chinese", "Math", "English", "Physics", "Chemistry"};
student stu[100];
int n = createStu(stu);
int min,max,minIdx,maxIdx;
for(int i=0;i<5;i++)
{
minMax(stu,n,i,&min,&minIdx,&max,&maxIdx);
printf("%s: max: %d %s min: %d %s\n",s[i],max,stu[maxIdx].name,min,stu[minIdx].name);
}
minMax(stu,n,-1,&min,&minIdx,&max,&maxIdx);
printf("Total: max: %d %s min: %d %s\n",max,stu[maxIdx].name,min,stu[minIdx].name);
return 0;
}