2011-03-27 5 views
0

Désolé, j'ai réalisé que j'ai mis tout mon code dans cette question. Tout mon code équivaut à la plupart des réponses pour ce problème particulier pour les autres étudiants, ce qui était idiot.C++ Reconnaissance des chiffres à deux chiffres à l'aide de chaînes

est ici l'essentiel de base du problème que je mets:

je devais reconnaître les nombres à un seul chiffre dans une expression mathématique régulière (par exemple 5 + 6), ainsi que deux chiffres (par exemple 56 + 78). Les expressions mathématiques pourraient également être affichées comme 56 + 78 (sans espaces) ou 56 +78 et ainsi de suite.

Le problème réel était que je lisais dans l'expression comme 5 6 + 7 8, peu importe ce que l'entrée était.

Merci et désolé d'avoir supprimé cette question, mais mon but n'est pas de donner des réponses à mes devoirs.

Jesse Smothermon

+0

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

+0

@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 ​​ –

Répondre

1

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. :)

+0

@Xeo Merci pour l'aide. J'utilise simplement votre exemple "isOperator" parce que je dois m'assurer que les variables peuvent être saisies (donc a + b doit encore fonctionner avec un b +). Ayant dit que je reçois un indice hors de portée erreur à ce dernier si déclaration que vous m'avez donné ... Je vais essayer quelques tests avec la longueur, ça me confond toujours. Mais je suis assez sûr que le hors limites est parce que l'instruction if vérifie l'itérateur + 1 (ce qui signifie qu'il manque la première partie de l'instruction). Merci –

+0

@Xeo Okay j'aurais dû faire les tests avant de mettre le dernier commentaire ... désolé haha. itérateur == userInput.length() doit être itérateur == userInput.length() - 1. Cela fonctionne presque mais maintenant si je mets 5 + 6 j'obtiens 5 6 + mais si je mets 5 + 6 je reçois 6 +. de même 56 + 78 devient 578 + alors que 56 + 78 est 56 78 +. Je ne sais pas ce qui s'est passé, ça doit être le test avec l'espace mais ça fonctionnait avant. Merci –

+0

@Jesse: L'erreur est votre propre faute pour remplacer le '' '' avec un ''\ b''. :) Quand il atteint le ''' 'après le' 6' de '56 + 78', il rétrograde de un et supprime le' 6' du flux. Vous devriez simplement ignorer le ''' '. Cela devrait le réparer, si j'ai bien compris le problème. – Xeo

2

Le problème consiste en réalité en deux parties: lexing l'entrée (en tournant la séquence de caractères en une séquence de « jetons ») et l'évaluation de l'expression. Si vous faites ces deux tâches séparément, cela devrait être beaucoup plus facile.

En premier lieu, lu dans l'entrée et le convertir en une séquence de jetons, dans lequel chaque jeton est un opérateur (+, -, etc.) ou un opérande (42, etc.). Puis, effectuez la conversion infix-à-postfix sur cette séquence de jetons. Un type « Token » ne doit pas être quelque chose de fantaisie, il peut être aussi simple que:

struct Token { 
    enum Type { Operand, Operator }; 
    enum OperatorType { Plus, Minus }; 

    Type type_; 
    OperatorType operatorType_; // only valid if type_ == Operator 
    int operand_;    // only valid if type_ == Operand 
}; 
+0

Désolé, je devais aller à la recherche de toutes ces choses haha. Pour moi, les structures sont comme les classes publiques; Enum place des valeurs sur tout dans les accolades? donc l'opérande serait 0 et l'opérateur serait 1. Question finale: cela pousserait-il les nombres ensemble? comme dans "56 + 78" le char 5 et le char 6 seront poussés comme un int "56"? Je suppose que je ne comprends tout simplement pas les trois dernières lignes. Merci pour la réponse rapide –

Questions connexes