无法显示我的每个功能的结果

时间:2012-03-09 11:29:24

标签: c++ function recursion iteration

我编写了一个代码,用于计算数组的组件总和,该数组随机填充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;

}

4 个答案:

答案 0 :(得分:1)

您可以使用大小创建阵列,但在此之后对其进行了初始化。你只需要随机的东西...... 声明int指针,读取大小,用new分配数组,然后再试一次(不要忘记delete)。

答案 1 :(得分:1)

#include <iostream>
#include<conio.h>

<conio.h不是标准标题,即它不适用于所有编译器,并且您不需要它。

要查看程序的结果输出:

  • 从命令行运行它,或

  • 在Visual Studio中
  • 通过按键[Ctrl F5](无调试)或

  • 运行它
  • main的右大括号上设置断点,并在调试器下运行(在Visual Studio中,例如通过按键[F5])。

#include <stdlib.h>

据我所知,你没有使用此标题中的任何内容。但是,它确实提供了符号常量EXIT_SUCCESSEXIT_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()的问题吗?