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

Langage Java Discussion :

Problème avec ma boucle while


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 23
    Points : 17
    Points
    17
    Par défaut Problème avec ma boucle while
    Bonjour tout le monde,

    Je me mets à apprendre Java. J'ai trouvé un tutoriel sympa. Dedans, il y a un exrecice : il faut faire un programme qui convertie les températures celsius/fahrenheit.

    J'ai fait un programme :
    1/ Qui demande quel unité est à transformer,
    2/ Qui demande combien de degré sont à convertir
    3/ Donne la température convertie
    4/ Demande si une autre conversion est à effectuer

    Ca marche bien. Sauf que si je dis à mon programme qu'il faut en faire une autre, il ne veut pas. Pour programmer ça j'ai mis une boucle while au début : j'initialise a (string) en oui, tant que a vaut oui, effectue le programme, à la fin lorsque tu demandes à l'utilisateur s'il veut faire une autre conversion, mets dans a sa réponse.

    Et il ne veut pas recommencer si on mets oui, pourtant a vaut bien oui, j'ai vérifier, pouvez-vous m'aider ?

    Ci-dessous, le programme :

    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
    package projet1;
     
    import java.util.Scanner;
     
    public final class Class1 {
     
         public static void main(String[] args) {
     
         String a="oui";
     
              while (a=="oui")
              {	
              Scanner ss = new Scanner(System.in);
              System.out.println("Que voulez-vous convertir ?");
              String sens = ss.nextLine();
     
                   switch (sens)
                   {
                   case "celsius":
                        Scanner b=new Scanner(System.in);
                        System.out.println("Combien de celsius ?");
                        float deg = b.nextFloat();
                        deg = (float)1.8 * deg + 32;
                        System.out.println(deg + " fahrenheit");
                        break;
                   case "fahrenheit":
                        Scanner c=new Scanner(System.in);
                        System.out.println("Combien de fahrenheit ?");
                        float fah = c.nextFloat();
                        fah = (fah - 32)/(float) 1.8;
                        System.out.println(fah + " celsius");
                        break;
                   }
     
              Scanner der = new Scanner(System.in);
              System.out.println("Voulez-vous effectuer une autre conversion ?");
              a = der.nextLine();
              }
     
         }
     
    }
    A mon avis, c'est que je fais n'importe quoi avec Scanner...

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    il faut utiliser equals pour comparer des objets (et donc des String). == ne fait que vérifier que c'est la même instance.


  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Ca marche ! Merci beaucoup !

    Encore une petite précision (pour voir si j'ai bien compris):
    Si == vérifie juste que c'est la même instance ; lorsqu'on l'utilise avec des objets, la seul manière d'obtenir true, c'est
    (où x est un objet ?)
    c'est bien ça ?

    Enfin, pour les types primitifs, si on peut utiliser == pour les boucles while, cela veut donc dire que si l'on tape :
    b est juste un nouveau nom de l'instance 1 des integer ?

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    x==y vérifie que ce qui est dans la variable x est la même valeur que ce qui est dans la variable y.

    si x et y sont des int, alors on vérifie donc que les valeurs des int sont les même.

    si x et y sont des références vers des objets, alors on vérifie que les références sont les même.

    donc si tu as

    String x = "123"; et String y = x; alors x==y vaut true. Car on a copié la référence contenu dans x vers la variable y, les références sont les mêmes (x et y référencent la même instance de String).

    Il faut bien comprendre en java que tu as

    String x

    c'est une variable x destiné à contenir la référence vers un objet de type String. On ne stocke jamais l'objet en java, toujours la référence (contrairement au C++ où on peux faire les deux).

  5. #5
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    <non technique>
    comme quoi les idées se répandent: la conversion Celsius/farenheit est un exercice qui est dans mes tutoriaux depuis 15 ans! (tu n'aurais pas, par hasard, une copie d'un de mes cours )
    autre remarque non technique: ton pseudo est celui de mon petit-fils (mais là j'en suis sûr tu n'es pas mon petit-fils -il fait du mindstorm pas du java-)
    </non technique>
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Holala... C'est terriblement brumeux pour le moment les "instances"/"références"...
    Une dernière tentative pour voir si je comprends, après je laisse tomber pour le moment.


    Lorsque je fais :
    a est une instance de la classe String, c'est à dire un objet "chaine de caractère" contenant les trois caractères o, u et i concaténés, c'est bien ça ?

    Mais tu dis que l'on ne stocke jamais l'objet, mais la référence. Pour moi, la référence c'était un peu " l'adresse postale " dans la mémoire du contenu d'un objet.

    C'est à dire qu'un objet est défini entièrement par sa classe et sa référence ?
    Et lrosque tu dis que l'on ne stocke pas l'objet, cela veut dire qu'il n'y pas dans la mémoire un truc du genre a="oui", mais plutôt un truc du genre a est un String dont le contenu se trouve là-bas.

    Ainsi, pour les variables de types primitifs == marchent parce que dans ce cas là, les variables renvoient directement à leur valeurs; et pour les objets, == marche uniquement si les deux objets sont de même classe et ont la même référence. Est-ce que c'est ça ?

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Oui enfin, en général on préfère dire "une référence." "Une référence" vers un objet, c'est juste une variable (ou une expression) qui contient "l'adresse" de cet objet, oui.
    Mais ça ne sert à rien de considérer cette adresse, cette adresse c'est ce qui identifie l'objet, c'est donc l'objet lui-même. Alors on ne parle pas de "la référence" à un objet, mais de "une référence" à cet objet. Des variables et des expressions qui pointent vers cet objet, il peut y en avoir des millions. Pas franchement unique.

    Par ailleurs, si deux références sont les mêmes, alors ces deux références pointent vers le même objet, et cet objet est forcément de la même classe que lui-même. Tout comme je porte le même prénom et j'exerce le même métier que moi.
    Ce que je veux dire c'est que == utilisé sur des types objets, ça veut dire utilisé sur deux références. Et si ces deux références sont égales, alors les "deux objets" sont forcément de même classe, puisqu'en réalité c'est un seul objet.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    OK, c'est plus clair.
    Merci à tous pour vos réponses !

    @ professeur shadoko : j'ai dis que je débutais java. Peut être que gautgaut, votre petit fils, se mets à java âpres mindstorm...

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

Discussions similaires

  1. Problème avec des boucles while/for imbriquées
    Par Nico820 dans le forum Général Python
    Réponses: 12
    Dernier message: 14/12/2012, 16h24
  2. Problème avec une boucle de type Do While =>Loop
    Par Runsh63 dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 23/09/2011, 08h53
  3. Problème avec deux boucles do whiles imbriquées
    Par breizh297 dans le forum Fortran
    Réponses: 1
    Dernier message: 15/11/2010, 08h37
  4. [AC-2003] Problème avec ma boucle Do While
    Par maw59 dans le forum VBA Access
    Réponses: 1
    Dernier message: 18/03/2010, 11h21
  5. [AC-2007] Probléme avec une boucle DO While
    Par theBinette dans le forum VBA Access
    Réponses: 2
    Dernier message: 12/02/2010, 17h10

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