8 / 6 / 3
Регистрация: 14.04.2019
Сообщений: 71
1

Реализовать функцию с переменным числом параметров

06.12.2019, 10:36. Показов 1371. Ответов 11
Метки с++ (Все метки)

Доброго времени суток! Есть задачка:
Реализовать функцию с переменным числом параметров, которая принимает на вход значения и
операции, которые нужно выполнить над значениями. Например выражение:
v = myFunc (2, '+', 3.5, '*', 7, '') эквивалентен выражения v = 2 + 3.5 * 7 Символ '' является
признаком последнего аргумента.
Не понимаю, как в такой функции можно вывести данные разных типов. Кое-как подумав, сделал что-то типа такого, но у меня проблема: читает числа на промежутке -127 до 127, дробные числа от 10 до -10, при вводе 43 оно выводит символ, вместо того, что бы вывести число.
Логика у меня какая, если был введен символ - проверка по адской таблице и вывод его на экран, в другом случае просто вывод
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using namespace std;
 
double myFunc(double a, ...) {
    va_list ptr;
    va_start(ptr, a);
    for (; a!='"'; a = va_arg(ptr, char)) {
        if (a == 42 || a == 43 || a == 45 || a == 47)cout << (char)a << endl;
        else cout << a << endl;
    }
    va_end(ptr);
    return a;
}
 
int main() {
    int a = 10, b = 30;
    myFunc(3.5,'+', 5, '*', 9.9, '"');
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.12.2019, 10:36
Ответы с готовыми решениями:

Реализовать функцию с переменным числом параметров C++
Реализовать функцию с переменным числом параметров. Параметрами являются символы, определяющие,...

Реализовать функцию с переменным числом параметров
Помогите пожалуйста. Аргументы функции: целые положительные числа. Конец ввода: -1....

Унаследовать функцию с переменным числом параметров
Добрый день, форум! Вот такая задачка: Есть базовый класс A с методом void func(void). От этого...

Написать функцию с переменным числом параметров
Среднее арифметическое из элементов в списке параметров , стоящие на четных местах. вот что у...

11
858 / 447 / 112
Регистрация: 06.07.2013
Сообщений: 1,494
06.12.2019, 11:23 2
Цитата Сообщение от _NeznaIka_ Посмотреть сообщение
Логика у меня какая, если был введен символ
что есть символ?
(a == 42 || a == 43 || a == 45 || a == 47) ???
0
16079 / 8681 / 2120
Регистрация: 30.01.2014
Сообщений: 14,960
06.12.2019, 11:24 3
Цитата Сообщение от _NeznaIka_ Посмотреть сообщение
как в такой функции можно вывести данные разных типов.
Никак. В подобных функциях нужно явно передавать какой-либо маркер типа, иначе вы не сможете правильно достать значение его переменной. См., например, как делает это printf.
А вам точно нужно использовать подобный вариант, может быть вариант с variadic templates больше подойдет? Синтаксически при вызове будет точно такая же запись, но там из-за того, что это шаблон, возможно определить какой тип был передан и дополнительные маркеры не нужны.
1
8 / 6 / 3
Регистрация: 14.04.2019
Сообщений: 71
06.12.2019, 11:32  [ТС] 4
Цитата Сообщение от Raali Посмотреть сообщение
что есть символ?
(a == 42 || a == 43 || a == 45 || a == 47) ???
Ну типа если а=42 выводит *, 43 +, 45 -, 47 /.
0
16079 / 8681 / 2120
Регистрация: 30.01.2014
Сообщений: 14,960
06.12.2019, 11:37 5
Цитата Сообщение от _NeznaIka_ Посмотреть сообщение
3 оно выводит символ, вместо того, что бы вывести число.
"Символ" + в ASCII и число 43 - это одно и то же.
Именно поэтому это никогда не будет работать, как вам уже намекнули в посте #2.
1
8 / 6 / 3
Регистрация: 14.04.2019
Сообщений: 71
06.12.2019, 11:38  [ТС] 6
Цитата Сообщение от DrOffset Посмотреть сообщение
Никак. В подобных функциях нужно явно передавать какой-либо маркер типа, иначе вы не сможете правильно достать значение его переменной. См., например, как делает это printf.
А вам точно нужно использовать подобный вариант, может быть вариант с variadic templates больше подойдет? Синтаксически при вызове будет точно такая же запись, но там из-за того, что это шаблон, возможно определить какой тип был передан и дополнительные маркеры не нужны.
На примере любой функции можете показать? Не совсем понял, о чем идет речь и в гугле тоже не совсем понял о чем говорят. Это получается просто шаблонная функция?
0
16079 / 8681 / 2120
Регистрация: 30.01.2014
Сообщений: 14,960
06.12.2019, 11:58 7
Лучший ответ Сообщение было отмечено _NeznaIka_ как решение

Решение

Это еще полбеды. У вас совершенно нет способа отличить числа с плавающей точкой от целых.
Без маркеров типов эту задачу с использованием сишного подхода не решить. Никак.
Любые варианты без них будут профанацией. например можно оговорить, что вводим только целые или только дробные всегда. И не вводим чисел 42, 43, 45 и 47. По мне лучше вообще никакого решения, чем такое

Добавлено через 14 минут
Цитата Сообщение от _NeznaIka_ Посмотреть сообщение
На примере любой функции можете показать?
Могу, даже на примере вашей задачи.
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
#include <iostream>
#include <stdexcept>
 
template <typename A1>
A1 operation(A1 a1)
{
    return a1;
}
template <typename A1, typename A2, typename ...Args>
auto operation(A1 a1, char op, A2 a2, Args ... other)
{
    switch(op)
    {
    case '*':
        return operation(a1 * a2, other...);
    case '+':
        return operation(a1 + a2, other...);
    case '/':
        return operation(a1 / a2, other...);
    case '-':
        return operation(a1 - a2, other...);
    default:
        throw std::logic_error("unknown operation");
    }
}
 
template <typename ...Args>
auto compute(Args... args)
{
    return operation(args...);
}
 
int main()
{
    std::cout << compute(2, '+', 2, '/', 3.0, '*', 16);
}
Добавлено через 4 минуты
В коде выше математический приоритет операций не учитывается. Вычислению идут просто по порядку.
1
3535 / 2096 / 388
Регистрация: 09.09.2017
Сообщений: 8,618
06.12.2019, 12:06 8
Сама постановка задачи довольно странная. Если функция известна на этапе компиляции, так пусть компилятор и считает. А если нет, то ее в любом случае надо строкой передавать вперемешку со всеми аргументами.
0
8 / 6 / 3
Регистрация: 14.04.2019
Сообщений: 71
06.12.2019, 12:10  [ТС] 9
Цитата Сообщение от DrOffset Посмотреть сообщение
Могу, даже на примере вашей задачи.
Спасибо, осталось только разобраться в коде и сделать приоритет операций. Лучший ответ ваш)

