Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/34: Рейтинг темы: голосов - 34, средняя оценка - 5.00
24 / 21 / 3
Регистрация: 04.11.2014
Сообщений: 283

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

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

Студворк — интернет-сервис помощи студентам
Собственно вопрос в названии: возможно ли преобразовать строку с оператором в оператор?
C++
1
string s = '+';
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.04.2017, 15:12
Ответы с готовыми решениями:

Найти значение арифметического выражения, заданного в виде строки
Помогите пожалуйста! Ввести с клавиатуры строку, которая содержит арифметическое выражение вида a+b+c.(например 10+2+1). Найти значение...

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

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

10
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
02.04.2017, 15:24
Ну наверное можно, если использовать switch() case; и там по '+' сделать это действие над 2-мя переменными.
0
24 / 21 / 3
Регистрация: 04.11.2014
Сообщений: 283
02.04.2017, 15:25  [ТС]
DemolitionMan, так я тоже придумал, а вот может есть какой-то альтернативный негромоздский способ
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
02.04.2017, 16:08
Ну если if только применить, а как еще-то?
0
24 / 21 / 3
Регистрация: 04.11.2014
Сообщений: 283
02.04.2017, 16:11  [ТС]
DemolitionMan, например есть atoi, которая строку в целое превращает. Я предположил, что есть что-то подобное для моих целей.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
02.04.2017, 16:25
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  [ТС]
GbaLog-, а можно парочку комментариев по выполнению кода?

Добавлено через 2 минуты
GbaLog-, и будет ли тот код работать под 14 стандартом?
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
02.04.2017, 16:51
Лучший ответ Сообщение было отмечено ЗеХель как решение

Решение

Цитата Сообщение от ЗеХель Посмотреть сообщение
можно парочку комментариев по выполнению кода?
Цитата Сообщение от ЗеХель Посмотреть сообщение
парочку комментариев
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  [ТС]
GbaLog-, благодпрю. А слэши в 9-11 строке, это для конкатенации строк?
0
Падаван С++
 Аватар для obivan
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
02.04.2017, 17:22
можно еще как нибудь так, но это не точно
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
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
02.04.2017, 17:24
Цитата Сообщение от ЗеХель Посмотреть сообщение
А слэши в 9-11 строке, это для конкатенации строк?
да.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.04.2017, 17:24
Помогаю со студенческими работами здесь

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

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

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

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

Вычисление значения выражения, заданного в виде строки
Ребята, подскажите, пожалуйста. Как можно решить допустим такой пример в строке? string a:='2*8-3';


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru