calculatrice flottante en java

calculatrice flottante en java - Java - Programmation

Marsh Posté le 30-10-2009 à 15:19:35    

Bonjour,
Je suis nouveau sur ce forum et débutant en programmation java, j'essaye de faire un programme en java mais j'ai un problème.
En fait je voudrais demander deux opérandes à l'utilisateur ainsi que l'opération à effectuer (+ - * /).
La compilation se passe bien mais au moment de rentrer ma première operande, le programme s'arrete et j'ai un message d'erreur qui s'affiche et je ne comprends pas pourquoi.
Le code source de mon programme est le suivant :

 
Code :
  1. /*
  2. * Calculatrice2.java        27/10/2009
  3. * Programme de calcul sur deux opérandes
  4. */
  5.  
  6. // package default
  7. // importation
  8. import java.util.Scanner ;
  9.  
  10. /**
  11. * interaction sur console texte
  12. * operations sur deux opérandes
  13. * @version 1.0
  14. */
  15.  
  16. public class calculatrice2 {
  17.  
  18.    /**
  19.     * E/S sur console avec l'utilisateur
  20.     * addition, soustraction, multiplication, division de deux opérandes
  21.     */
  22.  
  23.    public static void main(String[]args) {
  24.     // examen du tampon d'entree
  25.     Scanner entree = new Scanner(System.in);
  26.     // initialisation des variables
  27.     Float opgauche, opdroit, resultat;
  28.     char operateur;
  29.     String texte;
  30.     // demande à l'utilisateur d'entrer la premiere operande
  31.     System.out.print("Entrez un premier operande :" );
  32.     opgauche = entree.nextFloat();
  33.     // demande à l'utilisateur d'entree l'operateur souhaitée
  34.     System.out.print("Entrez l'operateur souhaitee :" );
  35.     texte = entree.nextLine();
  36.     operateur = texte.charAt(1);
  37.     System.out.print("Entrez un deuxieme operande :" );
  38.     opdroit = entree.nextFloat();
  39.     // calcule et affiche le resultat de l'operation
  40.     if (operateur == '+'){    
  41.         resultat = opgauche+opdroit;
  42.         System.out.print("Le résultat de votre operation est :" +resultat);
  43.     }
  44.     if (operateur == '-'){
  45.         resultat = opgauche-opdroit;
  46.         System.out.print("Le résultat de votre operation est :" +resultat);
  47.     }
  48.     if (operateur=='*'){
  49.         resultat = opgauche*opdroit;
  50.         System.out.print("Le résultat de votre operation est :" +resultat);
  51.     }
  52.     if (operateur == '/'){
  53.         resultat = opgauche/opdroit;
  54.         System.out.print("Le résultat de votre operation est :" +resultat);
  55.     }
  56.    }
  57. }
 

Merci d'avance aux courageux qui lirons et/ou répondrons à mon message  :)


Message édité par Harkonnen le 30-10-2009 à 15:51:02
Reply

Marsh Posté le 30-10-2009 à 15:19:35   

Reply

Marsh Posté le 30-10-2009 à 15:52:36    

1. J'ai édité ton message pour mettre le code entre balises, ce qui le rend plus lisible. Si tu repostes du code, utilise ces balises pour la lisibilité.
 
2. Ca serait bien que tu mettes le message d'erreur stp.


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 30-10-2009 à 15:58:33    

Harkonnen a écrit :

1. J'ai édité ton message pour mettre le code entre balises, ce qui le rend plus lisible. Si tu repostes du code, utilise ces balises pour la lisibilité.
 
2. Ca serait bien que tu mettes le message d'erreur stp.


 
Désolé pour l'oubli, j'y penserai la prochaine fois  :)  
 
Alors le message d'erreur est le suivant :
 
Entrer l'operation souhaitee :Exception in thread "main" java.lang.StringIndexOu
tOfBoundsException: String index out of range: 1
            at java.lang.String.charAt(String.java:686)
            at calculatrice2.main(calculatrice2.java:36)
 
