IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

[Bug] Celsius vers Farenhreit et inversement


Sujet :

avec Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut [Bug] Celsius vers Farenhreit et inversement
    Bonsoir,

    J'ai besoin d'un débogueur humain pour déboguer ce programme (/*ARRET*/= où le code s'arrête):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    import java.util.Scanner;
    import static java.lang.System.out;
     
    public class Main {
     
    	public static void main(String[] args) {
    	//initialisations
    		Scanner sc = new Scanner(System.in);
    		double CouF, résultat;
    		char CorF, OorN;
    		out.println("Bonjour et bienvenue dans le convertisseur Celsius -> Farenhreit et inversement.");
    		out.println("Vous devez simplement suivre le instructions suivantes:");
    	//pour atteindre résultat
    		do {
    		out.println("Vous allez entrer une température Celsius ou Farenhreit ? ");
    		do {
    			out.print("(C/F) -> ");
    			CorF = sc.nextLine().charAt(0);
    		}while(CorF != 'C' && CorF != 'F' && CorF != 'c' && CorF != 'f');
    		if(CorF == 'C' || CorF == 'c') {
    		   out.println();
    		   out.println("Vous avez choisi d'entrer une température \"Celsius\". ");
    		   out.print("(Température Celsius) -> ");
    		   CouF = sc.nextDouble();
    		   résultat = 9 / 5 * CouF + 32;
    		   out.println();
    		   out.println("Il fait "+résultat+" Farenhreit !");
    		}else if(CorF == 'F' || CorF == 'f') {
    			     out.println();
    			     out.println("Vous avez choisi d'entrer une température \"Farenhreit\". ");
    			     out.print("(Température Farhenhreit) -> ");
    			     CouF = sc.nextDouble();
    			     résultat = (CouF - 32) * 5 / 9;
    			     out.println();
    			     out.println("Il fait "+résultat+" Celsius !");
    		}else{
    			out.println();
    			out.println("ERREUR !");
    		}
    		do {
    			out.println();
    			out.print("Voulez vous recommencez ? -> ");
    /*ARRET*/	OorN = sc.nextLine().charAt(0);
    /*ARRET*/}while(OorN != 'O' && OorN != 'N' && OorN != 'o' && OorN != 'n');
    /*ARRET*/}while(OorN == 'O' || OorN == 'o');
    		if(OorN == 'N' || OorN == 'n') {
    			out.println();
    			out.print("Au revoir !");
    		}
     
    			sc.close();
     
     
    	}
     
    }
    Voilà, merci de vos réponses

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tu pourrais être un minimum plus explicite, non ? Comme par exemple nous donner le message d'erreur que tu obtiens quand ton programme s'arrête !

    Quelque chose comme : java.lang.StringIndexOutOfBoundsException: String index out of range: 0

    Par ce que nextDouble() lit le contenu du flux tel qu'on obtienne le prochain double situé dans le flux. On lit donc tous les caractères qui correspondent à ce qui permet de construire un double (des chiffres et un .) jusqu'au prochain séparateur (l'espace par défaut), mais ne consomme pas la ligne, parce qu'on est censé pouvoir saisir autre chose sur la ligne (il n'y a rien qui indique nulle part que toi tu sais qu'on ne saisira qu'un seul nombre), nextLine lui lit tout ce qu'il y a dans le flux jusqu'au prochain retour à la ligne compris, mais sans l'inclure dans la chaîne récupérée.

    Quand tu tapes 22+Entrée à la question "(Température Celsius) -> ", tu as dans le tampon 2, 2, \r, donc nextDouble() lit 2, 2, et renvoit 22, et il reste \r dans le tampon, puis le code fait OorN = sc.nextLine().charAt(0), soit je lis tout ce qu'il y a jusqu'au \r, sans \r donc, et j'obtiens... une chaîne vide. Dont tu demandes le premier caractère (index 0) : donc tu reçois une exception "le caractère en position 0 n'existe pas" (enfin, exactement, "est en dehors des limites de la chaîne").

    Pour résoudre le problème, vide le tampon pour consommer la ligne en cours, avant de relire une ligne. Par exemple, juste après le nextDouble, sc.nextLine(); (à faire à 2 endroits donc).

    Tu pourrais lire aussi la réponse à "Voulez vous recommencez ? -> " avec un next() (ainsi que pour la demande C/F) : ainsi, la règle devient, pour toute lecture (next(), nextDouble(), 2 nextDouble() de suite pour lire 2 valeurs..., on fait toujours nextLine() pour vider le tampon et lire la prochaine ligne.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci ^^ J'ai oublié que lorsque nextLine() est appelé pour la appelé pour la deuxième fois il ne fait que replacer sa "tête de lecture". Il ne lit pas directement l'input... C'est ça d'être débutant et d'avoir que 13 ans et demi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Linux] Entier vers chaîne et inversément
    Par nelob dans le forum x86 32-bits / 64-bits
    Réponses: 0
    Dernier message: 08/05/2007, 12h10
  2. fichier texte dos vers linux et inversement
    Par mencaglia dans le forum C++
    Réponses: 4
    Dernier message: 23/09/2006, 12h59
  3. Bug Excel vers Access
    Par jbaudin dans le forum Access
    Réponses: 2
    Dernier message: 01/12/2005, 16h56
  4. code c pour sockets (udp vers tcp et inversement)
    Par HiT dans le forum Développement
    Réponses: 11
    Dernier message: 19/11/2005, 19h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo