2017-05-06 1 views
1

Je crée une calculatrice de terminal simple mais pour une raison quelconque, une fonction ne s'exécute pas dans une boucle while mais s'exécute en dehors de la boucle.La fonction n'exécute pas la boucle interne

Compte tenu de cette entrée: ((1 + 2) + (3 + 4))

Il devrait afficher: 10

Mais se coince dans une boucle infinie, car elle ne remplace pas les expressions les plus intimes avec leur résultat.

La fonction qui n'exécute pas est s.replace(basicOp, answer);

Voici un extrait du problème:

public static function processInput(s:String):String 
{ 
    var result:Null<Float> = parseNumber(s); 

    if (result != null) 
    { 
     return Std.string(result); 
    } 

    var closeParPos:Int = 0; 
    var openParPos:Int = 0; 
    var basicOp:String; 
    var answer:String = ""; 

// ERROR HERE 
    while (Std.string(answer) != s) 
    { 
     closeParPos = s.indexOf(")"); 
     openParPos = s.lastIndexOf("(", closeParPos); 

     basicOp = s.substring(openParPos, closeParPos + 1); 

     answer = processBasicOp(basicOp); 
// This isn't executed 
     s.replace(basicOp, answer); 

     trace("Input: " + s + " basicOp: " + basicOp + " Answer: " + answer); 
    } 

    return (result == null)? "": Std.string(result); 
} 

Tout le code est here il suffit d'exécuter make test

La syntaxe d'entrée est: ([number] [operator] [number]) ou ([operator] [number])
Il doit y avoir un seul espace entre le nombre et les opérateurs.
Il ne devrait pas y avoir d'espace entre les chiffres et les parenthèses

Opérations prises en charge:

+-/*
% (reste),
div (quotient),
sqr (carré),
sqroot (racine carrée),
sincostan (en degrés, mis sur écoute)
fact (factoriel)

Il est pas encore terminée, il peut y avoir d'autres problèmes, mais ce problème me empêche d'avancer.

Quelqu'un peut-il m'aider à trouver la solution?

Merci.

+0

J'ai créé une bibliothèque haxe pour cette (https://github.com/markknol/hx-mathparser) mais qui ne supporte que les groupes et +, -,/et *. Peut-être que vous pouvez y jeter un coup d'œil. Si vous avez besoin d'un analyseur haxe plus avancé, vous pouvez jeter un oeil à hscript (https://github.com/HaxeFoundation/hscript), qui peut exécuter plusieurs types de code Haxe. –

+0

@ MarkKnol Je vais vérifier votre bibliothèque quand je peux, merci pour les conseils. –

Répondre

3

Je ne peux pas vraiment l'exécuter, mais StringTools.replace() ne modifie pas la chaîne sur place.

Essayez de changer s.replace(basicOp, answer); à s = s.replace(basicOp, answer);

+0

Peut-être que cela ne fonctionne pas parce que je voulais dire "make test" mais écrit "make run", désolé pour cela. Cela a résolu, je devais juste attribuer le résultat, merci. –