题目要求:
有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,最后在赋值求值{022,"Lucy",{79.5,81.5,69},0},{011,"Killy",{86.5,93.5,96},0},{088,"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);}结果显示:学号:011姓名: 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 3void 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个学生的信息:学号、姓名、三门课成绩: 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,最后在赋值求值{022,"Lucy",{79.5,81.5,69},0},{011,"Killy",{86.5,93.5,96},0},{088,"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);}输出显示;学号:011姓名: 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,最后在赋值求值{022,"Lucy",{79.5,81.5,69},0},{011,"Killy",{86.5,93.5,96},0},{088,"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);}输出显示:学号:011姓名: Killy三门课的成绩: 86.5 93.5 96.0平均成绩: 92.00
有n个结构体变量 内含学生学号 姓名和3门课程的成绩。要求输出平均成绩最高的学生的信息(包括学号 姓名 3门课程成绩和平均成绩)。