не может отобразить результат каждой из моих функций - PullRequest
0 голосов
/ 09 марта 2012

Я написал код, который вычисляет сумму компонентов массива, который случайным образом заполняется значениями от 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;

}

Ответы [ 4 ]

1 голос
/ 09 марта 2012
#include <iostream>
#include<conio.h>

<conio.h не является стандартным заголовком, т. Е. Он доступен не для всех компиляторов, и он вам не нужен.

Чтобы увидеть результат вывода вашей программы:

  • запустить его из командной строки или

  • в Visual Studio запустите его с помощью нажатия клавиши [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 отсутствует, это больше работы , и это иногда вызывает проблемы , когда предварительные объявления не полностью соответствуют определениям & ndash; как и при любой ненужной избыточности, нарушения принципа DRY (не повторяйте себя).

Вместо этого просто поместите определения функций перед main.

Таким образом, гораздо легче увидеть, что к чему относится, потому что функции, которые используются другими, обязательно предшествуют этим другим функциям.

int main()
{     
   int size;int array[size]; int sum=0;

Это не должно компилироваться, потому что в C ++ только динамически размещенный массив может иметь размер, который неизвестен во время компиляции.

Однако C99 поддерживает & ldquo; массивы переменной длины & rdquo; a.k.a. VLA с вышеуказанным синтаксисом, и в качестве расширения языка это поддерживает компилятор g ++.

С другой стороны, даже с расширением языка g ++ вышеупомянутое объявляет массив неопределенной длины , потому что переменная size не была инициализирована и имеет неопределенное значение.

Для компилятора g ++ это значение, скорее всего, равно 0, но оно может быть любым другим значением.

Чтобы отключить расширение языка g ++ VLA и некоторые другие языковые расширения, используйте следующие параметры g ++:

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

Для стандартного C ++ вместо VLA C99 вы должны использовать C ++ std::vector<int>.

Чтобы получить объявление шаблона класса 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;

См. Выше комментарий о функции, всегда возвращающей одно и то же значение.

}

Подводя итог, со всем неопределенным поведением, это просто случайность, если кажется, что все работает.

Прежде всего исправьте UB (в частности, замените C99 VLA на std::vector), а затем, возможно, задайте новый вопрос, если он все еще не работает должным образом. ; -)

1 голос
/ 09 марта 2012

Вы создаете свой массив, используя размер, но он инициализируется ПОСЛЕ этого.Вы просто получаете random stuffs ... Объявляете указатель типа int, считываете размер, выделяете массив с помощью new, затем пытаетесь снова (не забудьте delete).

0 голосов
/ 09 марта 2012

Помните, что в recursive_function () он вызывает себя много раз - и каждый раз, когда он вызывается (либо main (), либо сам по себе), он будет запускать все команды в своемbody (поскольку вы никогда не возвращаетесь раньше) ... сейчас видите ли вы проблему с getch ()?

0 голосов
/ 09 марта 2012

Прежде всего, объявленный вами массив имеет неизвестный размер, объявите массив после получения ввода для размера

...