OVH Cloud OVH Cloud

calculatrice polonaise

6 réponses
Avatar
Régnié Benoît
bonjour à tous,

Je dois réaliser une calculatrice polonaise en notation inverse.

Et je ne comprends pas bien le fonctionement de la classe stack.

Quelqu'un peut-il m'aider ?

merci d'avance .

Cordialemnt.

6 réponses

Avatar
Trognon Patrice
Régnié Benoît wrote:

bonjour à tous,

Je dois réaliser une calculatrice polonaise en notation inverse.

Et je ne comprends pas bien le fonctionement de la classe stack.

Quelqu'un peut-il m'aider ?

merci d'avance .

Cordialemnt.


Bonjour,

Excellent exercice de style :)

Le principe de la notation polonaise inverse permet de resourdre
simplement le problème de parse d'une expression mathématique
en informatique, explication.

En fait, sur une calculatrice classique si tu veux faire
l'operation 2 + 3 tu vas faire :
2
+
3
et la machine va t'afficher le résultat.

En polonaise inverse tu places d'abord les données en pile
pour ensuite leur appliquer un operateur, par exemple l'operateur +
porte sur 2 données en entrées, tu vas donc faire :
2
3
+
et ca va t'afficher le resultat.

Imaginons maintenant un expression avec un niveau de parenthèses :
(2 + 3) * 2
sur une calculatrice classique tu vas devoir gerer l'ordre des
parenthèses, ce qui peut devenir assez galere, en polonaise inverse
cela donne ca :

2
3
+

A l'issue de cette commande la machine place
le resultat dans la pile, donc 5, il te reste
donc a entrer la seconde données et l'operateur
2
*
resultat : 10

Suis je clair ?

Cordialement,

Patrice.
http://www.javadevel.com

Avatar
Régnié Benoît
"Trognon Patrice" a écrit dans le message de
news: 4172646b$0$7218$
Régnié Benoît wrote:

bonjour à tous,

Je dois réaliser une calculatrice polonaise en notation inverse.

Et je ne comprends pas bien le fonctionement de la classe stack.

Quelqu'un peut-il m'aider ?

merci d'avance .

Cordialemnt.


Bonjour,

Excellent exercice de style :)

Le principe de la notation polonaise inverse permet de resourdre
simplement le problème de parse d'une expression mathématique
en informatique, explication.

En fait, sur une calculatrice classique si tu veux faire
l'operation 2 + 3 tu vas faire :
2
+
3
et la machine va t'afficher le résultat.


En polonaise inverse tu places d'abord les données en pile
pour ensuite leur appliquer un operateur, par exemple l'operateur +
porte sur 2 données en entrées, tu vas donc faire :
2
3
+
et ca va t'afficher le resultat.

Imaginons maintenant un expression avec un niveau de parenthèses :
(2 + 3) * 2
sur une calculatrice classique tu vas devoir gerer l'ordre des
parenthèses, ce qui peut devenir assez galere, en polonaise inverse
cela donne ca :

2
3
+

A l'issue de cette commande la machine place
le resultat dans la pile, donc 5, il te reste
donc a entrer la seconde données et l'operateur
2
*
resultat : 10

Suis je clair ?

Cordialement,

Patrice.
http://www.javadevel.com



Je te remercie pour ta réponse qui m'éclaire d'avantage sur le sujet.

Cependant, je n'arrive pas à le formuler par l'intermédiaire de la classe
stack

j'ai un ebauche de code.Mais ca ne fonctionne pas


import java.util.Stack;
import java.io.*;

