请大神帮忙看一下:某班有20名同学,每名同学数据包括学号、姓名、3门课的成绩,从键盘上输入20名学生数据

要输出三门平均成绩和最高分色学生数据,结果只能算出第一科总平均分,求高手指点一下,谢谢哈!!
编程如下:#include "stdio.h"
#include "math.h"
#define N 2
struct student
{unsigned long num;
char name[20];
int s0;
int s1;
int s2;
};
double *avr(struct student *p)
{double s[3];
int sum1=0,sum2=0,sum3=0,i;
struct student *b;
b=p;
for(;p<b+N;p++)
{sum1=sum1+p->s0;sum2=sum2+p->s1;sum3=sum3+p->s2;}
s[0]=(double)sum1/N;s[1]=(double)sum2/N;s[2]=(double)sum3/N;
return &s[0];
}
void com(struct student *p)
{int sum=0,max;
double e;
struct student *m,*b;
b=p;
max=p->s0+p->s1+p->s2;
for(;p<b+N;p++)
{sum=sum+p->s0+p->s1+p->s2;
if(sum>max)
{max=sum;
e=max/3.0;
m=p;}
sum=0;
}
printf("%ld %s %d %d %d %lf\n",m->num,m->name,m->s0,m->s1,m->s2,e);
}
main()
{struct student a[N];
int i;
double *x;
for(i=0;i<N;i++)
scanf("%ld,%s%d,%d,%d",&a[i].num,a[i].name,&a[i].s0,&a[i].s1,&a[i].s2);
x=avr(a);
for(i=0;i<3;i++)
{printf("s%d %lf\n",i,*x++);}
com(a);
}
不知道是不是返回指针的函数有错误,麻烦帮找一下,感激不尽~~不好意思参数什么的没有说明清楚,s0、s1、s2代表三个科目,函数avr是求平均值,com是找最高分,这样应该比较清楚了。。

第1个回答  推荐于2021-02-04
#include "stdio.h"
#include "math.h"
#define N 20 ////////2改为20
struct student
{unsigned long num;
char name[20];
int s0;
int s1;
int s2;
};
double *avr(struct student *p)
{double s[3];
int sum1=0,sum2=0,sum3=0,i;
struct student *b;
b=p;
for(;p<b+N;p++)
{sum1=sum1+p->s0;sum2=sum2+p->s1;sum3=sum3+p->s2;}
s[0]=(double)sum1/N;s[1]=(double)sum2/N;s[2]=(double)sum3/N;
return &s[0];
}
void com(struct student *p)
{int sum=0,max;
double e;
struct student *m,*b;
b=p;
max=p->s0+p->s1+p->s2;
for(;p<b+N;p++)
{sum=sum+p->s0+p->s1+p->s2;
if(sum>max)
{max=sum;
e=max/3.0;
m=p;}
sum=0;
}
printf("%ld %s %d %d %d %lf\n",m->num,m->name,m->s0,m->s1,m->s2,e);
}
main()
{
struct student a[N];
int i;
double *x;
for(i=0;i<N;i++)
scanf("%ld%s%d%d%d",&a[i].num,&a[i].name,&a[i].s0,&a[i].s1,&a[i].s2); //这一行按我的写,注意输入格式
x=avr(a);
for(i=0;i<3;i++)
{printf("s%d %lf\n",i,*x++);}
com(a);
}追问

呃,定义N=2是为了输入数据不用输那么多,呵呵。。。。。。。。

追答

你可以试一试,注意一下输入格式:
1 zhang 12 32 43
2 li 32 43 45

追问

我试过很多次喽,但是每次得到的s1、s2都是0,让我情何以堪~~

追答

#include "stdio.h"
#include "math.h"
double s[3]={0}; //数组移到此处
#define N 2 ////////2改为20
struct student
{unsigned long num;
char name[20];
int s0;
int s1;
int s2;
};
double *avr(struct student *p)
{
int sum1=0,sum2=0,sum3=0,i;
struct student *b;
b=p;
for(i=0;is0;sum2=sum2+p->s1;sum3=sum3+p->s2;}
s[0]=(double)sum1/N;s[1]=(double)sum2/N;s[2]=(double)sum3/N;
return s; //修改
}

追问

定义全局变量的话主函数的输出就可以改成
for(i=0;i<3;i++)
{printf("s%d %lf\n",i,s[i]);}
其实我是想知道为何我原来那个程序s1、s2平均值算不出来,另外你修改的那个输入方式数字间用tab间隔,字符串和它后面的数字用enter分开吧,呵呵谢谢啦~~

追答

我不知道很明了的就算出来的方法你为什么总是搞得那么复杂。指针是不推荐使用的,能不用就不用。
反正我是不会那样写代码的,也没有遇到过这种情况。

所以不好意思我也不知道。。

本回答被提问者采纳
第2个回答  2012-03-05
太难了。追问

谢谢你帮看,呵呵就是返回的那个地址不知道有什么问题,唉~~

追答

以我的程度是没办法了= =。
建议找求助团队。

追问

嗯,还是得谢谢你,呵呵~~

追答

不客气~