Pourriez vous m'aider ?  :??:

Reply

Marsh Posté le 30-10-2009 à 16:05:07    

En Java (comme dans la majorité des langages), les collections (y compris les strings, qui sont des collections de caractères) sont indexées à 0, non à 1.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 30-10-2009 à 16:08:54    

masklinn a écrit :

En Java (comme dans la majorité des langages), les collections (y compris les strings, qui sont des collections de caractères) sont indexées à 0, non à 1.


 
Merci, donc si je remplace operateur = texte.charAt(1); par operateur = texte.charAt(0); cela devrait marcher normalement ?
Mais je ne comprends pas car je viens de tester et j'ai toujours le même message d'erreur !  :sweat:

Reply

Marsh Posté le 30-10-2009 à 16:11:22    

Essaye plutot de mettre du texte (operande) dans des textes et pas des flotants.

Reply

Marsh Posté le 30-10-2009 à 16:18:54    

fred777888999 a écrit :

Essaye plutot de mettre du texte (operande) dans des textes et pas des flotants.


 
C'est à dire que je dois remplacer Float opgauche, opdroit, resultat; par String opgauche, opdroit, resultat; ? Je viens d'essayer (en remplaçant nextFloat par nextLine également) mais le compilateur me donne 3 erreurs : les operateurs - * / ne peuvent pas être appliqués sur java.lang.String,java.lang.String .   :??:


Message édité par ElFurnytt le 30-10-2009 à 16:19:57
Reply

Marsh Posté le 30-10-2009 à 16:19:31    

ElFurnytt a écrit :

Merci, donc si je remplace operateur = texte.charAt(1); par operateur = texte.charAt(0); cela devrait marcher normalement ?
Mais je ne comprends pas car je viens de tester et j'ai toujours le même message d'erreur !  :sweat:


Personnellement je ne passerais pas par ce genre de trucs de toute façon, j'utiliserais String.trim() et je ferais mon dispatch directement sur texte (renommé operator).
 
Avec les opérations stockées dans une Map pour avoir quelque chose de plus extensible, et probablement pas une query pour chaque opérande et pour l'opération.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 30-10-2009 à 16:22:25    

masklinn a écrit :


Personnellement je ne passerais pas par ce genre de trucs de toute façon, j'utiliserais String.trim() et je ferais mon dispatch directement sur texte (renommé operator).
 
Avec les opérations stockées dans une Map pour avoir quelque chose de plus extensible, et probablement pas une query pour chaque opérande et pour l'opération.


 
Tu as surement raison, le problème c'est que je suis actuellement en première année de DUT informatique et le programme que j'essaye de faire est un exercice et nous n'avons pas vu String.trim() ni ce qu'était une Map, donc je suis coincé.

Reply

Marsh Posté le 30-10-2009 à 16:37:21    

Est ce que quelqu'un aurait une solution à mon problème ?

Reply

Marsh Posté le 30-10-2009 à 16:37:21   

Reply

Marsh Posté le 30-10-2009 à 16:38:21    

ElFurnytt a écrit :


 
Tu as surement raison, le problème c'est que je suis actuellement en première année de DUT informatique et le programme que j'essaye de faire est un exercice et nous n'avons pas vu String.trim() ni ce qu'était une Map, donc je suis coincé.


Et il vous est interdit de réfléchir ou de faire des recherches?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 30-10-2009 à 16:42:11    

masklinn a écrit :


Et il vous est interdit de réfléchir ou de faire des recherches?


 
Ben en fait j'ai un professeur très strict (par exemple interdiction d'utiliser notepad et obligation d'utiliser le bloc note...) et on n'a pas le droit d'utiliser des choses que l'on n'a pas vu en cours !

Message cité 1 fois
Message édité par ElFurnytt le 30-10-2009 à 16:42:34
Reply

Marsh Posté le 30-10-2009 à 16:46:35    

ElFurnytt a écrit :

 