public class Calculatrice
{

private static Stack pile;
private static Double numToPush, numOfPop;
private static char operateur;
private double num1, num2;

public Calculatrice()
{
}
public static void main(String Argv[])
{
for(int i = 0 ; i < Argv.length ; i++)
{
try
{
numToPush = Double.parseDouble(Argv[i]);
pile.push(numToPush);
}
catch(NumberFormatException e)
{
//operateur = (char) Argv[i];
switch(operator)
{
case '+' : Addition();break;
case '-' : Soustraction();break;
case '*' : Multiplication();break;
case '/' : Division();break;
default : System.out.println("Erreur dans la syntaxe des opérateurs");
exit(1);
}
}
}
}
private void PileVide()
{
if(pile.empty())
{
System.out.println("Erreur Pile Vide");
exit(0);
}
}
private void Addition()
{
PileVide();
numOfPop = pile.pop();
num1 = (Double) numOfPop.doubleValue();

PileVide();
numOfPop = pile.pop();
num2 = (Double) numOfPop.doubleValue();

num1 =+ num2;
numToPush.Double(num1);
pile.push(numToPush);
}
private void Soustraction()
{
PileVide();
numOfPop = pile.pop();
num1 = (Double) numOfPop.doubleValue();

PileVide();
numOfPop = pile.pop();
num2 = (Double) numOfPop.doubleValue();

num1 =- num2;
numToPush.Double(num1);
pile.push(numToPush);
}
private void Multiplication()
{
PileVide();
numOfPop = pile.pop();
num1 = (Double) numOfPop.doubleValue();

PileVide();
numOfPop = pile.pop();
num2 = (Double) numOfPop.doubleValue();

num1 = num1 * num2;
numToPush.Double(num1);
pile.push(numToPush);
}
private void Division()
{
PileVide();
numOfPop = pile.pop();
num1 = (Double) numOfPop.doubleValue();

PileVide();
numOfPop = pile.pop();
num2 = (Double) numOfPop.doubleValue();

num1 = num1 / num2;
numToPush.Double(num1);
pile.push(numToPush);


Et encore merci pour ton aide.


Avatar
Thomas Nguyen
On Sun, 17 Oct 2004 14:37:05 +0200, Régnié Benoît wrote:
Cependant, je n'arrive pas à le formuler par l'intermédiaire de la classe
stack

j'ai un ebauche de code.Mais ca ne fonctionne pas


import java.util.Stack;
import java.io.*;
(...)


J'ai jeté un oeil au code, et sans vouloir te vexer, c'est bourré de
fautes.
Des conseils en vrac:

1) ne pas s'encombrer de choses inutiles:
- import java.io.* ne sert strictement à rien.
- PileVide() aussi. L'intention est bonne, mais on fait pas comme ça en
Java.

2) ne pas déclarer trop de variables membres. Tu as uniquement besoin de
ta pile, rien d'autre. Les autres variables, tu pourra les déclarer à la
volée, là où tu as besoin.

3) apprendre la différence entre double et Double. La majuscule est
importante. Le premier (avec la minuscule) est un type primitif, alors que
le second (avec la majuscule) est un objet. Des conversions entre les deux
sont possibles, mais jamais automatiques.

4) Par convention, en Java, les noms de méthodes et des variables
commencent par une minuscules. (c'est un détail, mais nous autres
javateux, on arrive mieux à lire un code qui suit les conventions)

5) la ligne "//operateur = (char) Argv[i];" ne marche pas parce que
Argv[i] est du type String, et tu ne peux pas le caster en char. Utilise
plutot les comparaisons de String: "+".equals(Argv[i])
Tu devra remplacer ton switch par une suite de else if, mais c'est plus simple.

6) les lignes "numToPush.Double(num1);" ne marchent pas parce c'est
pas comme ça qu'on instancie un nouvel objet.
Ce que tu veux écrire, c'est "numToPush = new Double(num1);"

7) mon avis serait de commencer super simple, et se contenter de
l'addition. Une fois que ça marchera, tu aura tout le temps pour ajouter
les autres opérateurs.



Au niveau de l'algorithmie, tu as saisi le concept, mais tu as encore
beaucoup de réflexes de programmeur C. Résoud les problèmes de
compilation, le reste viendra tout seul.

Je pourrais te donner la solution complète, mais je pense pas que ça
soit ce que tu cherches. En suivant mes conseils, et avec un peu de
travail, ça devrait au moins compiler.

Pour les autres problèmes (et la gestion des erreurs en particulier), on
verra plus tard.

Avatar
vc.spam
Bonjour,

Je suis bien de l'avis de Thomas, tu as besoin de comprendre les
bases... Actuellement tu n'as pas un problème avec la classe Stack
mais avec Java ;-)
Effectivement il faut d'abord que ton programme compile, et,
actuellement ça n'est pas le cas. Quand il compilera. Tu pourras le
faire marcher.

QQ précisions sur les points évoqués par Thomas:

1> import java.io.*; c'est l'équivalent de #include <stdio.h> c'est
souvent nécéssaire, mais pas toujours... Certains profs on tendance à
faire inclure systématiquement io et util, mais ça ne sert à rien...

