Bootstrap

有n个结构体变量,内含学生学号、姓名和3门课程的成绩。要求输出平均成绩最高的学生的信息(包括学号、姓名、3门课程成绩和平均成绩)。

题目要求:
有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
;