除非秒数等于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;
}
答案 0 :(得分:4)
您正在使用从0
到seconds
(包括)的索引,因此您的数组必须声明为
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}的第一个元素所以你破坏了记忆。