2014-01-29 3 views
0

Итак, вот моя простая программа для расчета Наибольший общий делитель. Он возвращает стоимость мусора каждый раз, как 46332964. Я думал над головой в течение часа, но, похоже, не понял эту проблему. После исследования я также включил прототип, но до сих пор не повезло. Он работает до тех пор, пока он не вернется. Скопируйте код и запустите его и, пожалуйста, помогите мне.C++, рекурсивный правильный ответ, но не возвращаемый правильно

#include <iostream> 
using namespace std; 

int calculate_gcd(int aa, int bb, int rem, int g); 

int main() 
{ 
    int a, b; 
    int rem = -1; 
    int gcd=0; 

    cout << "Number 1: "; //taking inputs 
    cin >> a; 
    cout << "Number 2: "; 
    cin >> b; 

    if (a < b) //swapping if number greater than the number according to the code 
    { 
     a = a + b; 
     b = a - b; 
     a = a - b; 
    } 

    gcd = calculate_gcd(a, b, rem, gcd); 

    if (a <= 0 || b <= 0) 
    { 
     rem = 0; 
     cout <<"GCD doesnot exists\n"; 
    } //just in case of zeros 
    else 
     cout << "\nthe GCD of "<<a <<" and "<<b <<" is "<<gcd <<"\n\n"; //the main answer 

    system("pause"); 
    return 0; 
} 

int calculate_gcd(int aa, int bb, int rem, int g) 
{ 
    if (rem != 0) 
    { 
     if (aa%bb == 0) 
     { 
      rem = 0; 
      g = bb; 
      printf("**GCD is %d\n", g); 
     } 
     else { 
      rem = aa % bb; 
      aa = bb; 
      bb = rem; 
     } 
     calculate_gcd(aa, bb, rem, g); 
    } 
    else { 
     printf("**here also GCD is correct as %d \n", g); 
     return g; //returning 
     } 
} 

ответ

1

Вам не хватает возврата. Вы должны использовать return calculate_gcd(aa, bb, rem, g); вместо того, чтобы просто рекурсировать.

Вы можете поймать это с помощью clang, используя -Wreturn-type. Другие компиляторы, вероятно, также имеют предупреждение для этого.

+0

спасибо. похоже работа. Я изменил рекурсивную строку на «return calculate_gcd (aa, bb, rem, g)»; также возвращать g; оставаться. но почему? кажется очень трудно думать об этом :( – TREMOR

+1

Тип 'calculate_gcd' - это' int (int aa, int bb, int rem, int g) '. Это означает, что, учитывая' aa', 'bb',' rem' , и 'g', вы * обещаете * вернуть' int'. Если ваша функция решает вернуться, она вызывает * новую копию * этой функции. Это не избавит вас от обещания вернуть целое число. На самом деле, не возвращая целое число, когда вы говорите, что собираетесь делать результаты с неопределенным поведением. – rmcclellan

2

Функция головы

int calculate_gcd(int aa, int bb, int rem, int g) 

указывает, что g является передается по значению.

Это означает, что при вызове указанное значение копируется в этот вызов функции ’ с локальным g. Изменения в этом локальном g не влияют на вызывающий сайт.

Вместо этого вы должны return результат функции, а затем вы не ’ т нужен g аргумент:

int calculate_gcd(int aa, int bb, int rem) 

пристальный анализ покажет вам, что вы на самом деле не нужен rem аргумент либо, так что:

int calculate_gcd(int aa, int bb) 

попутно, как beginne r вы получите большую пользу от использования C++ iostreams, например cout, вместо низкоуровневых функций C i/o, таких как printf. Это ’ s, потому что printf и семья не выполняют проверку любого типа, поэтому ’ s очень легко ошибаться.

Кроме того, хотя это может звучать просто как бальдердаш, вы выиграете много, выровняв вещи правильно вертикально, то есть используя 100% -ный согласованный отступ. К счастью, есть бесплатные инструменты, которые помогают в этом. Если ваш любимый IDE или редактор doesn ’ t поддерживает автоматическое форматирование исходного кода, тогда ознакомьтесь с бесплатной программой AStyle.

+0

Спасибо, я, наверное, понимаю это. Я попробую это завтра из-за постели здесь. Затем выберите правильный ответ – TREMOR