C语言 函数问题

RT,实验报告上的一题我纠结了一天了
我是这样写的

sub1.c

#include <stdio.h>
int i,j,k,m,n,s,t,f=1,avg;
int a[5][5],b[5];
int e=1;
char c[5];
extern void sort(),average();
void main()
{ printf("输入选手姓名:");
for (k=0;k<5;k++)
scanf ("%s",&c[k]);
for (i=0;i<5;i++)
{
printf("输入第%d位选手的成绩,(用逗号隔开)",e);
scanf("%d,%d,%d,%d,%d",&a[0],&a[1],&a[2],&a[3],&a[4]);
e++;
}
average();
sort();
printf("Name Ref1 Ref2 Ref3 Ref4 Ref5 Average 排名\n");
for (i=0;i<5;i++,f++)
printf("%4c %4d %4d %4d %4d %4d %4d %4d\n",c,a[0],a[1],a[2],a[3],a[4],b,f);
}

sub2.c

extern void average()
{int b[5];
int i,j,k,m,n,s,t,avg;
extern int a[5][5];
for (i=0;i<5;i++)
{
for (m=0;m<4;m++)
for(j=0;j<4-m;j++)
if (a[j]>a[j+1])
{t=a[j];a[j]=a[j+1];a[j+1]=t;}
b=(a[1]+a[2]+a[3])/3;
}
}

sub3.c

extern void sort()
{int i,j;
int b[5];
char c[5];
int t=0;
char s=0;
for (j=0;j<4;j++)
for(i=0;i<4-j;i++)
if(b>b[i+1])
{
t=b;b=b[i+1];b[i+1]=t;
s=c;c=c[i+1];c[i+1]=s;
}
}

我运行的时候发现不管怎样,算出的平均值都是0,我觉得可能是sub1.c里算出的数组a[5][5]的值没有带进sub2.c,同样,sub2.c算出的数组b[5]也没有带进sub3.c里面
这该怎么改?还有再输入“选手姓名”的时候应该是输入字符串,但是我的方法太麻烦了,我现在还是用a,b,c,d代替书上的人名,不知道谁知道简单的方法,帮我改一下,
题目是这样的,参加我校大学生英语演讲比赛决赛阶段的同学有N位,决赛中共有M位评委,假设所有选手的成绩存放在一个二维数组中,根据平分规则计算每位选手的平均分,并按成绩的逆序打印(评分规则:去掉一个最高分和最低分对剩下的分数求平均值)假设N=4,M=5,要求有以下两个函数:A:求平均分的函数 B:排序函数(排序时注意分数和姓名的对应关系,名字可以使用拼音)
我是把主程序,平均值函数,排序函数分开写的,然后加在一个工程里面

用结构体比较方便易懂,我用结构体帮你做了一下,你可以看一看,可以运行的,我试过了。
#include<stdio.h>
#define N 4
#define M 5

struct student//建立学生数据结构体
{
char name[15];
float score[M];
float ave;
}stu[N];

void average(struct student stu[])//求平均成绩函数
{
int i,j,k;
float t;
for(i=0;i<N;i++)
{
for(j=1;j<M;j++)//冒泡排序将5个评委评分从低到高排列,然后取中间的评分求平均值。
for(k=0;k<M-j;k++)
if(stu[i].score[j]>stu[i].score[j+1])
{
t=stu[i].score[j];
stu[i].score[j]=stu[i].score[j+1];
stu[i].score[j+1]=t;
}
for(j=1;j<M-1;j++)//去掉最高和最低分后求平均分
{
stu[i].ave+=stu[i].score[j];
}
stu[i].ave/=M-2;
}
}

void sort(struct student stu[])//排序函数
{
int i,j;
struct student temp;
for(i=1;i<N;i++)//冒泡排序法
for(j=0;j<N-i;j++)
if(stu[j].ave>stu[j+1].ave)
{
temp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=temp;
}
}

main()
{
int i,j;
for(i=0;i<N;i++)//输入学生数据
{
printf("请输入第%d个学生的姓名:",i+1);
scanf("%s",stu[i].name);
for(j=0;j<M;j++)
{
printf("请输入该生第%d个评委的评分:",j+1);
scanf("%f",&stu[i].score[j]);
}
}
average(stu);//执行函数
sort(stu);
printf("\n按平均成绩逆序输出为:\n");//逆序打印数据
printf("姓名 \t成绩\n");
for(i=0;i<N;i++)
printf("%s \t%.2f\n",stu[i].name,stu[i].ave);
}
希望可以帮到你,呵呵追问

额...看半天还是不懂...我们还没学这东东

追答

那好吧,我就在你原程序上修改下,你程序里错误很多哦,我给你精简了很多,整理成下面的代码,已经运行成功了,你可以试一试,有问题再问我。
#include
#include
int i,j,k,t;
char s[15];
int a[5][5],b[5];
char c[5][15];
extern void sort(),average();
void main()
{ printf("输入选手姓名:");
for (k=0;ka[i][j+1])
{
t=a[i][j];
a[i][j]=a[i][j+1];
a[i][j+1]=t;
}
b[i]=(a[i][1]+a[i][2]+a[i][3])/3;
}
}

extern void sort()
{
for (j=1;jb[i+1])
{
t=b[i];
b[i]=b[i+1];
b[i+1]=t;
strcpy(s,c[i]);
strcpy(c[i],c[i+1]);
strcpy(c[i+1],s);
}
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-05-03
感觉错误很多。。。。
b=(a[1]+a[2]+a[3])/3;
这行的b是数组名~~~我猜你可能编译都通不过吧。。。
b是数组首地址,也就是地址常量~~~~将值赋值给地址常量,肯定是错误的~~~
而且,大致看了下,貌似你每个函数里面都有个b~~不知是啥意思。。追问

这不知道是怎么回事,我的程序里都是 b[i]或者b[5]不知道怎么复制的时候出错了

追答

汗~~~b[5]是不能引用的,会使数组越界的。。肯定也报错。。

追问

不知道怎么回事,复制上来[i]全都不见了

第2个回答  2011-05-03
天啊,没有注释追问

不好意思,第一次在网上求救

追答

暂时没看出来是哪里的问题

第3个回答  2011-05-03
看起来有点乱。。不想看了。追问

我是个初学者,写程序经常会犯啰嗦的毛病,请多多包涵

追答

你把你每个题目的目的。。做什么的都标出来。这样大家也好看。也好分析

相似回答