Добавлено через 3 минуты
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Сама постановка задачи довольно странная. Если функция известна на этапе компиляции, так пусть компилятор и считает. А если нет, то ее в любом случае надо строкой передавать вперемешку со всеми аргументами.
Ну вот так нас обучают на практике 3-го курса. Задание это на 5-ку
0
16079 / 8681 / 2120
Регистрация: 30.01.2014
Сообщений: 14,960
06.12.2019, 12:14 10
Цитата Сообщение от _NeznaIka_ Посмотреть сообщение
сделать приоритет операций.
Чтобы это сделать, нужно строить автомат.
Возможно вам поможет это.
Хотя если вам дали такое задание, то теоретические основы должны были и так объяснить.
0
8 / 6 / 3
Регистрация: 14.04.2019
Сообщений: 71
06.12.2019, 12:28  [ТС] 11
Цитата Сообщение от DrOffset Посмотреть сообщение
Хотя если вам дали такое задание, то теоретические основы должны были и так объяснить.
Стек мы прошли только поверхность. А задания у нас эти вроде как с университета. Сам то в коледже учусь.
0
16079 / 8681 / 2120
Регистрация: 30.01.2014
Сообщений: 14,960
06.12.2019, 13:22 12
_NeznaIka_, Алгоритм сортировочной станции, изучайте.

Добавлено через 23 минуты
_NeznaIka_,
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <stdexcept>
 
 
template <typename A1>
A1 operation(A1 a1)
{
    return a1;
}
template <typename A1, typename A2, typename ...Args>
auto operation(A1 a1, char op, A2 a2, Args ... other)
{
    switch(op)
    {
    case '*':
        return operation(a1 * a2, other...);
    case '+':
        return a1 + operation(a2, other...);
    case '/':
        return operation(a1 / a2, other...);
    case '-':
        return a1 - operation(a2, other...);
    default:
        throw std::logic_error("unknown operation");
    }
}
 
template <typename ...Args>
auto compute(Args... args)
{
    return operation(args...);
}
 
int main()
{
    std::cout << compute(2, '+', 2, '/', 3.0, '+', 13, '*', 16, '-', 14);
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.12.2019, 13:22
Помогаю со студенческими работами здесь

Написать функцию с переменным числом параметров
Задание дали такое: Написать функцию с переменным числом параметров, в соответствии с вариантом,...

Массивы в функцию с переменным числом параметров
Как передать некоторое кол-во массивов в функцию с переменным числом параметров и вывести в функции...

Написать функцию с переменным числом параметров
Написать функцию с переменным числом параметров, которая считае значение полинома вида: c0 + c1*x +...

Написать функцию min с переменным числом параметров
Написать функцию min с переменным числом параметров, которая находит минимальное из чисел типа int...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru