@michadimin

Существует ли способ принять и автоматически подставить знак операции с числами в C++?

Знаете ведь есть эти простецкие калькуляторы с выбором действия через switch-case, которые обычно используются в качестве задач при изучении основ? Представим, что такой калькулятор поместили в функцию, которая принимает параметры: int num1, int num2, операция(например +).

Так вот мне стало интересно: возможно ли передать в функцию(хоть каким-то) способом непосредственно сам знак?
Чтобы потом можно было обойтись парой строчек кода, вместо switch-case.

Для понимания того, что я конкретно хочу:

Вот стандартного рода базовый калькулятор
int main(){
    int a = 0;
    int b = 0;
    char operation;
    std::cout << "Enter first number: ";
    std::cin >> a;
    std::cout << "Enter second number: ";
    std::cin >> b;
    std::cout << "Enter operation: ";
    std::cin >> operation;
 
    switch (operation){
    case '-':
        std::cout << "a - b = " << a - b <<'\n';
        break;
    case '+':
        std::cout << "a + b = " << a + b << '\n';
        break;
    case '*':
        std::cout << "a * b = " << a * b << '\n';
        break;
    case '/':
        std::cout << "a / b = " << a / b << '\n';
        break;
    default:
        std::cout << "Error\n";
    }
    return 0;
}


А мне бы хотел привести его к примерно такому:
int calculate(int a, int b, ??? operation) {
    cout << a operation b << endl;
}

int main() {
    std::cout << "Enter first number: ";
    std::cin >> a;
    std::cout << "Enter second number: ";
    std::cin >> b;
    std::cout << "Enter operation: ";
    std::cin >> operation;

    calculate(a, b, operation)

    return 0;
}

Надеюсь, что я смог донести свою мысль.
  • Вопрос задан
  • 279 просмотров
Пригласить эксперта
Ответы на вопрос 6
GavriKos
@GavriKos
В плюсах такого нет напрямую.
Но есть обходные пути. Самый простой - делаешь функции сложения, вычитания, деления, умножения и т.д. Дальше делаешь словарь (что там вместо него в плюсах? map вроде), ключ - ну пусть будет символ, значение - указатель на функцию.
И в своей функции ты по символу достаешь указатель на функцию и вызываешь ее с нужными аргументами.

Результат - свич-кейса нет.
Ответ написан
Комментировать
@McBernar
Но ведь в плюсах есть перегрузка операторов.
Вы можете перегрузить +- с вашим классом с матрицами. Чтобы получилось mat3 = mat1+ mat2
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Тут надо смотреть какие цели этой лабораторной работы. Если цель - учиться С++ - то такое решение как автор написал - вполне себе прокатит. Изучаем switch-case.

Если цель - парсеры, то решением будет разработка парсера математических выражений (ПОЛИЗ до кучи).

Если цель - интеграция - то можно просто из С++ вызать любой трансируемый язык (тот-же Perl или Python) и просто в комнадной строке передать ему выражение и получить готовый ответ.

Если цель - ООП с полиморфизмом - то можно просто развить пункт №2 придав ему красивый вид. Типа Базовый класс - BinaryOp. От него наследники Mul/Sum/Div/Minus.

Короче все эти решения будут правильными. Они все решают задачу но по разному.

В разной тык-скыть прадигме.
Ответ написан
Комментировать
@12rbah
Существует, не в таком виде как у вас, но в довольно близком. Ключевые слова ast и calculator вот пример, если кратко то на вход подается строка, которая парсится и операции выполняются в порядке очередности.
возможно ли передать в функцию(хоть каким-то) способом непосредственно сам знак?
Сам знак передать нельзя.
Чтобы потом можно было обойтись парой строчек кода, вместо switch-case.
Ну можно создать функцию и в неё передавать два числа и строку/число которые будут выбирать действие в зависимости от знака
Ответ написан
saboteur_kiev
@saboteur_kiev Куратор тега C++
software engineer
в баш легко. там eval есть
в python может тоже есть какая-то либа математическая, которая умеет в.
Ответ написан
Griboks
@Griboks
Это называется интерпретацией, а плюсы - компилируемый язык. Либо используйте другой язык, либо компилируйте находу.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы