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

Soyez le premier à donner votre avis sur cette source.

Vue 4 694 fois - Téléchargée 134 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

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
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
259
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)