Evaluation numérique notation infixe en passant par notation polonaise inversée

0/5 (2 avis)

Vue 5 973 fois - Téléchargée 177 fois

Description

Une classe pour convertir une notation infixe vers une notation polonaise inversée.
On passe d'un String vers une Stack<String>

Une autre classe pour évaluer la pile en NPI.
On passe d'une Stack<String> vers un float.

Ces deux classes gèrent la priorité d'opérations ainsi que les opérateurs (+, -, /, *) mais ne gèrent pas les parenthèses.

Source / Exemple :


NPI test = new NPI();
Stack<String> npi = new Stack<String>();
float t0 = (float) 5 * 6 * 7 - 2 / 5f * 6 * 5 + 1;

npi.push("5");
npi.push("6");
npi.push("*");
npi.push("7");
npi.push("*");
npi.push("2");
npi.push("5");
npi.push("/");
npi.push("6");
npi.push("*");
npi.push("5");
npi.push("*");
npi.push("-");
npi.push("1");
npi.push("+");

System.out.println("Calcul Réel : 5*6*7-2/5f*6*5+1");
System.out.println("Pile NPI : " + npi.toString());
System.out.println("Résultat NPI : " + test.go(npi));
System.out.println("Résultat Réel : " + t0 + "\n");

float t1 = (float) 11 * 54 / 85 + 5 - 4 - 5 + 2 * 5 * 5 / 5;
CNpi t2 = new CNpi("11*54/85+5-4-5+2*5*5/5");

t2.splitFirstCalcul();
t2.splitSecondCalcul();

System.out.println("Calcul Réel : " + t2.getCalcul());
System.out.println("Pile NPI : " + t2.getNpi());
System.out.println("Résultat NPI : " + test.go(t2.getStackNpi()));
System.out.println("Résultat Réel : " + t1);

Codes Sources

A voir également

Ajouter un commentaire Commentaires
cs_lumii Messages postés 1 Date d'inscription vendredi 21 mai 2010 Statut Membre Dernière intervention 24 mai 2010
24 mai 2010 à 16:09
Code très pratique mais j'y ai relevé quelques erreurs dans la classe CNpi :
ligne 113 : "for ( int j = 0; j < sscm.length; j++ )"
à remplacer par : "for ( int j = 0; j < sscd.length; j++ )"
sinon les divisions ne sont pas prises mises dans la pile (correction à vérifier, je ne suis pas expert).

et un autre problème dans la classe CNpi : 8-3 donne :
[8]
[+]
[3]
[-]
dans la pile, la classe Npi plante donc sur le "+" vu qu'elle n'a pas 2 opérandes à additionner.
Correctif : classe Npi ligne 67
Remplacer : "operateur(s.charAt(0));"
Par : if (i!=1) {
operateur(s.charAt(0));
}

Tout ça est a vérifier mais tout marche correctement dans mon appli depuis que j'ai effectué ces modifications.
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 369
13 avril 2010 à 07:17
Bien que ce code soit assez simple (deux classes, et calcul connu), il demeure néanmoins très difficile à comprendre. Il manque de commentaires (le cadre de javadoc serait suffisant) et tes noms de variables ne sont pas explicites.

Je ne note pas.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (floww14)