Как я могу выполнить операцию, которая определена в массиве символов? - PullRequest
0 голосов
/ 25 сентября 2019

Я взял массив символов определенных операторов.Каждый раз, когда он получает оператор, я хочу выполнить операцию, используя этот оператор.Как я могу это сделать?

#include<stdio.h>

int main()
{
    char *c = "+-*/" ;
    int a = 10 , b = 5 ;
    for(int i = 0 ; c[i]!='\0';i++){
        int z = a c[i] b ; 
        printf("%d ",z) ; 
    }
}

ожидаемый результат: 15 5 50 2

Ответы [ 3 ]

2 голосов
/ 25 сентября 2019

Самый простой способ - переместить логику в отдельную функцию и переключить символ для выбора действия

#include<stdio.h>

int errCode = -999876; // magic error code exmpl

int useArithm(char c, int a, int b) {
    switch (c) {
        case '+' : {
            return a + b;
        }
        break;
        case '-' : {
            return a - b;
        }
        break;
        case '*' : {
            return a * b;
        }
        break;
        case '/' : {
            if (b == 0) {
                // bed b msg ;)
                return errCode;
            }
            return a / b;
        }
        break;
    }
    return errCode;
}

int main() {
    char *c = "+-*/" ;
    int a = 10 , b = 5 ;
    for (int i = 0; c[i]!='\0'; i++) {
        if (c[i] == '+' || c[i] == '-' || c[i] == '*' || c[i] == '/') {
            int z = useArithm(c[i], a, b); 
            if (z == errCode) {
                // error action
            }
            printf("%d ",z) ; 
        } else {
            // error msg
            break;
        }

    }
   return 0;
}
0 голосов
/ 25 сентября 2019

Ничего не встроено.

Оператор case будет несколько более коротким, чем логика if / else, но не если вы включите операторы break.

Другой вариант будетфункциональная карта.В C ++ что-то вроде (обратите внимание, что это некомпилированный мысленный код):

typedef int (*binop)(int a,int b);
std::map<char, binop> operations
{ { '+', [](int a, int b)->int { return a+b;} },
  { '-', [](int a, int b)->int { return a-b;} }
};

...

auto  op = operations[c[i]];
if (op) return op(a,b);

... or the more devilish:

operations.insert(c[i], [](int a, int b)->int { throw NoOpException();}).first(a,b);

Но реализовать карту и заполнить ее в C и объявить все маленькие рабочие функции было бы так много раздувающего кода!

0 голосов
/ 25 сентября 2019

Что-то вроде этого (в цикле)

if (c[i] == '+' )
{
// do the plus operation.
}
else if ( c[i] == '-') 
{
// do the minus operation.
}
/// ... same thing for the other operations.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...