Во-первых, это помогает перевести такие if
как этот
userInput[i] != '+' || userInput[i] != '-' || userInput[i] != '*' || userInput[i] != '/' || userInput[i] != '^' || userInput[i] != ' ' && i < userInput.length()
в свою собственную функцию, просто для ясности.
bool isOperator(char c){
return c == '+' || c == '-' || c == '*' || c == '/' || c == '^';
}
Кроме того, не нужно проверять, что это не оператор, просто проверьте, что вход является числом:
bool isNum(char c){
return '0' <= c && c <= '9';
}
Еще одна вещь, с длинной цепью выше,у вас проблема в том, что вы также войдете в блок tempNumber += ...
, если входной символ anyhing , отличный от '+'
.Вам нужно будет проверить с помощью &&
, или лучше с вышеприведенной функцией:
if (isNum(userInput[iterator])){
tempNumber += userInput[iterator];
}
Это также исключит любой недопустимый ввод, такой как b
, X
и подобные.
Затем, для вашей проблемы с двузначными числами:
Проблема в том, что вы всегда вводите пробел после вставки tempNumber
.Вам нужно сделать это, только если последовательность цифр закончена.Чтобы это исправить, просто измените конец вашей длинной if-else if
цепочки:
// ... operator stuff
} else {
postfixExpression << tempNumber;
// peek if the next character is also a digit, if not insert a space
// also, if the current character is the last in the sequence, there can be no next digit
if (iterator == userInput.lenght()-1 || !isNum(userInput[iterator+1])){
postfixExpression << ' ';
}
}
Это должно сделать работу, чтобы дать правильное представление из 56 + 78 --> 56 78 +
.Пожалуйста, скажите мне, если что-то не так.:)