A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

5黑马币
本帖最后由 GodLovenan 于 2015-8-11 18:51 编辑

自己看基础视频第8天时,函数名作为函数参数时,自己在Xcode 打代码时遇到问题:

自定义了一个函数,写到最后一行系统报错了!为什么呢?
就是到 return sum/5; 出错了
float avg(float a[5]){

   
        for (int i =0; i<5; i++) {
            
        float sum =sum + a;
        
        }
    return sum/5;

}


最佳答案

查看完整内容

float sum = sum + a; a代表数组名称,而a代表数组的第i个元素。 而相加指元素相加,不是加数组名称。

20 个回复

正序浏览
cs13350 发表于 2015-8-12 20:15
如果你是想求传入数组的平均数的话,这个应该可以
float avg(float a[]){

正解,赞一个!
回复 使用道具 举报
sum定义在fou循环里了,因此只能在fou循环里有效,遇到fou的结束花括号}就被释放sum,你再return sum/5就会报出sum没有定义的错,把sum改为定义到fou上面就好了
回复 使用道具 举报
你sum变量定义在for循环里了,遇见for循环的}
回复 使用道具 举报
建议楼主先定义一个float类型的sum,然后for循环里面float sum=sum+a可以改成sum+=a[i]。这样就可以了~
回复 使用道具 举报
a是数组名哦,是不能这样运算的,,,
回复 使用道具 举报
  float sum =sum + a;//1.此处的sum是float型,但是没有初始化怎么相加。
上边字写错了,体谅。
回复 使用道具 举报
//这是楼主的代码
float avg(float a[5]){

        for (int i =0; i<5; i++) {
            
        float sum =sum + a;//1.此处的sum是float型,但是没有出示换怎么相加
                                        2.a代表数组地址,怎么相加
        
        }
    return sum/5;    //3.sum的作用域只在for循环里边,代码执行完for之后,sum就会释放,所以此处的sum不可用,系统无法识别。

}

个人建议代码
float avg(float a[5]){
        float sum = 0;
        for (int i =0; i<5; i++) {
            
         sum =sum + a[i];
        
        }
    return sum/5;   
}
希望可以帮到楼主
回复 使用道具 举报
首先我看了你的代码 知道你的函数预期功能应该是 传一个数float型组进去,然后返回数组所有数的平均值(float型)。
但是 其实代码里有两个问题:
首先 float sum 生命在循环括号内 那么他的生命周期就只是在括号内,出了括号就被自动释放了(这是由编译器自动管理的栈内存上的局部变量)。在括号外return它,明显是找不到这个变量的,自然报错了。
其次,就算你改掉了这个错误,在循环之前就folat sum=0; 也还是得不到正确的返回值。因为sum=sum+a;这句意味着将数组a[5]的第一个元素a[0]的地址加上sum,然后赋值给sum。我们想要的结果是:
随着for循环进行,将数组元素一次加到sum中求和,那么你的a就要换成a[i]。
于是正确代码就变成这样
float avg(float a[5]){
/*声明一个变量,给他初始化一个值,加强代码可读性,同样可以避免有时候声明变量为随机值而导致bug的情况。*/
        float sum=0;  
        for (int i =0; i<5; i++) {
            
        sum =sum + a[i];
        
        }
    return sum/5;

}



回复 使用道具 举报
首先我看了你的代码 知道你的函数预期功能应该是 传一个数float型组进去,然后返回数组所有数的平均值(float型)。
回复 使用道具 举报
必须顶一个
回复 使用道具 举报
sum在for循环里边定义的,sum的作用域就在for循环里边,在for循环外就不能用了,楼主应该先去理解一下变量的作用域
回复 使用道具 举报
float avg(float a[]){

                float sum=0;
        for (int i =0; i<5; i++) {
            
         sum  += a[i];
        
        }
    return sum/5;

        }
1.首先函数的定义是,返回值类型  函数名(数据类型 变量名){函数体;return语句;}所以float a[5]需要改为float a[]
2.float sum =sum + a;出错的原因有三个,第一变量的作用域,sum只在for里面有效,for外面无效,return返回不了的,第二sum+a又赋值给sum,sum这个变量没有初始化,第三若没猜错楼主是要求和,但是每次循环都会重新定义sum就无法满足求和的目的
3.温馨提示:楼主需要注意,作用域,变量的生命,变量的运算,楼主加油咯!!!
回复 使用道具 举报
a.length代表你传入数组a的长度,或者说是元素个数
回复 使用道具 举报
如果你是想求传入数组的平均数的话,这个应该可以
float avg(float a[]){

    float sum=0;
    for (int i =0; i<a.length; i++) {
        
     sum=sum + a[i];
   
    }
return sum/a.length;

}
回复 使用道具 举报
你第一行代码是想要建一个 返回float类型 方法名avg为的方法么?要是的话,你传的数组float a[5] 固定了数组长度是会报错的 ,没见过你这么传的,把5删了就好了。
然后就是 你不能拿一个float型的变量跟以及数组加,完了还赋值给一个float型的,你这里的a就是一个地址值 ,应该用索引获取数组里的元素再相加。  
最后  你的sum定义在for循环里面,return sum又在for循环外面是不行的,定义在for循环里面的变量   ,不能在for循环外面用。
回复 使用道具 举报
sum + a;是直接把数组名称加进来了  应改为 sum + a[i]; 加数组中的元素
回复 使用道具 举报
本帖最后由 wangchao1992 于 2015-8-11 21:50 编辑
wangchao1992 发表于 2015-8-11 21:30
float avg(float a[5]){

        float sum=0.0f;

变量声明请声明在for 循环外。
访问数组请用下标 a[ i ];
还有哪里不明白,



回复 使用道具 举报
首先你有两个错误
1、  float sum =sum + a;  a是一个数组名,存放的是地址
2、局部变量的生命周期是在{}中,你的sum在进行for循环之后,遇到},就已经被系统给释放了,不能被}之外调用,所以后面你的return中得sum就是没声明的!,系统就报错了
for (int i =0; i<5; i++) {
            
        float sum =sum + a;
        
        }//sum在这里已经被释放了
    return sum/5;//所以这里会说sum没有被声明

回复 使用道具 举报
本帖最后由 wangchao1992 于 2015-8-11 21:46 编辑

float avg(float a[5]){

        float sum=0.0f;
        for (int i =0; i<5; i++) {
            
         sum =sum + a[ i ];
        
        }
    return sum/5;

} 以上这是正解
回复 使用道具 举报
float sum = sum + a[i];
a代表数组名称,而a[i]代表数组的第i个元素。
而相加指元素相加,不是加数组名称。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马