Exercice Java Openclass

Exercice Java Openclass - Java - Programmation

Marsh Posté le 19-02-2015 à 20:23:59    

Bonjour, j'essaie d'apprendre toute seule les bases de la programmation Java...

 

J'ai donc tenté de réaliser le premier exercice proposé sur le site openclass(http://openclassrooms.com/courses/apprenez-a-programmer-en-java/tp-conversion-celsius-fahrenheit), un programme basique de conversion des Celsius en Fahrenheit et réciproquement...
Seulement mon code ne marche pas, et je ne comprends absolument pas pourquoi.
La conversion  est fausse, et la fin de la boucle me donne une erreur comme quoi" String index out of range: 0"; ce qui n'est d'ailleurs pas étonnant puisqu'il ne me demande pas de rentrer une valeur pour sortie...

 

Je vous copie colle mon code.
Merci beaucoup pour votre patience et avoir pris la peine de me lire,
A bientôt

 
Code :
  1. import java.util.Scanner;
  2. public class essai {
  3. public static void main(String[] args) {
  4.  //début
  5.  char sortie;
  6.  int mode;
  7.  do{
  8.   Scanner sc = new Scanner(System.in);
  9.   do
  10.   {
  11.    System.out.println("1 pour convertir en Farenh, \n2 en Celsius" );
  12.    mode = sc.nextInt();
  13.   }while (mode != 1 && mode !=2);
  14.   System.out.println("temperature?" );
  15.   int t = sc.nextInt();
  16.   double t2;
  17.   if (mode == 1)
  18.   {
  19.    t2 = arrondi((9/5) *t +32,2);
  20.    System.out.println(t + "C correspond à " + t2 +"F" );
  21.   }
  22.   else
  23.   {
  24.    t2 = arrondi(((t-32)*5)/9,2);
  25.    System.out.println(t + "F correspond à " + t2 +"C" );
  26.   }
  27.   System.out.println("encore? O/N" );
  28.   sortie = sc.nextLine().charAt(0);
  29.  }while (sortie == 'O') ;
  30.  System.out.println("bye" );
  31.  // TODO Auto-generated method stub
  32. }
  33. public static double arrondi(double A, int B) {
  34.    return (double) ( (int) (A * Math.pow(10, B) + .5)) / Math.pow(10, B);
  35.  }
  36. }

Message cité 1 fois
Message édité par lululili le 19-02-2015 à 23:21:48
Reply

Marsh Posté le 19-02-2015 à 20:23:59   

Reply

Marsh Posté le 20-02-2015 à 11:11:35    

lululili a écrit :

Bonjour, j'essaie d'apprendre toute seule les bases de la programmation Java...  
 
J'ai donc tenté de réaliser le premier exercice proposé sur le site openclass(http://openclassrooms.com/courses/apprenez-a-programmer-en-java/tp-conversion-celsius-fahrenheit), un programme basique de conversion des Celsius en Fahrenheit et réciproquement...
Seulement mon code ne marche pas, et je ne comprends absolument pas pourquoi.
La conversion  est fausse, et la fin de la boucle me donne une erreur comme quoi" String index out of range: 0"; ce qui n'est d'ailleurs pas étonnant puisqu'il ne me demande pas de rentrer une valeur pour sortie...
 
Je vous copie colle mon code.
Merci beaucoup pour votre patience et avoir pris la peine de me lire,
A bientôt
 

Code :
  1. t2 = arrondi((9/5) *t +32,2);


 
 
voilà une erreur classique que nous avons tous faite un jour.  
 
La fraction (9/5) vaut 1 parce que les calculs se font en entier. Donc tu as t2 = t + 32, ce qui n'est pas exactement le résultat cherché. Pour corriger cela tu peux éventuellement écrire
t2 = (9.0 / 5.0) * t + 32;  et là la fraction vaudra bien les 1.8 cherché. Plus simplement écrit t2= 1.8 * t + 32
 

Code :
  1. sortie = sc.nextLine().charAt(0);



 
as-tu regardé ce que lisait le scanner ? Un peu plus haut tu as entré une valeur numérique suivie d'un "return". La méthode nextInt() a lu les chiffres pour faire un nombre, mais a laissé le "return" dans le flux d'entreé. Maintenant tu appelles la méthode "nextLine()" qui va lire jusqu'à ce qu'elle trouve un return. Comme il y en a déjà un, elle n'a pas besoin d'attendre une entrée de l'utilisateur. Il faut donc que tu arrive à vider le flux avant de lire la réponse O/N de l'utilisateur.
 
Bonne journée

Reply

Marsh Posté le 12-03-2015 à 17:19:49    

Pour arrondir proprement, tu as la méthode Math.round(val) qui fait ça très bien :-)

 

Quand tu te contentes de caster en int, tu prends la partie entière mais tu ne fais pas l'arrondi :
9.8 casté en int, ça fait 9. Alors que Math.round(9.8) va renvoyer 10.


Message édité par Fraisouille le 12-03-2015 à 17:20:05
Reply

Marsh Posté le 16-03-2015 à 12:01:59    

Un énorme merci à vous deux !  
Leonard ton explication était extrêmement claire et grâce à toi j'ai compris les erreurs !  
Fraisouille merci pour cette méthode que je connaissais pas ! Merci encore à vous d'avoir le temps de me lire et de répondre, (surtout que lire du code comme ça ça doit pas être spécialement amusant ^^)
Bonne journée :bounce:

Reply

Marsh Posté le 16-03-2015 à 13:24:19    

P'tit complément pour les nombres :

 

1 -> c'est un int
1.0 ou 1.0d ou 1d -> c'est un double
1f ou 1.0f -> c'est un float
1l -> c'est un long

 

Typiquement, si tu veux faire une division avec un résultat sous forme d'entier, tu vas écrire :
9/5
si tu veux récupérer un float, tu peux écrire :
9/5.0f ou 9/5f
si tu veux récupérer un double, tu peux écrire :
9/5.0 ou 9/5.0d ou 9/5d

 

(sachant que dans le cas d'une division, c'est le diviseur qui type l'opération)


Message édité par Fraisouille le 16-03-2015 à 13:24:55
Reply

Marsh Posté le 16-03-2015 à 19:26:08    

Ah oki ! Merci pour ces précisions ! ^.^

Reply

Sujets relatifs:

Leave a Replay

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