Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
K_arina
0 / 0 / 1
Регистрация: 15.05.2016
Сообщений: 34
1

Передать функцию в качестве параметра

28.09.2016, 21:25. Просмотров 541. Ответов 21

Нужно передать функцию func в качестве параметра для функции palindrom. Как это сделать? желательно не через указатель
C++
1
2
3
4
5
6
int func(int n) // эта функция считает к-во цифр в числе
{
    if (n == 0)
        return 0;
    else return 1 + func(n / 10); 
}
bool palindrom(func(n)???, int a);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2016, 21:25
Ответы с готовыми решениями:

Как передать функцию в качестве параметра?
Помгите плиз, не получается передать одну функцию как параметр другой я...

Можно ли в качестве параметра функции передать другую функцию?
В ниже представленной программе функция returnMax находит в массиве...

Указатели (нужно передать массив в качестве параметра в функцию)
Добрый день! имеется массив array его нужно передать в качестве параметра в...

Как передать массив структур в функцию в качестве параметра, чтобы изменения в функции меняли исходный массив?
Допустим есть структура struct Base { int a; int b; int...

Как передать файл в качестве параметра функции
Как передать файл в качестве параметра функции? Напишите пожалуйста на примере...

21
GbaLog-
Любитель чаепитий
3165 / 1471 / 465
Регистрация: 24.08.2014
Сообщений: 5,204
Записей в блоге: 1
Завершенные тесты: 2
28.09.2016, 21:30 2
Цитата Сообщение от K_arina Посмотреть сообщение
bool palindrom(func(n)???, int a);
Так объявите вот так:
C++
1
2
3
bool palindrom( int n, int a );
//а вызывайте так
bool check = palindrom( func(n), a );
1
K_arina
0 / 0 / 1
Регистрация: 15.05.2016
Сообщений: 34
28.09.2016, 21:36  [ТС] 3
Не совсем понятно как именно это сделать
Вот весь код:

Я знаю, что палиндром можно найти в 10 раз проще, но препод задал именно таким способом найти


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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// Число - палиндром
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
 
int func(int n) // эта функция считает к-во цифр в числе
{
    if (n == 0)
        return 0;
    else return 1 + func(n / 10); // рекурсивный вызов
}
 
 
 
bool palindrom (int n, int a);
 
 
void main()
{
    int x;
    cout << "Enter your number ";
    cin >> x;
    
    
    func(x);
    if (bool check = palindrom(func(x), a);
    )
        cout << "YES" <<endl;
    else 
        cout << "NO" << endl;
    //cout << func(x);
    system("pause");
 
 
    }
 
 
 
    
bool palindrom(int n, int a) // функция-проверка палиндрома
        {
            
            int c = 0;
            int b = 0;
 
            c = a / (10 ^ (func(n) - 1)); // наибольший разряд (первое число)
            b = a % 10;  // наименьший разряд (последнее число)
            if (c == b)
                return palindrom((a % (10 ^ (func(n) - 1))) / 10);
        }
0
GbaLog-
Любитель чаепитий
3165 / 1471 / 465
Регистрация: 24.08.2014
Сообщений: 5,204
Записей в блоге: 1
Завершенные тесты: 2
28.09.2016, 21:44 4
Заключайте код в теги [cpp][/cpp]
Цитата Сообщение от K_arina Посмотреть сообщение
C++
1
2
if (bool check = palindrom(func(x), a);
)
C++
1
2
if( palindrom( func(x), a ) )
//далее ваш код
Цитата Сообщение от K_arina Посмотреть сообщение
^
В С++ это не оператор возведения в степень, а xor, для возведения в степень используйте pow().
Прочитать про pow можно здесь -> http://en.cppreference.com/w/cpp/numeric/math/pow
1
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
28.09.2016, 21:54 5
K_arina, а зачем её передавать как параметр? Это часть задания, что ли?
1
K_arina
0 / 0 / 1
Регистрация: 15.05.2016
Сообщений: 34
28.09.2016, 21:56  [ТС] 6
мне нужно получить доступ к параметру n, а он имеет локальную видимость, нужно это как-то решить. Пыталась объявить n глобальной переменной, но ничего не получалось.
0
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
28.09.2016, 22:02 7
Ты n передаёшь в func() из palindrom(), значит, доступ изначально есть. Не ясно, что ты хочешь.
1
K_arina
0 / 0 / 1
Регистрация: 15.05.2016
Сообщений: 34
28.09.2016, 22:13  [ТС] 8
нет, это я уже следую советам, изначально код выглядел так

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
 
int func(int n); // эта функция считает к-во цифр в числе
 
bool palindrom (int a);
 
 
void main()
{
    int x;
    cout << "Enter your number ";
    cin >> x;
    
    
    func(x);
    if (palindrom(x))
        cout << "YES" <<endl;
    else 
        cout << "NO" << endl;
    system("pause");
    }
 
 
int func(int n) // эта функция считает к-во цифр в числе
{
    if (n == 0)
        return 0;
    else return 1 + func(n / 10); // рекурсивный вызов
}
    
bool palindrom(int a) // функция-проверка палиндрома
        {
            
            int c = 0;
            int b = 0;
 
            c = a / pow (10, floor (func(n) - 1)); // наибольший разряд (первое число)
            b = a % 10;  // наименьший разряд (последнее число)
            if (c == b)
                return palindrom(a % pow (10 , floor((func(n) - 1) / 10)));
        }
Выдает ошибки : IntelliSense: идентификатор "n" не определен
4 error C2661: pow: нет перегруженной функции, принимающей 1 аргументов
0
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
28.09.2016, 22:27 9
Вместо n должно быть a, насколько я понимаю.
Применение функций, работающих с вещественными числами сомнительно.
1
K_arina
0 / 0 / 1
Регистрация: 15.05.2016
Сообщений: 34
28.09.2016, 22:34  [ТС] 10
А все же можно как-то передать функцию в качестве параметра?
0
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
28.09.2016, 22:46 11
Функция передаётся через указатель на функцию, но тебе это не нужно. Откуда ты взяла эту n, я не знаю. По смыслу туда передаётся текущее число для определения длины, т. е. a.
1
K_arina
0 / 0 / 1
Регистрация: 15.05.2016
Сообщений: 34
28.09.2016, 23:10  [ТС] 12
Вводила n только из-за того, что препод говорил про конфликт переменных.
Ок, все n поменяла на a, вроде ошибок с переменными больше нет. Осталась ошибка с pow.
3 IntelliSense: выражение должно относиться к целочисленному типу или типу перечисления без области
Ошибка 2 error C2297: %: недопустимо, правый оператор имеет тип "double"
0
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
28.09.2016, 23:21 13
Я же говорю, что не надо смешивать арифметику. Приведи его к int.
1
K_arina
0 / 0 / 1
Регистрация: 15.05.2016
Сообщений: 34
28.09.2016, 23:41  [ТС] 14
что привести и как?
я уже запуталась
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7051 / 3354 / 454
Регистрация: 04.12.2011
Сообщений: 9,325
Записей в блоге: 5
29.09.2016, 00:05 15
Цитата Сообщение от K_arina Посмотреть сообщение
я уже запуталась
K_arina, pow это функция для чисел с плавающей точкой. Умножить n раз на 10 лучше просто циклом, например.
Я разминки ради наворотил вот тут. Проверьте сами.
Кликните здесь для просмотра всего текста

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
using namespace std;
 
int first_digit(int a, int & upper_lim_dec)
{
if(a<0) a = -a ;
if(a<10)return true;
upper_lim_dec=1;
int aa=a;
    while(aa>9)
    {
        upper_lim_dec*=10;
        aa=a/upper_lim_dec;
    }
int fdigit=1;
aa=a;
    while(true)
    {
        aa-=upper_lim_dec;
        if(aa<upper_lim_dec)break;
        fdigit++;
    }
return fdigit;
}
 
int last_digit(int a)
{
int upper_lim_dec;
    while(a>9)
        {
            a-=first_digit(a, upper_lim_dec)*upper_lim_dec;
        }
return a;
}
 
bool is_palindrom(int a)
{
if(a<10)return true;
int fdigit, ldigit, upper_lim_dec;
    while(a>9)
        {
            fdigit=first_digit(a, upper_lim_dec);
            ldigit=last_digit(a);
            if(fdigit != ldigit) return false;
            a = ( a - fdigit * upper_lim_dec - ldigit ) / 10;
        }
return true;
}
 
int main(int argc, char* argv[])
{
    int a[] = {123, 121, 34543, 34544, 53136, 890098};
    int s=sizeof(a)/sizeof(a[0]);
 
for(int i=0; i < s; ++i)
if(is_palindrom(a[i]))cout<<a[i]<<" is a palindrom"<<endl;
else cout<<a[i]<<" is not a palindrom"<<endl;
 
system("pause");
return 0;
}

1
K_arina
0 / 0 / 1
Регистрация: 15.05.2016
Сообщений: 34
29.09.2016, 01:06  [ТС] 16
Значит я никак не могу возвести число в целое значение функции?

Добавлено через 28 минут
Я использовала экспоненту и логарифм натуральный. С возв. в степень разобралась.
НО! Нужно вернуть n, ибо когда я все заменила на а, функция перестала считать количество цифр в числе.
Помогите, пожалуйста, передать значение n в функцию palindrom
0
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
29.09.2016, 07:54 17
Нет никакого n. Программу с изменениями покажи.
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7051 / 3354 / 454
Регистрация: 04.12.2011
Сообщений: 9,325
Записей в блоге: 5
29.09.2016, 10:04 18
Цитата Сообщение от K_arina Посмотреть сообщение
Помогите, пожалуйста, передать значение n в функцию palindrom
А я думал Вы спросите почему последнюю цифру так тяжко находим, а не вот так, скажем:
C++
1
int last_digit(int a){return a%10;}
K_arina, для того чтобы вызвать функцию из функции, достаточно из неё видеть объявление вызываемой функции. Что передавать и как, это в Ваших руках. Конкретные имена переменных не имеют значения. Тип должен быть подходящим и всё. Напишите сначала что-то вроде:
C++
1
2
3
4
5
6
7
void f_call_me_to_print(int n)
{cout << n;}
 
void f_call_you_to_print_a()
{ 
int a = 12345; f_call_me_to_print(a);//тут n не обязательно
}
Добавлено через 35 минут
K_arina, Вы молчите и от этого не спокойно. Давайте последний пример изменим так, чтобы вызывающая функция тоже имела параметр:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
void f_call_me_to_print(int n)
{cout << n;}
 
void f_call_you_to_print_a(int a)
{ 
a++;
f_call_me_to_print(a);//тут n не обязательно
}
 
int main(int argc, char* argv[])
{
int b=123;
f_call_you_to_print_a(b);
cout<<endl;
system("pause");
return 0;
}
теперь она получает целое число из-вне, чего-то с ним делает (или не делает) и передаёт в вызываемую функцию. Ей неважно даже, чему равно это число, а уж имя переменной в области вызова (b в main) тем более. Это потому, что параметры функции это её интерфейс, а тело - её реализация. Это как голова и тело у человека. То есть чтобы функция вела себя по-человечески тело не должно знать о том, что думает голова. Тогда одно не помешает другому. Это называется отделением интерфейса от реализации и оно даёт гибкость и свободу. Ещё наши давние предки, - полудикие программисты, мечтали о создании программных модулей, которые, если в них передать всё что угодно, сразу начнут делать всё, что угодно. Отделение интерфейса от реализации, это мощный шаг к претворению в жизнь давней мечты пращуров.
Можно конечно и функцию в функцию передать, тогда вызывающему коду нет дела даже до того, что он вызывает, а не только до какого-то параметра. Это очень мощный инструмент и в вашем случае он избыточен.
Позднее связывание помогает решить ещё одну интересную задачу. Дело в том, что глядя, даже на очень прозрачный код, всегда легче сказать чего он не делает, чем что он делает. А вот при наличии вызовов по указателю на функцию, это делать тем труднее, чем больше таких вызовов. Даже не рекурсивных.
Забудьте всё и внимательно посмотрите как из main Вы вызываете следующую функцию. Подумайте и всё будет нормально.
0
K_arina
0 / 0 / 1
Регистрация: 15.05.2016
Сообщений: 34
29.09.2016, 10:46  [ТС] 19
Я последнюю цифру вроде так и находила - остаток от деления на 10.

Вот программа с изменениями. Но она работает неправильно. Если мысленно прохожу все функции, циклы и рекурсии с каким-то числом-палиндромом, то все должно работать. Но не работает.


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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include "stdafx.h"
#include <iostream>
#include <cmath>
using namespace std;
 
int func(int a); // эта функция считает к-во цифр в числе
 
bool palindrom(int a); // эта функция проверяет является ли число полиндромом
 
 
void main()
{
    int x;
    cout << "Enter your number ";
    cin >> x;
    
 
    func(x); // вызываем функцию определения к-ва цифр
    if (palindrom(x))
        
        cout << "YES" << endl;
    else
        cout << "NO" << endl;
    system("pause");
    
}
 
 
int func(int a) // эта функция считает к-во цифр в числе
{
    if (a == 0)
        return 0;
    else return 1 + func(a / 10); // рекурсивный вызов
}
 
bool palindrom(int a) // функция-проверка палиндрома
{
    int k = 0;
    int c = 0;
    int b = 0;
 
    k = func(a);
 
    c = a / (exp( int (10 * log(k - 1)))); // наибольший разряд (первое число)
    b = a % 10;  // наименьший разряд (последнее число)
    
    
    if (c == b)
    {
        return palindrom((a % int(exp(10 * log((k - 1)) / 10))));
    }
    // сначала находим остаток от деления числа на 10 в степени (к-во цифр - 1) - отбрасываем первую цифру числа, 
    // а потом делим число на 10 - отбрасываем последнюю цифру числа, у нас получилось укороченое слева и справа 
    // число на  один разряд, и уже к новому числу рекурсивно вызываем функцию palindrom
    
    // Вот здесь нужен, наверное, какой-то return, но я не знаю какой
}
0
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
29.09.2016, 11:36 20
Цитата Сообщение от K_arina Посмотреть сообщение
Если мысленно прохожу все функции, циклы и рекурсии с каким-то числом-палиндромом, то все должно работать.
И как у тебя мысленно это считается на натуральных логарифмах?
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void main()
{
    int x;
    cout << "Enter your number ";
    cin >> x;
    
    if (palindrom(x))
        
        cout << "YES" << endl;
    else
        cout << "NO" << endl;
    system("pause");
    
}
 
 
int func(int a) // эта функция считает к-во цифр в числе
{
    if (a == 0)
        return 0;
    else return 1 + func(a / 10); // рекурсивный вызов
}
 
bool palindrom(int a) // функция-проверка палиндрома
{
    int k = 0;
    int c = 0;
    int b = 0;
 
    k = func(a);
 
    c = a / static_cast<int>(pow(10.0, k - 1)); // наибольший разряд (первое число)
    b = a % 10;  // наименьший разряд (последнее число)
    
    
    if (c == b)
    {
        if (k < 4) return true;
        return palindrom(a / 10 - c * static_cast<int>(pow(10.0, k - 2)) );
    }
    
    return false;
}
0
29.09.2016, 11:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2016, 11:36

Как передать в качестве параметра конструктора ПОТОК,
Здравтсвуйте. Есть класс Notebook(); Один из конструкторов принимает в...

Функции: Как передать в качестве параметра число?
Как передать в качестве параметра число? с++

Как передать слово в качестве параметра функции?
Возможно ли чтобы функция принимала слово, вывела его , и рассчитала его...


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

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

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