#include <stdio.h> #include <stdlib.h> struct student//定义结构体 { int score;//分数 char *name;//姓名 }; struct student* initstuscores(int len)//定义一个结构体指针函数 { int i;//定义整型i struct student *p =(struct student * )malloc(len * sizeof(struct student));//定义指针变量 开辟学生个数的结构体空间 for (i=0;i<len;i++) { printf("请输入名字:\n");//输出 p->name=(char *)malloc(128);//调用指针p结构体里的name,并开辟128个字符串指针空间 scanf("%s",(p->name));//输入学生姓名,不加&是因为是字符串指针 printf("请输入分数:\n");//输出 scanf("%d",&(p->score));//输入分数 p++;//指针偏移一个结构体的大小,循环到一下个同学再输入姓名分数 } return p-len;//把指针返回给main里的调用函数 } void printmes(struct student *p,int len)//定义一个输出函数 { int i; for(i=0;i<len;i++) { printf("名字:%s,分数:%d\n",p->name,p->score);//遍历输出学生姓名分数 p++;//地址偏移,为了遍历下一个学生成绩姓名分数 } } struct student*findmaxstu(struct student *p,int len)//定义最大值指针函数 { struct student *max;//定义指针max max =p;//将地址p中的值给max int i; for(i=0;i<len;i++) { if(max->score < p->score)//如果最大值的分数小于p中的分数 { max=p;//将p中的值给max } p++;//指针偏移,这是局部变量中的指针,无碍大局 } return max;//将最大值返回给max } struct student* findminstu(struct student *p,int len)//同最大值 { int i; struct student *min; min =p; for(i=0;i<len;i++) { if(min->score > p->score) { min=p; } p++; } return min; } float getaverage(struct student *p,int len)//定义浮点型变量平均值,定义结构体类指针,整形len { int i; int total=0; for(i=0;i<len;i++) { total +=p->score;//使其分数全部相加 p++; } return (float)total/len;//总和除以总人数 } int main() { int len=0;//初始化总人数为0 printf("请输入总人数:\n");//输出 scanf("%d",&len);//输入计算的总人数 struct student *min = NULL;//调用最小值结构体函数指针并初始化为空 struct student *max = NULL;//调用最大值结构体函数指针并初始化为空 struct student *pstus = initstuscores(len);//调用初始化函数 printmes(pstus,len);//调用输出函数 min=findminstu(pstus,len);//调用最小值函数,传参给min max=findmaxstu(pstus,len);//调用最大值函数,传参给max printf("min:%s,%d\n max:%s,%d\n average=%f\n",min->name,min->score,max->name,max->score,getaverage(pstus,len));//输出名字,最大的值,最小的姓名,最小的值 system("pause"); return 0; }