Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Jman
43 / 43 / 10
Регистрация: 11.10.2015
Сообщений: 462
Завершенные тесты: 2
#1

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

29.07.2016, 09:45. Просмотров 253. Ответов 9
Метки нет (Все метки)

Всем привет. Почему в рекурсии ругается на параметры возвращаемые в качестве указателя?
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); //Тут ругается;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2016, 09:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос НОД рекурсия, указатели (C++):

Рекурсия (НОД) - C++
Погомите найдити НОД (наибольший общий делитель) двух натуральных чисел на языке Cи, используя рекурсию. Если не получится готовый код...

Рекурсия: вычисление НОД - C++
Даны натуральные числа n,m; найти НОД(n,m). Использовать программу, включающую рекурсивную процедуру вычисления НОД, основанную на...

Вычисление НОД двух натуральных чисел (рекурсия) - C++
День добрый, помогите пожалуйста поправить данную прогу, надо бы избавиться от меток, короче говоря, сократить строки. Вот сама...

Рекурсия (функция определения НОД (наибольшего общего делителя) числа алгоритмом Евклида) - C++
Доброго времени суток. Есть определенная функция определения НОД(наибольшего общего делителя) числа алгоритмом Евклида: int nod(int a,...

Подскажите где ошибка в нахождени НОД. Вводятся два числа a b и они должны лежать в промежутке d1 d2. с-НОД - C++
#include "stdafx.h" #include #include #include #include #include #include // для system using namespace std; int...

Заданы натуральные числа m и n. Найти НОД(m,n) Составить программу которая будет содержать рекурсивную функцию вычисления НОД...... - C++
Заданы натуральные числа m и n. Найти НОД(m,n) Составить программу которая будет содержать рекурсивную функцию вычисления НОД, которая...

9
MansMI
1290 / 1068 / 299
Регистрация: 08.01.2012
Сообщений: 4,067
29.07.2016, 09:49 #2
*input_1 и *input_1 % *input_2 числа, а требуются указатели
0
Jman
43 / 43 / 10
Регистрация: 11.10.2015
Сообщений: 462
Завершенные тесты: 2
29.07.2016, 10:41  [ТС] #3
Немного не понял ваш ответ...
0
_liv_
229 / 229 / 86
Регистрация: 07.10.2015
Сообщений: 639
Завершенные тесты: 1
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);
1
Jman
43 / 43 / 10
Регистрация: 11.10.2015
Сообщений: 462
Завершенные тесты: 2
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;
0
_liv_
229 / 229 / 86
Регистрация: 07.10.2015
Сообщений: 639
Завершенные тесты: 1
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);
}
0
Jman
43 / 43 / 10
Регистрация: 11.10.2015
Сообщений: 462
Завершенные тесты: 2
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_ Посмотреть сообщение
у Вас ошибка в передаче параметров!
Одновременно пофиксили =) А что не так с передачей параметров?
0
_liv_
229 / 229 / 86
Регистрация: 07.10.2015
Сообщений: 639
Завершенные тесты: 1
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 минут
И еще, внизу есть ссылки на ответы по нахождению НОД-а
0
Jman
43 / 43 / 10
Регистрация: 11.10.2015
Сообщений: 462
Завершенные тесты: 2
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);
0
_liv_
229 / 229 / 86
Регистрация: 07.10.2015
Сообщений: 639
Завершенные тесты: 1
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);
0
29.07.2016, 12:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2016, 12:32
Привет! Вот еще темы с ответами:

Указатели и указатели на указатели, а также типы данных - C++
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно. Накачал литературы, буду изучать) Щас...

Через указатели на указатели посчитать сумму двух чисел и записать в третье - C++
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать примитивный калькулятор, пользуясь только...

Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной - C++
Мой код. #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include&lt;iomanip&gt; using namespace std; void min_max(int*pa, int*pb,...

Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов? - C++
Есть массив int **mas; mas=new int*; // выделил место под пять строк, верно ? mas=new int;// выделил для первой строки матрицы два...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru