从阵列打印时,零不显示为0

时间:2014-04-19 10:11:03

标签: c++

除非秒数等于4或4的倍数,否则一切都按预期工作。 在这种情况下,0秒表示为零以外的值。

请向我解释为什么会这样。

当秒= 3时,输出为:

Please enter the height of the bridge (meters): 100
Please enter the time the watermelon falls: 3
Time Falling (seconds) Distance Falling (meters)
*************************************************
0   0
1   4.9
2   19.6
3   44.1

当秒= 4时,输出为:

Please enter the height of the bridge (meters): 100
Please enter the time the watermelon falls: 4
Time Falling (seconds) Distance Falling (meters)
*************************************************
1117572301  0
1   4.9
2   19.6
3   44.1
4   78.4

代码:

#include <iostream>
using namespace std;

int main()
{
//declare variables
int seconds, heightBridge, count;
float heightWatermelon, maxFall;
const float gravity = 9.8;

//get variables from user
cout << "Please enter the height of the bridge (meters): ";
cin >> heightBridge;

cout << "Please enter the time the watermelon falls: ";
cin >> seconds;

//declare array's
int secondsArray[seconds];
float heightWatermelonArray[seconds];

for (count = 0; count <= seconds; count++)
    {
    heightWatermelon = 0.5 * gravity * count * count;
    secondsArray[count] = count;
    heightWatermelonArray[count] = heightWatermelon;
    }

//create heading
cout << "Time Falling (seconds) Distance Falling (meters)\n";
cout << "*************************************************\n";

//calculate max fall distance
maxFall = 0.5 * gravity * seconds * seconds;

//display data
for (count = 0; count <= seconds; count++)
    {
    if (maxFall > heightBridge)
        {
        cout << "Warning - Bad Data: The distance fallen exceeds the "
             << "height of the bridge" << endl;
        break;
        }
    else
        cout << secondsArray[count] <<  "\t"
             << heightWatermelonArray[count] << endl;
    }


return 0;
}

2 个答案:

答案 0 :(得分:4)

您正在使用从0seconds(包括)的索引,因此您的数组必须声明为

int secondsArray[seconds+1];
float heightWatermelonArray[seconds+1];

(只有似乎才能使用较小的值,您的代码实际上是在调用未定义的行为)。

答案 1 :(得分:2)

您可以按如下方式声明数组:

//declare array's
int secondsArray[seconds];
float heightWatermelonArray[seconds];

然后在以下循环中访问:

for (count = 0; count <= seconds; count++)

当您声明一个长度为seconds的数组时,这会分配一个数量为seconds的数组。由于数组是零索引的,这意味着索引0..(seconds-1)是有效的。你的循环将从0..seconds开始,因此会导致溢出。要解决此问题,只需将<=更改为<

另一个解决方案是调整阵列大小,如下面的Zeta所述。在这种情况下,只需将数组规范更改为以下内容:

//declare array's
int secondsArray[seconds+1];
float heightWatermelonArray[seconds+1];

然后你可能想知道为什么你得到一个奇怪的数字而不是零。因为在x86上(我假设你在x86上),堆栈向下增长,heightWatermelonArray将在内存中 secondsArray之前直接。当你写heightWatermelonArray[seconds]时(即在heightWatermelonArray结束时,你溢出数组,然后转到下一位内存。在这种情况下,那个内存将是{{1}的第一个元素所以你破坏了记忆。