#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
), а затем, возможно, задайте новый вопрос, если он все еще не работает должным образом. ; -)