C语言 函数数组 基础题

问题:有一个一维数组score,内放10个学生成绩,求平均成绩

我的做法:


#include<stdio.h>

double average(int );

int main()
{
    int score[10],j;
    double d;
    for(j=0;j<10;j++)
        scanf("%d",&score[j]);
    d=average(score[10]);
    printf("%lf\n",d);
    return 0;
}

double average(int a[10] )
{
    int i;
    double c;
    int b=0;
    for(i=0;i<10;i++)
        b=b+a[i];
    c=b/10;
    return c;
}

这个代码运行不了,有人说要用指针,但是指针我目前还没学到,能否不用指针
课本上有不用指针的答案:

img

帮忙找找我代码的错误,谢谢

d=average(score[10]);
改为
d=average(score);
参数为数组,应该传递数组名。score[10]是数组元素,不是数组。而且下标越界
另外24行要改为c=b/10.0;否则两个整数相除是整除,没有小数

不要把长度10写死,否则你函数调用了个寂寞:

 
#include<stdio.h>
 
double average(int[], int);
 
int main()
{
    int score[10],j;
    double d;
    for(j=0;j<10;j++)
        scanf("%d",&score[j]);
    d=average(score);
    printf("%lf\n",d);
    return 0;
}
 
double average(int a[], int n)
{
    if (n == 0) return 0;
    int i;
    double c;
    int b=0;
    for(i=0;i<n;i++)
        b=b+a[i];
    c=b/n;
    return c;
}
 

你的代码有两个问题:

在调用average函数时,应该传入score数组的地址,而不是score[10]这个元素的值。应该改为d=average(score);。

计算平均数时,应该将分子b强制转换为double类型,避免整数相除产生的精度问题。应该改为c=(double)b/10;。
修改后的代码如下:

#include<stdio.h>
 
double average(int *);
 
int main()
{
    int score[10],j;
    double d;
    for(j=0;j<10;j++)
        scanf("%d",&score[j]);
    d=average(score);
    printf("%lf\n",d);
    return 0;
}
 
double average(int *a )
{
    int i;
    double c;
    int b=0;
    for(i=0;i<10;i++)
        b=b+a[i];
    c=(double)b/10;
    return c;
}

如果想要不用指针来实现,可以直接将数组名作为参数传递给函数,因为数组名本身就是数组首元素的地址。修改后的代码如下:

#include<stdio.h>
 
double average(int []);
 
int main()
{
    int score[10],j;
    double d;
    for(j=0;j<10;j++)
        scanf("%d",&score[j]);
    d=average(score);
    printf("%lf\n",d);
    return 0;
}
 
double average(int a[] )
{
    int i;
    double c;
    int b=0;
    for(i=0;i<10;i++)
        b=b+a[i];
    c=b/10.0;
    return c;
}

这样也可以正常计算出数组score的平均值。