2 lbluesky01 lbluesky01 于 2014.11.28 09:27 提问

C语言关于函数调用的一个问题

代码如下,不知道为什么达不到想要的效果
编程初学者,大一。谢谢指导!找了好久没发现问题
谢谢!

//输入5个班的成绩,计算各班的平均值,输出所有班中平均值最大的分数,以及所有人中最大的分数
//假设每个班不超过50人
#include
int i;
void f1(double a[],int x);
double f2(double a[],int x);
double f3(double a[],int x);

void main()
{
int s;
double Class[50],average[5],max[5],allaverage,allmax; //class中C大写否则与关键字冲突
for(i=0;i<5;i++)
{
printf("请输入%d班的学生人数:",i+1);
scanf("%d",&s);
printf("请输入学生成绩:\n");
f1(Class,s);
average[i]=f2(Class,s);
max[i]=f3(Class,s);

}
        //从5个班的最大平均分最高分里求整个年级的最大值
    allaverage=f3(average,5);
    allmax=f3(max,5);

    //输出
    printf("最高班级平均分为:%.2f\n",allaverage);
    printf("最高分为:%.2f\n",allmax);

}
//f1:输入各班成绩
//f2:求平均值
//f3:求最高分
void f1(double a[],int x)
{
for(i=0;i<x;i++)
scanf("%d",&a[i]);
}

double f2(double a[],int x)
{
double m;
for(i=0,m=0;i<x;i++)
m=m+a[i];
return m/x;

}

double f3(double a[],int x)
{
int max=0;
for(i=0;i<x;i++)
{

    if(a[i]>a[max])
        max=i;
    return a[max];
}

}

9个回答

u011433244
u011433244   2014.11.28 09:48

你只是调用f()函数,没有获取值;这样试试
在调用函数的时候 double x=f();
printf("%2f",x);
试试看。

lbluesky01
lbluesky01 还没解决,但谢谢你。第一次提问,很高兴得到你的帮助
接近 3 年之前 回复
xianfajushi
xianfajushi   2014.11.28 11:01
lbluesky01
lbluesky01 谢谢你提供的资料。第一次提问,很高兴得到你的回答,谢谢
接近 3 年之前 回复
jiangzuzai
jiangzuzai   2014.11.29 09:31

一楼正解
void f1(double a[],int x)
{
for(i=0;i<x;i++)
scanf("%d",&a[i]);
}
这里函数里的参数要用到引用或者指针
引用写法:
void f1(double &a[],int x)//加个取址符,这里代表引用
{
for(i=0;i<x;i++)
scanf("%d",&a[i]);
}
指针写法:感觉一楼没必要用两个指针符号
void f1(double *a,int x)//加个指针符号
{
for(i=0;i<x;i++)
scanf("%d",a[i]);//这里不用加取地址的符号了,a[i]表示的就是第i个元素的地址了
}

lbluesky01
lbluesky01 谢谢,我还没有学指针看不太懂。谢谢你的热心解答,第一次提问,很高兴你的回答,谢谢。我粘个图到下面,运行之后的结果。我搞不懂为什么输入一班之后直接跳到了4班,你能帮我看看吗?感激不尽!
接近 3 年之前 回复
eagleyan
eagleyan   Rxr 2014.11.30 05:48

这不是明显的错误么

