Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Erreur] TP JAVA Conversion (Celsius - Fahrenheit)

Sujet résolu
    13 juillet 2013 à 18:01:12

    Bonjour tout le monde !

    Voilà, je suis en train de réaliser le tout premier TP JAVA du tutoriel "Apprenez à programmer en JAVA !" et je suis confrontée à un problème que je ne comprend pas et donc que je n'arrive pas à résoudre !

    Voici le code que j'ai tapé :

    package projet1;
    
    import java.util.Scanner;
    
    public class sdz1 
    {
    
    	public static void main(String[] args) 
    	{
    		//déclaration des variables
    		int choix = 0,tempC, tempF;
    		char reponse = ' ';
    		//l'objet qu'on va récupérer
    		Scanner sc = new Scanner(System.in);
    		
    		System.out.println("CONVERTISSEUR DEGRES CELSIUS ET DEGRES FAHRENHEIT");
    		System.out.println("-------------------------------------------------");
    		
    		//boucle qui recommence ou non la conversion
    		do
    		{
    			System.out.println("Choisissez le mode de conversion :");
    			System.out.println("1 - Convertisseur Celsius --> Fahrenheit");
    			System.out.println("2 - Convertisseur Fahrenheit --> Celsius");
    			choix = sc.nextInt();
    			
    			//boucle qui choisit le mode de conversion
    			switch (choix)
    			{
    				case 1:
    				{
    					System.out.println("Température à convertir : ");
    					tempC = sc.nextInt();
    					tempF = (9/5)*tempC+32;
    					System.out.println(tempC+ " °C correspond à " +tempF+ " °F");
    				}
    				break;
    				
    				case 2:
    				{
    					System.out.println("Température à convertir : ");
    					tempF = sc.nextInt();
    					tempC = ((tempF-32)*5)/9;
    					System.out.println(tempF+ " °F correspond à " +tempC+ " °C");
    				}
    				break;
    				
    				default:
    					System.out.println("Erreur !");
    			}
    			
    			//boucle qui redemande tant que la réponse n'est pas O ou N
    			do
    			{
    			System.out.println("Souhaitez-vous convertir une autre température ? (O/N)");
    			reponse = sc.nextLine().charAt(0);
    			}while(reponse !='O' && reponse !='N');
    			
    		}while(reponse == 'O');
    		
    		System.out.println("Au revoir !");
    	}
    
    }



    Et voici ce que me donne ma console :

    CONVERTISSEUR DEGRES CELSIUS ET DEGRES FAHRENHEIT

    -------------------------------------------------

    Choisissez le mode de conversion :

    1 - Convertisseur Celsius --> Fahrenheit

    2 - Convertisseur Fahrenheit --> Celsius

    1

    Température à convertir : 

    50

    50 °C correspond à 82 °F

    Souhaitez-vous convertir une autre température ? (O/N)

    Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0

    at java.lang.String.charAt(Unknown Source)

    at projet1.sdz1.main(sdz1.java:55)

    Autant dire qu'elle n'est pas très contente :euh: !

    En résumé, tout se passe bien jusqu'à ce que j'arrive à la récupération de ma variable "reponse" dans la boucle qui redemande à l'utilisateur une lettre, tant que celle-ci n'est pas O ou N (reponse = sc.nextLine().charAt(0)). Comme c'est un char, je sais que la syntaxe est un peu exotique ! (Enfin, elle est logique, mais à première vue pour une débutante, ça fait peur :lol:). J'ai revérifié cette syntaxe des centaines de fois et apparemment c'est la bonne, et puis il n'y a pas de vaguelette rouge m'indiquant un problème... Je m'attarde sur cette ligne car apparemment, c'est ici que se situe le problème.

    J'ai besoin d'aide je ne comprend pas ! >.<

    Ah oui, et ne vous souciez pas des int, normalement, ce sont bien des double dont j'ai besoin, mais mon but a été de voir en premier lieu si je maîtrisais bien les boucle. Je me serais attardée sur les calculs plus tard.

    Merci de m'avoir lu jusqu'au bout ! :D

    P.S : Finalement j'ai réussi à faire marcher mon programme en mettant un nouveau scan... Je ne suis pas sûre d'avoir compris pourquoi. Enfin bon, ça marche, on va pas se plaindre :3

    -
    Edité par Omadz 15 juillet 2013 à 12:22:34

    • Partager sur Facebook
    • Partager sur Twitter
      30 novembre 2013 à 16:58:04

      Pour information, vu que l'auteur du sujet n'a pas réalisé la solution optimale et que j'ai rencontré le même problème

      Il faut remplacer :

      //boucle qui redemande tant que la réponse n'est pas O ou N
                  do
                  {
                  System.out.println("Souhaitez-vous convertir une autre température ? (O/N)");
                  reponse = sc.nextLine().charAt(0);
                  }while(reponse !='O' && reponse !='N');


      Par :

      //boucle qui redemande tant que la réponse n'est pas O ou N
                  do
                  {
                  sc.nextLine(); // On vide le scanner
                  System.out.println("Souhaitez-vous convertir une autre température ? (O/N)");
                  reponse = sc.nextLine().charAt(0);
                  }while(reponse !='O' && reponse !='N');

      Le fait est que la valeur numérique de la température est toujours présente dans le scanner, ce qui engendre une erreur, comme mentionné dans le cours "Bien commencer en Java" > "Récupérer ce que vous tapez".

      • Partager sur Facebook
      • Partager sur Twitter
        27 septembre 2016 à 16:13:36

        Bonjour à tous, et désolé par avance pour le déterrage.

        Comme beaucoup, j'ai été confronté à la même erreur, que j'ai réussi à résoudre tout seul en rajoutant un sc.nextLine(); juste avant de redemander si l'utilisateur voulait redémarrer. Cependant, je ne comprends toujours pas exactement le pourquoi de l'erreur, même en lisant les messages sur le forum.

        Dans ce chapitre (https://openclassrooms.com/courses/apprenez-a-programmer-en-java/lire-les-entrees-clavier#/id/r-2180495) on a vu qu'il fallait placer un sc.nextLine(); avant une autre saisi dans le cas où on avait saisi un nombre avant (car nextInt(); et comparses ne replacent pas la tête de lecture). OK, mais... moi je n'ai utilisé que des nextLine() dans mon code !

        Le voici :

        import java.util.Scanner;
        
        public class ConversionCelsiusFarenheit {
        
        	public static void main(String[] args) {
        		// TODO Auto-generated method stub
        		float x = 0;
        		float resultat = 0;
        		Scanner sc = new Scanner(System.in);
        		String str;
        		char choix = ' ';
        		char reponse = ' ';
        		System.out.println("CONVERTISSEUR DEGRÉS CELSIUS ET DEGRÉS FAHRENHEIT");
        		System.out.println("-------------------------------------------------");
        		do{ //boucle totale
        			
        			do{ //boucle de test
        				System.out.println("Choisissez le mode de conversion :");
        				System.out.println("1 - Convertisseur Celsius - Fahrenheit");
        				System.out.println("2 - Convertisseur Fahrenheit - Celsius");
        				choix = sc.nextLine().charAt(0);
        			}while(choix != '1' && choix != '2'); //fin de boucle de test
        			
        			System.out.println("Température à convertir :");
        			x = sc.nextFloat();
        			
        			switch(choix){ //affichage du résultat en fonction du choix de conversion
        			case '1':
        				resultat = 9*x/5+32;
        				System.out.println(x+" °C correspond à : "+resultat+" °F.");
        				break;
        			case '2':
        				resultat = (x-32)*5/9;
        				System.out.println(x+" °F correspond à : "+resultat+" °C.");
        				break;
        			}
        			do{
        				System.out.println("Souhaitez-vous convertir une autre température ? (O/N)");
        				sc.nextLine();
        				reponse = sc.nextLine().charAt(0);
        			}while (reponse != 'O' && reponse != 'N' && reponse != 'o' && reponse != 'n');
        		}while (reponse == 'O' || reponse == 'o');
        		System.out.println("Au revoir !");
        	}
        
        }
        



        Si j'en crois le cours que j'ai cité plus haut, je n'aurais normalement pas besoin d'insérer ce nextLine(); vers la fin de mon code...

        Tout aussi surprenant pour moi, la correction du TP ne contient justement pas ce nextLine(); en trop : https://openclassrooms.com/courses/apprenez-a-programmer-en-java/tp-conversion-celsius-fahrenheit#/id/r-2180763

        Je suis peut-être un peu trop perfectionniste, mais ça m'empêche de dormir :D Quelqu'un peut m'aider à comprendre ?

        Merci à tous !

        -
        Edité par JeffC.Eger 27 septembre 2016 à 16:14:16

        • Partager sur Facebook
        • Partager sur Twitter

        [Erreur] TP JAVA Conversion (Celsius - Fahrenheit)

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown