Форум программистов, компьютерный форум CyberForum.ru

НОД рекурсия, указатели - C++

Восстановить пароль Регистрация
 
Jman
 Аватар для Jman
27 / 27 / 4
Регистрация: 11.10.2015
Сообщений: 284
Завершенные тесты: 1
29.07.2016, 09:45     НОД рекурсия, указатели #1
Всем привет. Почему в рекурсии ругается на параметры возвращаемые в качестве указателя?
C++
1
2
3
4
5
6
int task_1_NOD_R(int *input_1, int *input_2)
{
    if (*input_2== 0)
        return *input_1;
    return task_1_NOD_R (*input_1, *input_1 % *input_2); //Тут ругается;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MansMI
1047 / 844 / 205
Регистрация: 08.01.2012
Сообщений: 3,033
29.07.2016, 09:49     НОД рекурсия, указатели #2
*input_1 и *input_1 % *input_2 числа, а требуются указатели
Jman
 Аватар для Jman
27 / 27 / 4
Регистрация: 11.10.2015
Сообщений: 284
Завершенные тесты: 1
29.07.2016, 10:41  [ТС]     НОД рекурсия, указатели #3
Немного не понял ваш ответ...
_liv_
83 / 83 / 28
Регистрация: 07.10.2015
Сообщений: 239
29.07.2016, 10:48     НОД рекурсия, указатели #4
Jman, input_1 - указатель
*input_1 - содержимое по адресу, т.е. число
Функция ждет указатель, а не число.
Надо сказать, что просто убрать звездочку не получится, т.к. вторым параметром передается вычисляемое число.
Придется завести дополнительную переменную, и передавать ее адрес.
C
1
2
int input = *input_1 % *input_2;
return task_1_NOD_R (input_1, &input);
Jman
 Аватар для Jman
27 / 27 / 4
Регистрация: 11.10.2015
Сообщений: 284
Завершенные тесты: 1
29.07.2016, 11:12  [ТС]     НОД рекурсия, указатели #5
Цитата Сообщение от _liv_ Посмотреть сообщение
и передавать ее адрес.
Спасибо огромное!

Добавлено через 15 минут
Есть трабл, деление на ноль происходит.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int task_1_NOD_R(int *input_1, int *input_2)
{
    int buffer = 1;
    buffer = *input_1 % *input_2;  // компилятор показывает на эту строчку;
    if (*input_2 == 0)
        return *input_1;
    return task_1_NOD_R (input_1, &buffer);
} 
main
 
case 1:
        {
            int *ptfirst_digit=new int, *ptsecond_digit=new int;
            int result, result_2;
            cout << "Создать программу с функциями нахождения наибольшего общего\n"
                 << "делителя и наименьшего общего кратного, в качестве параметров\n"
                 << "                использовать два указателя.\n                  " << endl;
            cout << "Введите два числа ->" << endl;
            cin >> *ptfirst_digit >> * ptsecond_digit;
            result = task_1_NOD(ptfirst_digit, ptsecond_digit);
            cout << " Наибольший общий делитель" << result << endl;
            cout << "Вычисляем при помощи рекурсивной функции" << endl;
            cout << "Введите два числа ->" << endl;
            cin >> *ptfirst_digit >> *ptsecond_digit;
            result_2 = task_1_NOD_R(ptfirst_digit, ptsecond_digit);
            cout << " Наибольший общий делитель" << result_2 << endl;
            delete ptfirst_digit, ptsecond_digit;
        }
        break;
_liv_
83 / 83 / 28
Регистрация: 07.10.2015
Сообщений: 239
29.07.2016, 11:47     НОД рекурсия, указатели #6
Jman, во-первых, сначала надо же проверять на 0
Во-вторых, у Вас ошибка в передаче параметров!
C
1
2
3
4
5
6
7
8
int task_1_NOD_R(int *input_1, int *input_2)
{
    int buffer;
    if (*input_2 == 0)
        return *input_1;
    buffer = *input_1 % *input_2;
    return task_1_NOD_R (input_2, &buffer);
}
Jman
 Аватар для Jman
27 / 27 / 4
Регистрация: 11.10.2015
Сообщений: 284
Завершенные тесты: 1
29.07.2016, 11:48  [ТС]     НОД рекурсия, указатели #7
Починил
C++
1
2
3
4
5
6
7
int task_1_NOD_R(int *input_1, int *input_2)
{
    if (*input_2 == 0)
        return *input_1;
    int buffer = *input_1 % *input_2;
    return task_1_NOD_R (input_1, &buffer);
}
Дебаг мощный инструмент...
Добавлено через 52 секунды
Цитата Сообщение от _liv_ Посмотреть сообщение
у Вас ошибка в передаче параметров!
Одновременно пофиксили =) А что не так с передачей параметров?
_liv_
83 / 83 / 28
Регистрация: 07.10.2015
Сообщений: 239
29.07.2016, 12:04     НОД рекурсия, указатели #8
Jman, надо передавать не первый параметр, а второй!

Добавлено через 6 минут
Jman, кстати, зачем передавать адреса? Гораздо симпатичнее - значения.
Или по заданию требуется именно адреса?
C
1
2
3
4
5
6
int task_1_NOD_R(int input_1, int input_2)
{
    if (input_2 == 0)
        return input_1;
    return task_1_NOD_R (input_2, input_1 % input_2);
}
Добавлено через 7 минут
И еще, внизу есть ссылки на ответы по нахождению НОД-а
Jman
 Аватар для Jman
27 / 27 / 4
Регистрация: 11.10.2015
Сообщений: 284
Завершенные тесты: 1
29.07.2016, 12:15  [ТС]     НОД рекурсия, указатели #9
Ну так я делал... Но
Создать программу с функциями нахождения наибольшего общего делителя и наименьшего общего кратного, в качестве параметров использовать два указателя.

C++
1
2
3
4
5
6
int _nod(int number1, int number2) // рекурсивная функция нахождения наибольшего общего делителя НОД #1;
{
    if ( number2 == 0 )            //базовое решение
        return number1;
        return _nod(number2, number1 % number2); // рекурсивное решение НОД
}
Это было решение без указателей в качестве параметров.

Добавлено через 1 минуту
спасибо, да. Провтыкал, кстати и некорректно работало из=за этого.
C++
1
return task_1_NOD_R (&buffer,input_1);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2016, 12:32     НОД рекурсия, указатели
Еще ссылки по теме:

Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов? C++
C++ Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной
Используются ли на практике указатели на указатели объектов? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
_liv_
83 / 83 / 28
Регистрация: 07.10.2015
Сообщений: 239
29.07.2016, 12:32     НОД рекурсия, указатели #10
Jman, может так?
C
1
return task_1_NOD_R (input_1, &buffer);
Добавлено через 3 минуты
А должно быть так (это для потомков, кто будет смотреть позже):
C
1
return task_1_NOD_R (input_2, &buffer);
Yandex
Объявления
29.07.2016, 12:32     НОД рекурсия, указатели
Ответ Создать тему
Опции темы

Текущее время: 15:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru