24 / 21 / 3
Регистрация: 04.11.2014
Сообщений: 283
1

Вычисление арифметического выражения заданного в виде строки

02.04.2017, 15:12. Показов 6466. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Собственно вопрос в названии: возможно ли преобразовать строку с оператором в оператор?
C++
1
string s = '+';
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.04.2017, 15:12
Ответы с готовыми решениями:

Найти значение арифметического выражения, заданного в виде строки
Помогите пожалуйста! Ввести с клавиатуры строку, которая содержит арифметическое выражение вида...

Вычислить значение арифметического выражения, заданного в виде строки
с клавиатуры вводиться строка типа: "(7+1)*23-1" в одну строку, нужно определить значение...

Вычисление выражения, заданного в виде строки
Здраствуйте всем!Немогу найти решение задачу таковую:Пользователь вписивает пример,уравнение в...

Вычисление арифметического выражения, введённого в виде символьной строки
Напишите программу, которая вычисляет арифметическое выражение, введённое в виде символьной строки....

10
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
02.04.2017, 15:24 2
Ну наверное можно, если использовать switch() case; и там по '+' сделать это действие над 2-мя переменными.
0
24 / 21 / 3
Регистрация: 04.11.2014
Сообщений: 283
02.04.2017, 15:25  [ТС] 3
DemolitionMan, так я тоже придумал, а вот может есть какой-то альтернативный негромоздский способ
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
02.04.2017, 16:08 4
Ну если if только применить, а как еще-то?
0
24 / 21 / 3
Регистрация: 04.11.2014
Сообщений: 283
02.04.2017, 16:11  [ТС] 5
DemolitionMan, например есть atoi, которая строку в целое превращает. Я предположил, что есть что-то подобное для моих целей.
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
02.04.2017, 16:25 6
http://rextester.com/QCGR32974
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
#include <iostream>
#include <map>
#include <functional>
 
namespace detail
{
#define GENERATE_ARITHMETICK(name, op) \
    template<typename T1, typename T2> \
    std::common_type_t<T1, T2> name(const T1 & t1, const T2 & t2) \
    { return t1 op t2; }
 
GENERATE_ARITHMETICK(plus, +)
GENERATE_ARITHMETICK(minus, -)
GENERATE_ARITHMETICK(devide, /)
GENERATE_ARITHMETICK(multiple, *)
    
#undef GENERATE_ARITHMETICK
}
 
template<typename T1, typename T2>
std::common_type_t<T1, T2> operatorDepedencer(const T1 & t1, const T2 & t2, char op)
{
    static std::map<char, std::function<std::common_type_t<T1, T2>(const T1 &, const T2 &)>> funcMap
    {
        { '+', detail::plus<T1, T2> },
        { '-', detail::minus<T1, T2> },
        { '/', detail::devide<T1, T2> },
        { '*', detail::multiple<T1, T2> }
    };
    
    return funcMap[op](t1, t2);
}
 
int main()
{
    std::cout << operatorDepedencer(1, 2, '+') << "\n";
    std::cout << operatorDepedencer(1, 2, '-') << "\n";
    std::cout << operatorDepedencer(1, 2, '*') << "\n";
    std::cout << operatorDepedencer(1, 2., '/') << "\n";
}
1
24 / 21 / 3
Регистрация: 04.11.2014
Сообщений: 283
02.04.2017, 16:42  [ТС] 7
GbaLog-, а можно парочку комментариев по выполнению кода?

Добавлено через 2 минуты
GbaLog-, и будет ли тот код работать под 14 стандартом?
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
02.04.2017, 16:51 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
45
#include <iostream>
#include <map>
#include <functional>
 
namespace detail
{
// обьявляем макрос для генерации функций арифметических преобразований
// в него передаём имя операции и сам оператор
#define GENERATE_ARITHMETICK(name, op) \
    template<typename T1, typename T2> \
    std::common_type_t<T1, T2> name(const T1 & t1, const T2 & t2) \
    { return t1 op t2; }
 
// генерирум 4 основных арифметических операции
GENERATE_ARITHMETICK(plus, +)
GENERATE_ARITHMETICK(minus, -)
GENERATE_ARITHMETICK(devide, /)
GENERATE_ARITHMETICK(multiple, *)
    
// макрос нам больше не нужен, андефаем его
#undef GENERATE_ARITHMETICK
}
 
