D'abord, il aide à déplacer ces if
s comme celui-ci
userInput[i] != '+' || userInput[i] != '-' || userInput[i] != '*' || userInput[i] != '/' || userInput[i] != '^' || userInput[i] != ' ' && i < userInput.length()
dans sa propre fonction , juste pour la clarté.
bool isOperator(char c){
return c == '+' || c == '-' || c == '*' || c == '/' || c == '^';
}
De plus, pas besoin de vérifier qu'il n'y a pas opérateur, juste vérifier que l'entrée est un numéro:
bool isNum(char c){
return '0' <= c && c <= '9';
}
Une autre chose, avec la longue chaîne au-dessus, tu as le problème que vous saisissez également le bloc tempNumber += ...
si le caractère en entrée est anyhing autre que '+'
. Vous devez vérifier avec &&
, ou mieux avec la fonction ci-dessus:
if (isNum(userInput[iterator])){
tempNumber += userInput[iterator];
}
Cela règle également toute entrée non valide comme b
, X
et les goûts.
Ensuite, pour votre problème avec des nombres à deux chiffres:
Le problème est que vous toujours entrée un espace après l'insertion du tempNumber
. Vous n'avez besoin de le faire que si la séquence de chiffres est terminée.Pour résoudre ce problème, il suffit de modifier la fin de votre longue chaîne 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 << ' ';
}
}
Cela devrait faire le travail de donner la représentation correcte de 56 + 78 --> 56 78 +
. S'il vous plaît dites-moi s'il y a quelque chose qui ne va pas. :)
Pas entièrement lié à votre problème mais de toute façon: Le commutateur et les instructions if donneront le même code machine sur la plupart des compilateurs après l'optimisation. Cependant, si votre cascade laisse la valeur de retour potentiellement non initialisée (votre compilateur devrait vous avoir averti à ce sujet) et vous devriez corriger cela (ou utiliser l'instruction switch qui est correcte). En général, j'utiliserais l'instruction switch dans ce cas car je la trouve plus concise mais c'est une question de goût je suppose. – ChrisWue
@ChrisWue Merci pour votre contribution .... vous avez raison, je devrais retourner 0 ou quelque chose si rien d'autre ne se fait toucher. Ouais, en général, je ne savais pas si une déclaration de commutateur est plus rapide ou non, mais je suis d'accord avec vous, les déclarations de commutation semblent plutôt cool haha –