方法一: 数组法
#include <stdio.h>
#include <stdlib.h>
struct Student{
long int num;
float score[3];
float aver;
};
struct Node{
struct Node *next;
};
int main(){
struct Student stu[1000];
struct Node *n,*p,*head=NULL;
int m;
printf("请输入学生总人数:");
scanf("%d",&m);
for(int i=0;i<m;i++)
{
n=(struct Node *)malloc(sizeof(struct Node));
printf("请输入第%d个学生的学号和三门课成绩:",i+1);
scanf("%ld %f %f %f",&stu[i].num,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
if(head==NULL)
{
stu[i].aver=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3;
head=n;
p=n;
}else{
stu[i].aver=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3;
p->next=n;
p=n;
}
}
int i,t=0;
for(i=0;i<m-1;i++)
if(stu[i+1].aver>stu[i].aver)
t=i+1;
printf("平均成绩最大的同学的信息为:\n");
printf("学号:%6ld\n",stu[t].num);
printf("三门课的成绩:%6.1f %6.1f %6.1f\n",stu[t].score[0],stu[t].score[1],stu[t].score[2]);
printf("平均成绩:%6.2f\n",stu[t].aver);
}
输出显示:
请输入学生总人数:5
请输入第1个学生的学号和三门课成绩:2019001 89 67 98
请输入第2个学生的学号和三门课成绩:2019002 67 78 59
请输入第3个学生的学号和三门课成绩:2019003 89 88 98
请输入第4个学生的学号和三门课成绩:2019004 67 76 86
请输入第5个学生的学号和三门课成绩:2019005 78 56 67
平均成绩最大的同学的信息为:
学号:2019003
三门课的成绩: 89.0 88.0 98.0
平均成绩: 91.67
方法二: 指针法
#include <stdio.h>
#include <stdlib.h>
void average(struct Student *p1,int k,struct Node *n,struct Node *head,struct Node *p);
int max(struct Student *p,int k);
void pus(struct Student *p,int t);
struct Student{
long int num;
float score[3];
float aver;
};
struct Node{
struct Node *next;
};
int main()
{
struct Student stu[1000];
struct Student *p1=stu;
struct Node *n,*p,*head=NULL;
int m;
printf("请输入学生总人数:");
scanf("%d",&m);
average(p1,m,n,head,p);
pus(p1,max(p1,m));
}
void average(struct Student *p1,int k,struct Node *n,struct Node *head,struct Node *p)
{
for(int i=0;i<k;i++)
{
n=(struct Node *)malloc(sizeof(struct Node));
printf("请输入第%d个学生的学号和三门课成绩:",i+1);
scanf("%ld %f %f %f",&(*(p1+i)).num,&(*(p1+i)).score[0],&(*(p1+i)).score[1],&(*(p1+i)).score[2]);
if(head==NULL)
{
(*(p1+i)).aver=((*(p1+i)).score[0]+(*(p1+i)).score[1]+(*(p1+i)).score[2])/3;
head=n;
p=n;
}else{
(*(p1+i)).aver=((*(p1+i)).score[0]+(*(p1+i)).score[1]+(*(p1+i)).score[2])/3;
p->next=n;
p=n;
}
}
}
int max(struct Student *p,int k)
{
int i;int t=0;
for(i=0;i<k-1;i++)
if((*(p+i+1)).aver>(*(p+i)).aver)
t=1+i;
return t;
}
void pus(struct Student *p,int t)
{
printf("平均成绩最大的同学的信息为:\n");
printf("学号:%6ld\n",(*(p+t)).num);
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);
}
输出显示:
请输入学生总人数:3
请输入第1个学生的学号和三门课成绩:123 34 45 67
请输入第2个学生的学号和三门课成绩:233 45 67 97
请输入第3个学生的学号和三门课成绩:323 46 78 99
平均成绩最大的同学的信息为:
学号: 323
三门课的成绩: 46.0 78.0 99.0
平均成绩: 74.33
方法二(优化版)
因为向average函数传参的参数太多,容易混淆,所以进行改进
直接将定义在main函数中的变量定义在average函数中直接使用,无需传参,更加方便
#include <stdio.h>
#include <stdlib.h>
void average(struct Student *p1,int k);
int max(struct Student *p,int k);
void pus(struct Student *p,int t);
struct Student{
long int num;
float score[3];
float aver;
};
struct Node{
struct Node *next;
};
int main()
{
struct Student stu[1000];
struct Student *p1=stu;
struct Node *n,*p,*head=NULL;
int m;
printf("请输入学生总人数:");
scanf("%d",&m);
average(p1,m);
pus(p1,max(p1,m));
}
void average(struct Student *p1,int k)
{
struct Node *n,*p,*head=NULL;
for(int i=0;i<k;i++)
{
n=(struct Node *)malloc(sizeof(struct Node));
printf("请输入第%d个学生的学号和三门课成绩:",i+1);
scanf("%ld %f %f %f",&(*(p1+i)).num,&(*(p1+i)).score[0],&(*(p1+i)).score[1],&(*(p1+i)).score[2]);
if(head==NULL)
{
(*(p1+i)).aver=((*(p1+i)).score[0]+(*(p1+i)).score[1]+(*(p1+i)).score[2])/3;
head=n;
p=n;
}else{
(*(p1+i)).aver=((*(p1+i)).score[0]+(*(p1+i)).score[1]+(*(p1+i)).score[2])/3;
p->next=n;
p=n;
}
}
}
int max(struct Student *p,int k)
{
int i;int t=0;
for(i=0;i<k-1;i++)
if((*(p+i+1)).aver>(*(p+i)).aver)
t=1+i;
return t;
}
void pus(struct Student *p,int t)
{
printf("平均成绩最大的同学的信息为:\n");
printf("学号:%6ld\n",(*(p+t)).num);
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);
}
输出显示:
请输入学生总人数:2
请输入第1个学生的学号和三门课成绩:2019000 68 98.3 89.4
请输入第2个学生的学号和三门课成绩:2019111 98 45.6 56.7
平均成绩最大的同学的信息为:
学号:2019000
三门课的成绩: 68.0 98.3 89.4
平均成绩: 85.23