template<typename T1, typename T2>
std::common_type_t<T1, T2> operatorDepedencer(const T1 & t1, const T2 & t2, char op)
{
    //объявляем статическую мапу для того, чтобы выбирать операцию в зависимости от переданного оператора
    static std::map<char, std::function<std::common_type_t<T1, T2>(const T1 &, const T2 &)>> funcMap
    {
        { '+', detail::plus<T1, T2> },
        { '-', detail::minus<T1, T2> },
        { '/', detail::devide<T1, T2> },
        { '*', detail::multiple<T1, T2> }
    };
    
    return funcMap[op](t1, t2);
}
 
int main()
{
    std::cout << operatorDepedencer(1, 2, '+') << "\n";
    std::cout << operatorDepedencer(1, 2, '-') << "\n";
    std::cout << operatorDepedencer(1, 2, '*') << "\n";
    std::cout << operatorDepedencer(1, 2., '/') << "\n";
}
Цитата Сообщение от ЗеХель Посмотреть сообщение
будет ли тот код работать под 14 стандартом?
будет.
1
24 / 21 / 3
Регистрация: 04.11.2014
Сообщений: 283
02.04.2017, 17:14  [ТС] 9
GbaLog-, благодпрю. А слэши в 9-11 строке, это для конкатенации строк?
0
Падаван С++
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
02.04.2017, 17:22 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
#include <iostream>
 
template <class T> struct PlusPolicy {
    static T action(T first, T second) {
        return first + second;
    }
};
 
template <class T> struct MinusPolicy {
    static T action(T first, T second) {
        return first - second;
    }
};
 
template <class T> struct MultiplyPolicy {
    static T action(T first, T second) {
        return first * second;
    }
};
 
template <class T> struct DevidePolicy {
    static T action(T first, T second) {
        return first / second;
    }
};
 
template<char> struct Action;
 
template<> struct Action<'+'> : public PlusPolicy<int> {};
template<> struct Action<'-'> : public MinusPolicy<int> {};
template<> struct Action<'*'> : public MultiplyPolicy<int> {};
template<> struct Action<'/'> : public DevidePolicy<int> {};
 
int main(int argc, char* arhv[]) {
 
    //OK
    std::cout << Action<'+'>::action(1, 2) << std::endl;
    std::cout << Action<'-'>::action(1, 2) << std::endl;
    std::cout << Action<'*'>::action(1, 2) << std::endl;
    std::cout << Action<'/'>::action(10, 2) << std::endl;
 
    //Compile time error
    std::cout << Action<'&'>::action(1, 2) << std::endl;
 
    std::cin.ignore();
    return EXIT_SUCCESS;
}
Добавлено через 3 минуты
и еще тайпдефнуть
C++
1
2
3
4
typedef Action<'+'> Plus;
typedef Action<'-'> Minus;
typedef Action<'*'> Multiply;
typedef Action<'/'> Devide;
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
02.04.2017, 17:24 11
Цитата Сообщение от ЗеХель Посмотреть сообщение
А слэши в 9-11 строке, это для конкатенации строк?
да.
0
02.04.2017, 17:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.04.2017, 17:24
Помогаю со студенческими работами здесь

Калькулятор: вычисление арифметического выражения, введённого в виде символьной строки
Привет,не понимаю в чём смысл задачи) Питон же сам считает) Напишите программу, которая...

Вычисление выражения, заданного в виде строки
Добрый день. Нужна помощь с задачкой: Дано строку типа &quot;X + Y&quot;, где X и Y - некоторые числа, + -...

Вычисление значения выражения заданного в виде строки
Помогите с программой, нужно:Дона строка которая содержит натуральные числа, знаки четырех...

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


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

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

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