Ben en fait j'ai un professeur très strict (par exemple interdiction d'utiliser notepad et obligation d'utiliser le bloc note...)


 [:lectrodz]

ElFurnytt a écrit :

et on n'a pas le droit d'utiliser des choses que l'on n'a pas vu en cours !


[:pingouino]

 

(sinon, tu devrais je pense aller lire la doc de Scanner, contrairement à ce que tu penses il ne fonctionne pas ligne par ligne)

Message cité 1 fois
Message édité par masklinn le 30-10-2009 à 16:48:50

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 30-10-2009 à 17:01:16    


 

masklinn a écrit :


[:pingouino]
 
(sinon, tu devrais je pense aller lire la doc de Scanner, contrairement à ce que tu penses il ne fonctionne pas ligne par ligne)


 
Ok, merci du conseil. Sinon tu n'as pas d'idée concernant le non fonctionnement de mon programme ?

Message cité 2 fois
Message édité par ElFurnytt le 30-10-2009 à 17:01:33
Reply

Marsh Posté le 30-10-2009 à 17:42:32    

ElFurnytt a écrit :

 

Ok, merci du conseil. Sinon tu n'as pas d'idée concernant le non fonctionnement de mon programme ?


Masklinn t'a aiguillé, c'est pas nextLine() qu'il faut employer à la ligne 35. c'est tout ce que je te dirais, à toi de chercher le reste.

 

edit: et n'oublie pas de mettre l'indice à 0 pour charAt()


Message édité par Harkonnen le 30-10-2009 à 17:43:20

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 30-10-2009 à 17:42:57    

ElFurnytt a écrit :


 
Ok, merci du conseil. Sinon tu n'as pas d'idée concernant le non fonctionnement de mon programme ?


Oui, c'est pour cette raison que je t'ai suggéré d'aller voir comment fonctionne Scanner (tu devrais jouer un peu avec dans des programmes de test séparés afin de bien comprendre comment cette classe se comporte)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 30-10-2009 à 17:52:19    

Merci à vous deux, je vais chercher :)

Reply

Marsh Posté le 30-10-2009 à 18:04:55    

Alors, je pense que j'ai trouvé ; j'ai remplacé -ligne35- nextline() par next() et cela fonctionne correctement.  
Donc si je comprends bien, lorsque j'écris next() cela extrait les caractères jusqu'au prochain séparateur ce qui n'est pas le cas avec nextLine() qui prenait en compte la ligne suivante ce qui me faisait tout planter ?

Message cité 1 fois
Message édité par ElFurnytt le 30-10-2009 à 18:13:18
Reply

Marsh Posté le 30-10-2009 à 18:23:17    

ElFurnytt a écrit :

Alors, je pense que j'ai trouvé ; j'ai remplacé -ligne35- nextline() par next() et cela fonctionne correctement.
Donc si je comprends bien, lorsque j'écris next() cela extrait les caractères jusqu'au prochain séparateur ce qui n'est pas le cas avec nextLine() qui prenait en compte la ligne suivante ce qui me faisait tout planter ?


C'est ça. Dans Scanner, toutes les méthodes type next* (next, nextInt, nextFloat, etc…) te renvoient le token suivant (qui est donc tout le contenu jusqu'au prochain séparateur)*… sauf nextLine qui renvoie le reste de la ligne courante (sans le séparateur de lignes, donc ton nextLine renvoyait une chaîne vide, le restant de la ligne suivant l'entrée de ton opérande gauche).

 

*: sauf si tu utilises un pattern e.g. dans next(), auquel cas ça renvoie conditionnellement le token suivant: uniquement si le token matche le pattern demandé


Message édité par masklinn le 30-10-2009 à 18:23:53

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 30-10-2009 à 18:32:00    

Merci, au moins je m'en souviendrai et cela m'évitera de répéter cette erreur, en tout cas merci beaucoup de votre aide, bonne soirée :)

Reply

Marsh Posté le 31-10-2009 à 08:54:55    

c'est ou le dut que j'y envoie pas mes gamins ?

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed