2016-01-22 12 views
5

Mam char stand dla operatora, w sumie jest czterech operatorów (+ - * /).konwertuj char do operatora arytmetycznego

jak to zrobiłem:

int Compute(char c, int a, int b) 
{ 
    if(c == '+') 
     return a+b; 
    else if(c == '-')  
     return a-b; 
    else if(c == '*') 
     return a*b; 
    else (c == '/') 
     return a/b; 
} 

Czy istnieje bardziej wygodny sposób to zrobić?

+3

Myślę, że odpowiedź brzmi NIE. – Sahi

+3

co masz na myśli mówiąc "wygodniej"? –

+0

Możliwy duplikat [czy istnieje sposób przekonwertowania operatora jako znaku "+" na rzeczywisty operator dla arytmetycznych?] (Http://stackoverflow.com/questions/19242330/is-there-a-way-i -can-convert-an-operator-as-a-char-to-the-actual-operator) – Henrik

Odpowiedz

4

Można użyć instrukcji switch:

int Compute(char c, int a, int b) 
{ 
    switch (c) { 
    case '+': return a+b; 
    case '-': return a-b; 
    case '*': return a*b; 
    case '/': return a/b; 
    default: throw std::runtime_error("No such operator"); 
    } 
} 
+0

możesz dodać czek na b! = 0 w przypadku podziału –

0

pierwsze składnia

else (a == '/') 
    return a/b; 

jest tak, powinny być

else if (a == '/') 
    return a/b; 

drugie, dany parametr a może jedynie 4 wartości dyskretnych tak dobrą praktyką jest stosowanie wyliczenie, np

enum Operation 
{ 
    kAddition, 
    kSubtraction, 
    kMultiplication, 
    kDivision 
}; 

int Compute(Operation a, int a, int b) 
{ 
    if (a == kAddition) 
     return a+b; 
    else if (a == kSubtraction)  
     return a-b; 
    else if (a == kMultiplication) 
     return a*b; 
    else if (a == kDivision) 
     return a/b; 
} 

co zapewnia, że ​​użytkownik Compute będzie stosować tylko jeden z tych czterech wartości dla funkcjonowania (a) parametru.

Prawdopodobnie nie użyłem najlepszych praktyk w moim przykładzie, więc polecam przeczytać this answer po więcej szczegółów.

Wreszcie można uczynić kod bardziej zwięzłe za pomocą instrukcji switch:

enum Operation 
{ 
    kAddition, 
    kSubtraction, 
    kMultiplication, 
    kDivision 
}; 

int Compute(Operation a, int a, int b) 
{ 
    switch (a) 
    { 
     case kAddition: 
      return a+b; 
     case kSubtraction: 
      return a-b; 
     case kMultiplication: 
      return a*b; 
     case kDivision: 
      return a/b; 
    } 
} 
+0

Tak, masz rację. ale dlaczego jeszcze (a == '/') jest źle? – Superxy

+0

@Superxy Zobacz ten samouczek dla poprawnej składni. http://www.cplusplus.com/doc/tutorial/control/ – Archimaredes

+0

Rozumiem to teraz, dziękuję. – Superxy

0
int ComputeByChar(char a, int c, int b) 
{ 
    switch(a) 
    { 
    case '+': return c+b; 
    case '-': return c-b; 
    case '/': return c/b; 
    case '*': return c*b; 
    default: cout<< "Invalid"; 
     break; 
    } 
    return 0; 
} 
+0

Podczas gdy to może odpowiedzieć na pytanie, lepiej podać kilka wyjaśnień na temat tego, w jaki sposób ten kod pomaga. – vard

Powiązane problemy