题目要求:
有n个结构体变量,内含学生学号、姓名和3门课程的成绩。要求输出平均成绩最高的学生的信息(包括学号、姓名、3门课程成绩和平均成绩)。
解题思路:
将n个学生的数据表示为结构体数组。按照功能函数化的思想,分别用3个函数来实现不同的功能:
/* Note:Your choice is C IDE */
#include "stdio.h"
void average(struct Student *p,int n);
void max(struct Student *p,int n);
void pus(struct Student *p);
struct Student{
long int num;
char name[15];
float score[3];//存放三门课程的成绩
float aver;//三门课程的平均成绩
};
int main()
{
int n=3;
struct Student stu[]={
//平均成绩先设为0,最后在赋值求值
{2019022,"Lucy",{79.5,81.5,69},0},
{2019011,"Killy",{86.5,93.5,96},0},
{2019088,"Noddy",{94.5,96.5,70.3},0}
};
struct Student *p=stu;
average(p,n);
max(p,n);
pus(p);
return 0;
}
void average(struct Student *p,int n)//定义一个求平均值的函数
{
int i,j;
for(i=0;i<n;i++){
float sum=0;
for(j=0;j<3;j++){
sum+=(*(p+i)).score[j];//求出三门成绩的总和
//sum+=p[i].score[j];
//sum+=(p+i)->score[j];
}
(*(p+i)).aver=sum/3;
//p[i].aver=sum/3;
//(p+i)->aver=sum/3;
}
}
void max(struct Student *p,int n)//定义一个求最大值的函数
{
int i;
for(i=1;i<n;i++)
if(p[i].aver>p[0].aver)
p[0]=p[i];//此时p【0】的地址就会缺失,所以不妥
}
void pus(struct Student *p)//定义一个输出的函数
{
printf("学号:%6ld\n姓名: %8s\n",p[0].num,p[0].name);
printf("三门课的成绩:%6.1f %6.1f %6.1f\n",p[0].score[0],p[0].score[1],p[0].score[2]);
printf("平均成绩:%6.2f\n",p[0].aver);
}
结果显示:
学号:2019011
姓名: Killy
三门课的成绩: 86.5 93.5 96.0
平均成绩: 92.00
对于上面的代码,看一下需要注意的地方
这时是for循环中的 条件发生了改变
指针带下表是需要条件的
条件就是指针指向数组的指针不发生变化
指向的首地址不变
但是下面的代码中p指向的首地址发生了改变,所以就不能用指针带下标的方法了
void average1(struct Student *p,int n)
{
int i;
for(i=0;i<n;i++,p++)
{
int sum=0;
for(j=0;j<3;j++)
{
sum+=(*p).score[j];
//sum+=p[i].score[j] 错误
//sum+=p->socre[j]; 正确
}
(*p).ave=sum/3;
//p[i].ave=sum/3 错误
//p->ave=sum/3;
}
}
方法二
#include <stdio.h>
#define N 3
void input(struct Student stu[]);
struct Student max(struct Student stu[]);
void print(struct Student stud);
struct Student
{ int num;
char name[20];
float score[3];
float aver;
};
int main()
{
struct Student stu[N],*p=stu;
input(p);
print(max(p));
return 0;
}
void input(struct Student stu[])
{ int i=0;
for(i=0;i<N;i++)
{
printf("请输入第%d个学生的信息:学号、姓名、三门课成绩:\n",i+1);
scanf("%d %s %f %f %f",
&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
stu[i].aver=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;
}
}
struct Student max(struct Student stu[])
//struct Student max( )是一个函数,函数名叫max,返回值类型是struct Student型数据
//实参struct Student stu[]是一个struct Student型地址,形参名stu
{int i,m=0;
for(i=0;i<N;i++)
if (stu[i].aver>stu[m].aver) m=i;
return stu[m];
}
void print(struct Student stud)
{ printf("\n成绩最高的学生是:\n");
printf("学号:%d\n姓名:%s\n三门课成绩:%5.1f,%5.1f,%5.1f\n平均成绩:%6.2f\n",
stud.num,stud.name,stud.score[0],stud.score[1],stud.score[2],stud.aver);
}
结果显示:
请输入第1个学生的信息:学号、姓名、三门课成绩:
2019 dwj 33 66 99
请输入第2个学生的信息:学号、姓名、三门课成绩:
2910 dkg 69 96 99
请输入第3个学生的信息:学号、姓名、三门课成绩:
9210 dcm 99 96 93
成绩最高的学生是:
学号:9210
姓名:dcm
三门课成绩: 99.0, 96.0, 93.0
平均成绩: 96.00
方法三
/* Note:Your choice is C IDE */
#include "stdio.h"
void average(struct Student stu[],int n);
struct Student maxs(struct Student stu[],int n,struct Student max);
void pus(struct Student max);
struct Student{
long int num;
char name[15];
float score[3];//存放三门课程的成绩
float aver;//三门课程的平均成绩
};
int main()
{
int n=3;
struct Student stu[]={
//平均成绩先设为0,最后在赋值求值
{2019022,"Lucy",{79.5,81.5,69},0},
{2019011,"Killy",{86.5,93.5,96},0},
{2019088,"Noddy",{94.5,96.5,70.3},0}
};
struct Student *p=stu;
struct Student max=stu[0];
average(p,n);
pus(maxs(p,n,max));
return 0;
}
void average(struct Student stu[],int n)//定义一个求平均值的函数
{
int i,j;
for(i=0;i<n;i++){
float sum=0;
for(j=0;j<3;j++){
sum+=stu[i].score[j];//求出三门成绩的总和
}
stu[i].aver=sum/3;
}
}
struct Student maxs(struct Student stu[],int n,struct Student max)
{
int i;
for(i=1;i<n;i++)
if(stu[i].aver>max.aver)
max=stu[i];
return max;
}
void pus(struct Student max)
{
printf("学号:%6ld\n姓名: %8s\n",max.num,max.name);
printf("三门课的成绩:%6.1f %6.1f %6.1f\n",max.score[0],max.score[1],max.score[2]);
printf("平均成绩:%6.2f\n",max.aver);
}
输出显示;
学号:2019011
姓名: Killy
三门课的成绩: 86.5 93.5 96.0
平均成绩: 92.00
方法四:返回下标进行引用
/* Note:Your choice is C IDE */
#include "stdio.h"
void average(struct Student *p,int n);
int max(struct Student *p,int n);
void pus(struct Student *p,int t);
struct Student{
long int num;
char name[15];
float score[3];//存放三门课程的成绩
float aver;//三门课程的平均成绩
};
int main()
{
int n=3;
struct Student stu[]={
//平均成绩先设为0,最后在赋值求值
{2019022,"Lucy",{79.5,81.5,69},0},
{2019011,"Killy",{86.5,93.5,96},0},
{2019088,"Noddy",{94.5,96.5,70.3},0}
};
struct Student *p=stu;
average(p,n);
pus(p,max(p,n));
return 0;
}
void average(struct Student *p,int n)//定义一个求平均值的函数
{
int i,j;
for(i=0;i<n;i++){
float sum=0;
for(j=0;j<3;j++){
sum+=(*(p+i)).score[j];//求出三门成绩的总和
//sum+=p[i].score[j];
//sum+=(p+i)->score[j];
}
(*(p+i)).aver=sum/3;
//p[i].aver=sum/3;
//(p+i)->aver=sum/3;
}
}
int max(struct Student *p,int n)//定义一个求最大值的函数
{
int i,t=0;
for(i=0;i<n-1;i++)
if(p[i+1].aver>p[i].aver)
t=i+1;
return t;
}
void pus(struct Student *p,int t)//定义一个输出的函数
{
printf("学号:%6ld\n姓名: %8s\n",p[t].num,p[t].name);
printf("三门课的成绩:%6.1f %6.1f %6.1f\n",p[t].score[0],p[t].score[1],p[t].score[2]);
printf("平均成绩:%6.2f\n",p[t].aver);
}
输出显示:
学号:2019011
姓名: Killy
三门课的成绩: 86.5 93.5 96.0
平均成绩: 92.00