为什么我的函数不返回浮点数? [重复]

问题描述 投票:0回答:4

我编写了一个程序来查找一维数组的平均值。它有点有效,但我的问题是浮动子程序不会在主程序中返回浮动。

void vnesi_niza(int n, int a[50])
{
    for (int i=0;i<n;i++)
    {
        cout << "a[" << i << "]=";
        cin > >a[i];
    }
}

float sreden_uspeh(int n, int a[50])
{
    int sum=0;
    float as;
    for (int i=0;i<n;i++)
    {
        sum+=a[i];
        as=sum/n;
    }
    return as;
}

int main()
{
    int n;
    int niza[50];
    cout << "input the number of elements" << endl;
    cout << "n=";
    cin >> n;
    vnesi_niza(n,niza);
    cout << endl;
    cout << "the average is " << endl;
    cout << sreden_uspeh(n,niza); //sreden_uspeh means average
    return 0;
}
c++ arrays
4个回答
3
投票

由于成绩总和的类型为

int
,因此除法运算将是整数除法,即它将向下取整到前一个最接近的整数。所以你应该像这样进行小数除法:
as = (1.0 * sum) / n

注意:不需要在循环中每次都计算平均值,在循环外计算一次就足够了,然后返回它。


2
投票

as=sum/n
执行整数除法,然后将结果赋给
as
,因此
sreden_uspeh
函数将输入数组截断(向下舍入)的平均值返回为整数。

如果将变量

sum
声明为
float sum = 0
(而不是
int sum = 0
),那么
n
将被转换为浮点数,并且根据
conversions
,浮点除法将与 as=sum/n 一起进行。

或者,您可以在进行除法时将第一个操作数转换为浮点数,

as=(float)sum/n

此外,您分配了

as
但没有在循环的每次迭代中使用它,这是低效的。 其实你可以直接写

float sreden_uspeh(int n, int a[50])
{
    int sum=0;
    for (int i=0;i<n;i++)
    {
        sum+=a[i];
    }
    return (float)sum/n;
}

还要注意

int a[50]
已退化为指针类型
int *a
;完整数组不会传递给
sreden_uspeh

此外,当您执行整数除法时,通常也会取模(使用

%
运算符),因为同时取整数商和模,您不会丢失任何信息。


0
投票

你犯了一个小错误。

sum
的类型是
int
它应该是
float

float sreden_uspeh(int n, int a[50])
{
    float sum=0;
    float as;
    for (int i=0;i<n;i++)
    {
        sum+=a[i];
        as=sum/n;
    }
    return as;
}

声明中又一个错误

cin > >a[i];
.


0
投票

当您输入

int/int
时,答案将以 int 形式计算。

之后,它会变成浮动的,所以你必须让它

float/int

© www.soinside.com 2019 - 2024. All rights reserved.