gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 03:39:49 25 4
gpt4 key购买 nike

我写了一段代码,计算一个数组的组成部分的总和,该数组的组成部分随机填充了0到1之间的值。我必须编写两个函数,一个是迭代函数,另一个是递归函数。两者都应该做同样的工作。当我一次只调用一个函数时,我编写的两个函数可以正常工作。但是,如果我尝试在主函数中调用这两个函数,则只能看到一个函数的结果,而不能看到另一个函数的结果。另外,我的递归函数往往会被调用一个额外的时间。我注意到,如果我将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;

}

最佳答案

#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支持具有上述语法的“可变长度数组”又称为VLA,并且作为语言扩展,g ++编译器也支持。

另一方面,即使使用g ++语言扩展,上面的代码仍声明了不确定长度的数组,因为 size变量尚未初始化且具有不确定的值。

使用g ++编译器,该值很可能为0,但可以轻松为任何其他值。

要关闭g ++ VLA语言扩展以及其他一些语言扩展,请使用以下g ++选项:

-pedantic -std=c++0x -Wall

For standard C++, instead of a C99 VLA you should use a C++ std::vector<int>.

In order to get a declaration of the std::vector class template, include the standard library header <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];


在这里,您通过访问不存在的数组元素再次调用未定义行为,通常称为“ 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;


请参见上面有关函数始终返回相同值的注释。

}


总结一下,对于所有未定义的行为,如果一切似乎正常,那只是偶然。

首先修复UB(尤其是用 std::vector替换C99 VLA),然后也许问一个新问题,即它是否仍然无法正常工作。 ;-)

关于c++ - 无法显示我每个功能的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9633315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com