for(i=0;i {
if(a[i]>a[max])
max=i;
return a[max];
}
应该是
for(i=0;i {
if(a[i]>a[max])
max=i;

return a[max];

eagleyan
eagleyan 回复lbluesky01: 直接说很简单,如果1班3个人,成绩是80, 92, 80,平均分83, 2班2个人60, 60,你的class是同一个地址,你拿到一个60,60,80的数组,本来平均分是60,结果你得到一个60+60+80 / 3= 66.7
接近 3 年之前 回复
eagleyan
eagleyan 回复lbluesky01: 我没有QQ,你可以发邮件到tristan.yim@gmail.com
接近 3 年之前 回复
lbluesky01
lbluesky01 回复eagleyan: 谢谢你
接近 3 年之前 回复
lbluesky01
lbluesky01 回复eagleyan: 能说下你QQ号吗?。我发图给你看下。在CSDN我不知道怎么发图。不方便的话那就算了。我没大懂你的意思,就是我后面输入的数量比前面的多也会有问题
接近 3 年之前 回复
eagleyan
eagleyan 回复lbluesky01: 没问题,还有一个问题,你在每次拿到每个班级的数据后用的是同一个class数组,如果后面的班级没有前面班级人多,是会有问题的
接近 3 年之前 回复
lbluesky01
lbluesky01 谢谢,还没有解决,但很感谢你帮我指出了一个错误。第一次提问,很高兴你的回答,谢谢
接近 3 年之前 回复
shaohuacheng
shaohuacheng   2014.11.28 22:47

为什么我看着没有错误?

lbluesky01
lbluesky01 编译及运行的确没有错误,,但达不到我想要的效果,,不懂
接近 3 年之前 回复
usehers
usehers   2014.11.28 23:15

void f1(double **a,int x)
{
for(i=0;i<x;i++)
scanf("%d",*a[i]);
}
,
1、这个函数要这样写,函数有副本机制,f1函数里创建的a[]只是临时变量,调用结束后自动释放了,并没有真正写回你想要的数组里,需要二级指针调用才行,调用的时候f1(&Class,s);
2、printf和scanf函数不会进行数据类型转换,你a数组定义的是double型,怎么可以用%d输入

lbluesky01
lbluesky01 我改了之后一运行出现这两个错误 你能否帮忙看看怎么回事?我没学过指针看不大懂 谢谢你的回答,第一次提问,很高兴得到你的回答,谢谢
接近 3 年之前 回复
lbluesky01
lbluesky01 fatal error LNK1120: 1 unresolved externals
接近 3 年之前 回复
lbluesky01
lbluesky01 error LNK2001: unresolved external symbol "void __cdecl f1(double * const,int)" (?f1@@YAXQANH@Z)
接近 3 年之前 回复
jiangzuzai
jiangzuzai   2014.11.29 09:33

printf("%ld",a[i])
scanf("%ld,&a[i]")
输入输出double型要用“%ld”

lbluesky01
lbluesky01 好吧我不知道怎么发图。就是用VC6编译正确,运行之后叫我输入1班的人数。输完之后输分数、重点是接下来直接跳到了4班。。搞不懂为什么
接近 3 年之前 回复
u010925162
u010925162   2014.11.30 01:13

#include
int i;
void f1(double *a,int x);
double f2(double *a,int x);
double f3(double *a,int x);
void main()
{
int s;
double Class[50],average[5],max[5],allaverage,allmax; //class中C大写否则与关键字冲突
for(i=0;i<5;i++)
{
printf("请输入%d班的学生人数:",i+1);
scanf("%d",&s);
printf("请输入学生成绩:\n");
f1(Class,s);
average[i]=f2(Class,s);
max[i]=f3(Class,s);
printf("%lf",average[i]);
}
//从5个班的最大平均分最高分里求整个年级的最大值
allaverage=f3(average,5);
allmax=f3(max,5);

//输出
printf("最高班级平均分为:%.2f\n",allaverage);
printf("最高分为:%.2f\n",allmax);

}
//f1:输入各班成绩
//f2:求平均值
//f3:求最高分
void f1(double *a,int x)
{
for(int i=0;i scanf("%lf",&a[i]);
int j =0;
}
double f2(double *a,int x)
{
double m;
m= 0;
for(int i=0;i m=m+a[i];
return m/x;
}
double f3(double *a,int x)
{
int max=0;
for(int i=0;i {
if(a[i]>a[max])
max=i;
return a[max];
}
}

mingwanlau
mingwanlau   2014.12.05 17:12

#include
//int i; i不能作为全局变量,这样逻辑会有问题
void f1(double a[],int x);
double f2(double a[],int x);
double f3(double a[],int x);
void main()
{
int s;
int i;
double Class[50],average[5],max[5],allaverage,allmax; //class中C大写否则与关键字冲突
for(i=0;i<5;i++)
{
printf("请输入%d班的学生人数:",i+1);
scanf("%d",&s);
printf("请输入学生成绩:\n");

    f1(Class,s);
    average[i]=f2(Class,s);
    max[i]=f3(Class,s);
    printf("%d班平均分是%f\n",i+1,average[i]);
}
//从5个班的最大平均分最高分里求整个年级的最大值
allaverage=f3(average,5);
allmax=f3(max,5);

//输出
printf("最高班级平均分为:%.2f\n",allaverage);
printf("最高分为:%.2f\n",allmax);

}
//f1:输入各班成绩
//f2:求平均值
//f3:求最高分
void f1(double a[],int x)
{
int i;
for(i=0;i<x;i++)
scanf("%lf",&a[i]);//scanf输入双精度浮点型要用%lf
}

double f2(double a[],int x)
{
double m;
int i;
for(i=0,m=0;i<x;i++)
m=m+a[i];
return m/x;
}

double f3(double a[],int x)
{
int max=0;
int i;
//一下逻辑上有误
for(i=1;i<=x;i++)
{
if(a[i]>a[max])
max=i;
}
return a[max];
}

Csdn user default icon
上传中...
上传图片
插入图片