我试图使用两个名为相同的函数来计算2个数字数组(其中一个类型为' float',另一个' int')的算术平均值。 出于某种原因,当我运行完整的程序时,其中一个数组给了我平均值的垃圾值。 代码如下所示 -
#include <iostream>
using namespace std;
// function declarations
float Mean (float[ ], int);
float Mean (int[ ], int);
//float SD (int[ ], int);
//float SD (float[ ], int size = 15);
int main( )
{
int Fib [15] = {0}; //declare and initialize the Fibonacci array
float Array[100] = {1.0,0.0}; //declare and initialize the floating point array
int sizeFib = sizeof(Fib)/sizeof(int);
int sizeArray = sizeof(Array)/sizeof(float);
//set float precision
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(2);
//generate the Fibonacci array
Fib[0] = 0; //by definition
Fib[1] = 1; //by definition
for (int i = 2; i < 15; ++i)
Fib[i] = Fib[i-2] + Fib[i-1];
//generate the floating point array
for (int j = 0; j < 100; ++j)
Array [j + 1] = Array[j] + 1 ;
//for (int k = 0; k < sizeArray; ++k)
//cout << Array[k]<< endl;
cout << "The Arithmetic Mean of the Floating point Array is :" << Mean(Array, sizeArray) << endl;
cout << "The Arithmetic Mean of the Fibonacci Array is :" << Mean(Fib, sizeFib) << endl;
return 0;
}
//function definitions
float Mean (int array[ ], int size)
{
int sum = 0;
float mean;
for (int i = 0; i < size; ++i)
{
sum += array[i];
}
mean = sum / size;
return mean;
}
float Mean (float array[ ], int size)
{
int sum = 0;
float mean;
for (int i = 0; i < size; ++i)
{
sum += array[i];
}
mean = sum / size;
return mean;
}
我运行时获得的输出是 -
浮点数组的算术平均值为:50.00
Fibonacci数组的算术平均值为:74702368.00
为什么Fibonacci阵列出现了?
答案 0 :(得分:0)
您将浮点值相加为整数值 之后,您将划分两个整数并期望浮点值。如果运算符的两个操作数都是相同类型,则运算符将使用这些类型。转换为浮动将在分配期间稍后,而不是在分割期间。
然而,你得到的疯狂数字是由于越界错误,正如@WhozCraig指出的那样。
答案 1 :(得分:0)
该错误出现在以下代码中:
for (int j = 0; j < 100; ++j)
Array [j + 1] = Array[j] + 1 ;
此循环的最后一次迭代将尝试将Array[100]
设置为浮点值。但这超出了数组的范围,它实际上似乎正在做的是将Fib
数组的第一个元素设置为该值! (我想编译器选择将Fib
数组放在内存中的Array
数组之后。)
由于Fib
数组包含整数,并且这是写一个浮点值,因此当它被解释为int
时,你会得到一个看起来像垃圾的巨大整数。具体来说,float 100.0
被解释为int 1120403456
(因为这些值在内存中具有相同的位表示)。
我建议生成Array
数组,类似于生成Fib
数组的方法,方法是定义数组的第一个值,然后根据前一个值设置其余每个值:
Array[0] = 0;
for (int j = 1; j < 100; ++j)
Array[j] = Array[j - 1] + 1;