我编写了一个程序来查找一维数组的平均值。它有点有效,但我的问题是浮动子程序不会在主程序中返回浮动。
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;
}
由于成绩总和的类型为
int
,因此除法运算将是整数除法,即它将向下取整到前一个最接近的整数。所以你应该像这样进行小数除法:as = (1.0 * sum) / n
。
注意:不需要在循环中每次都计算平均值,在循环外计算一次就足够了,然后返回它。
行
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
。
此外,当您执行整数除法时,通常也会取模(使用
%
运算符),因为同时取整数商和模,您不会丢失任何信息。
你犯了一个小错误。
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];
.
当您输入
int/int
时,答案将以 int 形式计算。
之后,它会变成浮动的,所以你必须让它
float/int
。