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

Soyez le premier à donner votre avis sur cette source.

Vue 5 212 fois - Téléchargée 150 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
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.
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
350
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)