3> Si tu es en java 1.5 je te conseil de revenir à une version
précédente. Java 1.5 support l'auto boxing/unboxing qui permet les
convertion implicites entre types primitifs et leurs équivalents
objets (double <--> Double, notamment), mais pour le débutant c'est
TRES TRES traitre...

5> En java les char et les String n'ont rien à voir sur le plan
physique. Il faut se dire que si char est un peu l'équivalent de
celui de C, String n'a rien à voir avec un char * ou un char[], c'est
plutôt du CString...

Pour le débutant, l'écriture "+".equals(Argv[i]) est un peu troublante
en fait c'est très proche de Argv[i].equals("+") qui est plus
compréhensible (au passage ça n'est pas du tout équivalent à Argv[i]
== "+" qui, en gros, compare les adresses et pas les contenus). Très
proche seulement, car, si (Argv[i] == null) la première écriture
renvoie false, tandis que la seconde génère une NullPointerException,
vu que ça revient à écrire null.equals("+")... Mais dans ton cas, a
priori, il n'y a pas d'élément null dans argv...

C'est donc l'écriture de Thomas, plus "bizarre" qui est la bonne. Il
faut donc prendre l'habitude de l'utiliser... Pour bien comprendre que
"+" se comporte comme (new String("+"))...

Voilà, je te recommande Java Efficace (Vuibert) pas cher et très bon
pour comprendre les subtilités de Java, en particulié tout ce qui le
rend différent de C++...

A+

Vincent



Thomas Nguyen wrote in message news:...
On Sun, 17 Oct 2004 14:37:05 +0200, Régnié Benoît wrote:
Cependant, je n'arrive pas à le formuler par l'intermédiaire de la classe
stack

j'ai un ebauche de code.Mais ca ne fonctionne pas


import java.util.Stack;
import java.io.*;
(...)


J'ai jeté un oeil au code, et sans vouloir te vexer, c'est bourré de
fautes.
Des conseils en vrac:

1) ne pas s'encombrer de choses inutiles:
- import java.io.* ne sert strictement à rien.
- PileVide() aussi. L'intention est bonne, mais on fait pas comme ça en
Java.

2) ne pas déclarer trop de variables membres. Tu as uniquement besoin de
ta pile, rien d'autre. Les autres variables, tu pourra les déclarer à la
volée, là où tu as besoin.

3) apprendre la différence entre double et Double. La majuscule est
importante. Le premier (avec la minuscule) est un type primitif, alors que
le second (avec la majuscule) est un objet. Des conversions entre les deux
sont possibles, mais jamais automatiques.

4) Par convention, en Java, les noms de méthodes et des variables
commencent par une minuscules. (c'est un détail, mais nous autres
javateux, on arrive mieux à lire un code qui suit les conventions)

5) la ligne "//operateur = (char) Argv[i];" ne marche pas parce que
Argv[i] est du type String, et tu ne peux pas le caster en char. Utilise
plutot les comparaisons de String: "+".equals(Argv[i])
Tu devra remplacer ton switch par une suite de else if, mais c'est plus simple.

6) les lignes "numToPush.Double(num1);" ne marchent pas parce c'est
pas comme ça qu'on instancie un nouvel objet.
Ce que tu veux écrire, c'est "numToPush = new Double(num1);"

7) mon avis serait de commencer super simple, et se contenter de
l'addition. Une fois que ça marchera, tu aura tout le temps pour ajouter
les autres opérateurs.



Au niveau de l'algorithmie, tu as saisi le concept, mais tu as encore
beaucoup de réflexes de programmeur C. Résoud les problèmes de
compilation, le reste viendra tout seul.

Je pourrais te donner la solution complète, mais je pense pas que ça
soit ce que tu cherches. En suivant mes conseils, et avec un peu de
travail, ça devrait au moins compiler.

Pour les autres problèmes (et la gestion des erreurs en particulier), on
verra plus tard.



Avatar
Régnié Benoît
bonsoir,

merci à tous pour votre aide. Je vais tacher de la faire fonctionner.


Merci pour tous.
Avatar
vc.spam
"Régnié Benoît" wrote in message news:<41740816$0$28165$...
bonsoir,

merci à tous pour votre aide. Je vais tacher de la faire fonctionner.


Merci pour tous.


De rien, si tu as un problème, n'hésites pas...