我编写了一个代码,用于计算数组的组件总和,该数组随机填充0到1之间的值。我必须编写两个函数,一个是迭代的,另一个是递归的。两者都应该做同样的工作。我写的两个函数在我当时只调用一个时工作正常。但是,如果我尝试在main中调用两个函数,我只能看到一个结果,但是看不到另一个函数的结果。另外,我的递归函数往往被称为一个额外的时间。我注意到如果我把getch()作为recursive_function()中的注释。我知道我错过了什么,但我无法弄明白。谢谢你的帮助。这是代码。我正在使用Dev-C ++。
#include <iostream>
#include<conio.h>
#include <stdlib.h>
using namespace std;
//headers of the thre functions
int random_value(int array[], int size);
int iterative_function (int array[], int size, int sum);
int recursive_function ( int size, int array[], int index, int sum);
int main()
{
int size;int array[size]; int sum=0;
int index=0;
cout<<"enter the size of the array"<<endl;
cin>>size; //enter the size ofthe array...
random_value(array, size);
iterative_function (array, size, sum);
recursive_function ( size, array, index, sum);
getch();
return 0;
}
int random_value(int array[], int size)
{ cout<<"here is the value returned by rand()"<<endl;
for(int i=0;i<size;i++)
{ array[i]=( rand() % (0-2));
cout<<array[i]<<endl;
}
}
int iterative_function (int array[], int size, int sum)
{
int i,j, number, value; i=0;
cout<<"from the iterative function"<<endl;
cout<<"------"<<endl;
for(i=0;i<size;i++)
sum=sum+array[i];
cout<<"sum of the array="<<sum<<endl;
getch();
return 0; //exit the function. Program terminated succesfully.
}
int recursive_function ( int size, int array[], int index, int sum)
{
if(size>index)
{
sum=sum+array[index];
index++;
recursive_function( size, array, index, sum);
}
cout<<"from the recursive function"<<endl;
cout<<"------"<<endl;
cout<<"new sum= "<< sum<<endl;
getch();
return 0;
}
答案 0 :(得分:1)
您可以使用大小创建阵列,但在此之后对其进行了初始化。你只需要随机的东西......
声明int指针,读取大小,用new
分配数组,然后再试一次(不要忘记delete
)。
答案 1 :(得分:1)
#include <iostream>
#include<conio.h>
<conio.h
不是标准标题,即它不适用于所有编译器,并且您不需要它。
要查看程序的结果输出:
从命令行运行它,或
通过按键[Ctrl F5](无调试)或
在main
的右大括号上设置断点,并在调试器下运行(在Visual Studio中,例如通过按键[F5])。
#include <stdlib.h>
据我所知,你没有使用此标题中的任何内容。但是,它确实提供了符号常量EXIT_SUCCESS
和EXIT_FAILURE
,它们用于return
中的main
语句。例如,写EXIT_SUCCESS
比写0
更清楚,因为很多人误解了0
在这种情况下的含义。
using namespace std;
这对于短程序或命名空间是可以的。
但是,请记住,短程序通常最终会成为不那么短的程序。
然后using namespace std;
很容易导致名称冲突,特别是名称std::distance
。
//headers of the thre functions
int random_value(int array[], int size);
int iterative_function (int array[], int size, int sum);
int recursive_function ( int size, int array[], int index, int sum);
虽然部分是偏好问题,但在main
之前向前声明函数时没有优势,它是更多工作,它当前向声明与定义不完全匹配时,有时会导致问题 - 如同任何不必要的冗余,违反 DRY 原则(不要重复自己)。
相反,只需将函数定义放在main
之前。
通过这种方式,更容易看出什么是什么,因为其他人使用的功能必然先于其他功能。
int main()
{
int size;int array[size]; int sum=0;
这不应该编译,因为在C ++中,只有动态分配的数组的大小在编译时是未知的。
但是,C99支持具有上述语法的“可变长度数组”a.k.a.VLAs,并且作为语言扩展,g ++编译器支持它。
在第三方面,即使使用g ++语言扩展,上面也声明了一个不确定长度的数组,因为size
变量尚未初始化并具有不确定的值。
使用g ++编译器,该值很可能为0,但它很容易成为任何其他值。
要关闭g ++ VLA语言扩展和其他一些语言扩展,请使用以下g ++选项:
-pedantic -std=c++0x -Wall
对于标准C ++,您应该使用C ++ std::vector<int>
而不是C99 VLA。
要获取std::vector
类模板的声明,请包含标准库标题<vector>
。
int index=0;
cout<<"enter the size of the array"<<endl;
cin>>size; //enter the size ofthe array...
当你使用std::vector
时,在这里,知道它的大小,将是声明该向量的地方。
或者,如果先前声明,这里将是调整大小的地方。
random_value(array, size);
这最好是返回随机值向量的函数。
然后,您将使用它来初始化声明的向量。
iterative_function (array, size, sum);
recursive_function ( size, array, index, sum);
getch();
关于getch()
来电,请参阅以上关于<conio.h>
的评论。
return 0;
关于此处0
的值,请参阅上面有关<stdlib.h>
的评论。
}
int random_value(int array[], int size)
{ cout<<"here is the value returned by rand()"<<endl;
for(int i=0;i<size;i++)
{ array[i]=( rand() % (0-2));
这里有未定义的行为,访问可能为零的数组的元素。
cout<<array[i]<<endl;
}
}
int iterative_function (int array[], int size, int sum)
{
int i,j, number, value; i=0;
cout<<"from the iterative function"<<endl;
cout<<"------"<<endl;
for(i=0;i<size;i++)
sum=sum+array[i];
通过访问不存在的数组元素,您再次调用Undefined Behavior,通常称为“UB”。
此外,即使数组的大小非零,它也没有被初始化,因此只包含零或任意值(由神圣标准称为“不确定值”)。
cout<<"sum of the array="<<sum<<endl;
getch();
请参阅上面关于<conio.h>
的评论。
return 0; //exit the function. Program terminated succesfully.
}
让上述函数始终返回相同的值是没有意义的。从信息理论的角度来看,该返回值携带零比特的信息。而只是让函数的结果值为void
。
int recursive_function ( int size, int array[], int index, int sum)
{
if(size>index)
{
sum=sum+array[index];
index++;
recursive_function( size, array, index, sum);
}
在递归调用中使用index
,而不是递增index + 1
,这是非惯用的,因此很难找到有经验的读者,只需使用const
。
最好将index + 1
添加到几乎所有可能的声明中。
例如,这会强迫您使用 cout<<"from the recursive function"<<endl;
cout<<"------"<<endl;
cout<<"new sum= "<< sum<<endl;
getch();
。 : - )
<conio.h>
请参阅上面关于 return 0;
的评论。
}
请参阅以上关于函数的注释,该函数始终返回相同的值。
std::vector
总结一下,如果事情看起来有效,那么所有未定义的行为都是偶然的。
首先修复UB(特别是用{{1}}替换C99 VLA),然后可能会问新问题它是否仍然无法正常工作。 ; - )
答案 2 :(得分:0)
首先,您声明的数组大小未知,在获取大小输入后声明数组
答案 3 :(得分:0)
请记住,在recursive_function()中,它会多次调用自己 - 并且调用它的每个时间(通过main()或它自己)它将运行所有命令在它的身体(因为你永远不会提前返回)... 现在你能看到getch()的问题吗?