2016-03-22 2 views
1

Я пытаюсь закодировать постфиксный калькулятор, но я продолжаю сталкиваться с двумя проблемами: first: Когда калькулятор сталкивается с пробелом, он просто просто выходит сразу секунд: когда он сталкивается с неоператором/non digit (ie-z), он не отображает сообщение об ошибке, которое я закодировал.Postfix Notation Calculator

int main() 
{ 

stack <int> calcStack; 
string exp; 
char ans; 
cout << "\nDo you want to use the calculator?" << endl; 
cin >> ans; 
while (ans == 'y') 
{ 
    cout << "\nEnter your exp" << endl; 
    cin >> exp; 
    for (int i = 0; i < exp.size(); i++) 
    { 
     if (isspace(exp[i])) 
     { 

     } 
     else if (isdigit(exp[i])) 
     { 
      int num = exp[i] - '0'; 
      calcStack.push(num); 
     } 
     else 
      doOp(exp[i], calcStack); 
    } 

    while (!calcStack.empty()) 
    { 
     calcStack.pop(); 
    } 

    cout << "\nDo you want to use the calculator again?" << endl; 
    cin >> ans; 
} 

system("pause"); 
return 0; 
} 

Это function--

void doOp(const char & e, stack <int>& myS) 
{ 

if (myS.size() == 2) 
{ 
    int num1, num2, answ; 
    num2 = myS.top(); 
    myS.pop(); 
    num1 = myS.top(); 
    myS.pop(); 
    if (e == '+') 
     answ = num1 + num2; 
    else if (e == '-') 
     answ = num1 - num2; 
    else if (e == '*') 
     answ = num1 * num2; 
    else if (e == '/') 
     answ = num1/num2; 
    else if (e == '%') 
     answ = num1 % num2; 
    else 
     cout << "\nError- Invalid operator" << endl; 

    cout << "\nCalculating..." << endl << answ << endl; 
    myS.push(answ); 
} 
else 
    cout << "\nInvalid stack size- too few, or too many" << endl; 
} 
+0

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

+0

Имейте в виду, что когда вы читаете данные из '' cin'' в '' std: string'', пространство рассматривается как разделение между двумя значениями. См. Http://stackoverflow.com/questions/5838711/c-cin-input-with-spaces – BrainStone

+0

. Это вызывает проблему пространства - 37 * 9 - так что 3 * 7 будет работать, но не -9. Также, если я попытаюсь сказать 37 * n +, вместо того, чтобы сообщать мне недействительное выражение, он говорит о недопустимом размере. –

ответ

0

В вашей основной цикл, вы читаете строки со строкой экстрактор:

cin >> exp; 

Строка экстрактор чуток пространство. Итак, как только на входе встречается пробел, чтение строки останавливается, а пространство wites не включено в exp.

Если вы хотите, чтобы получить полную строку, включая пробелы, вы должны выбрать:

getline (cin, exp); 

Edit:

вопрос вы испытываете с getline() является realted для извлечения полукокса, когда вы спрашиваете если пользователь хочет использовать калькулятор. Ввод y недостаточен. Итак, вы введете yвведите. Только y будет помещен в ans, так что getline() начнет читать пустую строку.

Чтобы решить эту проблему, обновите ваш первоначальный ввод:

cin >> ans;     // as before 
    cin.ignore (INT_MAX, '\n'); // add this to skip everything until newline included 

Здесь online demo, показывая, что он работает (в том числе сообщения об ошибке в случае неправильного оператора)

+0

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

+0

Не могли бы вы предоставить выражение, которое вы разберете? – Christophe

+0

с использованием getline (cin, exp) Я не могу ввести выражение. На выходе написано: пожалуйста, введите выражение: тогда он спрашивает у пользователя, хотят ли они использовать калькулятор –

Смежные вопросы