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

Java Discussion :

switch avec pour paramètre une variable de type : double ou float


Sujet :

Java

  1. #1
    Nouveau membre du Club

    Inscrit en
    Octobre 2012
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 94
    Points : 29
    Points
    29
    Billets dans le blog
    1
    Par défaut switch avec pour paramètre une variable de type : double ou float
    Bonjour à tous,

    Je veux faire un switch sur une variable de type : double, mais j'ai l'erreur suivante :
    Exception in thread "main" java.lang.Error: Unresolved compilation problem:
    Cannot switch on a value of type double. Only convertible int values, strings or enum variables are permitted
    Mon code :

    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.*;
     
    public class Exercice94CalculIMC {
     
    	public static void main(String[] args) {
    		// R�aliser un programme qui (indice de la masse corporelle):
     
    		//  Rappel : l'IMC est calcul� en divisant le poids par la taille au carr�.
    		// - calcule et affiche l'IMC d'une personne (le poids et la taille seront saisis par l'utilisateur);
    		//- interpr�te l'IMC calcul� en se servant du tableau ci-dessus.
     
    		Scanner sc = new Scanner(System.in);
    		double taille, poids;
     
    		System.out.print("Saisir ta taille en cm : ");
    		taille = sc.nextDouble();
     
    		// On le cache
    		sc.nextLine();
     
    		System.out.print("Saisir ton poids en kg : ");
    		poids = sc.nextDouble();
     
    		double imc = poids / (taille * taille);
     
    		switch(imc) {
    			case imc < 16.5:
    				System.out.println("Pour une taille " + taille + " cm, et un poids de " +
    						poids + " kg, votre IMC est : " + imc + "donc dénutritionné(e)");
    			break;
     
    			case imc >= 16.5 && imc < 18.5:
    				System.out.println("Pour une taille " + taille + " cm, et un poids de " +
    						poids + " kg, votre IMC est : " + imc + "donc maigrère");
    			break;
     
    			case imc >= 18.5 && imc < 25:
    				System.out.println("Pour une taille " + taille + " cm, et un poids de " +
    						poids + " kg, votre IMC est : " + imc + "donc normal");
    			break;
     
    			case imc >= 25 && imc < 30:
    				System.out.println("Pour une taille " + taille + " cm, et un poids de " +
    						poids + " kg, votre IMC est : " + imc + "donc en surpoids");
    			break;
     
    			default:
    				System.out.println("Pour une taille " + taille + " cm, et un poids de " +
    						poids + " kg, votre IMC est : " + imc + "donc obèse");
    			break;
     
    		}
    		System.out.println("Fin du programme !");
    	}
     
    }
    Merci de vos aides !

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Ce n'est pas possible, le message d'erreur est pourtant clair: "Cannot switch on a value of type double. Only convertible int values, strings or enum variables are permitted".
    Donc la solution c'est d'utiliser des if et des else à la place, ce qui n'est pas plus compliqué.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Nouveau membre du Club

    Inscrit en
    Octobre 2012
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 94
    Points : 29
    Points
    29
    Billets dans le blog
    1
    Par défaut
    J'ai bien compris le message et je pouvais utiliser les if et else . Mais seulement, j'aimerais une solution qui me permettrait, à le fait avec switch ! Merci

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 977
    Points
    7 977
    Par défaut
    Il faudra attendre encore un peu pour ça a mon avis... https://openjdk.java.net/jeps/325

    As a target of opportunity, we may expand switch to support switching on primitive types (and their box types) that have previously been disallowed, such as float, double, and long.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    La question n'a aucun sens : parce que un switch/ case est là pour tester des valeurs remarquables alors forcer des tests intervalles dans un switch/ case c'est IMPOSSIBLE.
    Et en plus les tests égalité sur des variables flottantes ne sont pas fiables parce que les types float et double ne peuvent pas représenter toutes les valeurs.
    Dans ton cas, on peut transformer un imc flottant en imc entier simplement en multipliant par 100 (et en tronquant à 2 décimales) (<- on change d'unité) 16.5 -> 1650 (ou peut-être 1649 ), 35 -> 3500

    Une façon de faire, non testée :
    (désolé les noms sont à l'arrache parce que je n'ai pas pris le temps de traduire en anglais )
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    public class ClassTest
    {
        private enum t_imc {
            imc_01,
            imc_02,
            imc_03,
            imc_04,
            imc_05,
            imc_06,
            imc_07
        };
     
     
        public String imc_toString_fr(double imc) {
            String str;
     
            switch( get_imc_enum(imc) ) {
            case imc_01: str = new String("d\u00E9nutritionn\u00E9(e)"); break;
            case imc_02: str = new String("maigre"); break;
            case imc_03: str = new String("poids id\u00E9al"); break;
            case imc_04: str = new String("surpoids"); break;
            case imc_05: str = new String("ob\u00E8se mod\u00E9r\u00E9e"); break;
            case imc_06: str = new String("ob\u00E8se s\u00E9v\u00E8re"); break;
            case imc_07: str = new String("ob\u00E8se morbide ou massive"); break;
            default: str = new String("[???]"); break;
            }
     
            return str;
        }
     
     
        static public double get_imc_double(double poids, double taille) {
            return (poids / (taille * taille));
        }
     
     
        private t_imc get_imc_enum(double imc) {
            return ((imc >= 16.5)? ((imc >= 18.5)? ((imc >= 25)? ((imc >= 30)? ((imc >= 35)? ((imc >= 40)? t_imc.imc_07: t_imc.imc_06): t_imc.imc_05): t_imc.imc_04): t_imc.imc_03): t_imc.imc_02): t_imc.imc_01);
        }
     
     
    //  main  
     
        public static void main(String[] args) {
            ClassTest test = new ClassTest();
     
            double imc, poids, taille;
     
            poids = 95; taille = 1.81;
            imc = get_imc_double(poids, taille);
     
            System.out.println("Pour une taille " + taille + " cm, et un poids de " + poids + " kg, votre IMC est : " + imc + "donc " + test.imc_toString_fr(imc));
     
            poids = 48; taille = 1.69;
            imc = get_imc_double(poids, taille);
     
            System.out.println("Pour une taille " + taille + " cm, et un poids de " + poids + " kg, votre IMC est : " + imc + "donc " + test.imc_toString_fr(imc));
     
            poids = 61; taille = 1.57;
            imc = get_imc_double(poids, taille);
     
            System.out.println("Pour une taille " + taille + " cm, et un poids de " + poids + " kg, votre IMC est : " + imc + "donc " + test.imc_toString_fr(imc));
     
            poids = 140; taille = 2.04;
            imc = get_imc_double(poids, taille);
     
            System.out.println("Pour une taille " + taille + " cm, et un poids de " + poids + " kg, votre IMC est : " + imc + "donc " + test.imc_toString_fr(imc));
        }
    }

  6. #6
    Nouveau membre du Club

    Inscrit en
    Octobre 2012
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 94
    Points : 29
    Points
    29
    Billets dans le blog
    1
    Par défaut
    Merci à tous! en vous lisant , la personne qui se rapproche est :
    fœtus
    . Parce qu' en surfant un peu, j'ai vu qu'il était possible de convertir les variables de types : float - double, en int pour qu'ils (les variables convertis) puissent être passés en paramètres dans un switch . Mais bon, je penses que je vais me facilité la tâche, et faire des if et else.

    Merci à vous !

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

Discussions similaires

  1. [2005] Créer une procédure avec pour paramètre une table
    Par Sergejack dans le forum Contribuez
    Réponses: 2
    Dernier message: 01/10/2009, 14h22
  2. [XL-2003] décomposition d'une chaîne de caratères pour alimenter une variable de type range
    Par Umaro137 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 31/08/2009, 13h31
  3. objMessage.AddAttachment avec pour chemin, une variable
    Par jipechibi dans le forum VBScript
    Réponses: 3
    Dernier message: 07/10/2008, 10h24
  4. Réponses: 22
    Dernier message: 03/01/2008, 22h42
  5. Réponses: 15
    Dernier message: 10/05/2007, 13h36

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