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

C++ Discussion :

switch 2 conditions


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 18
    Par défaut switch 2 conditions
    Bonjour,
    Peut-on faire un switch avec 2 conditions ?
    Et comment on déclare les Case ?
    Merci de votre aide
    A+

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Par défaut
    Bonjour,

    peux-tu être plus précis s'il te plait ? Qu'est-ce que tu entends par "deux conditions" ? Merci.

  3. #3
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par NESTLE
    Bonjour,
    Peut-on faire un switch avec 2 conditions ?
    Et comment on déclare les Case ?
    Merci de votre aide
    A+
    non pas possible.

    Par contre :
    -> les switch peuvent être remplacés par une bonne conception à base de polymporphisme !!!

    Donc oui, c'est faisable!

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    L'une des solutions les plus facile consiste a, si possible, regrouper les deux valeurs de manières à ce qu'elles n'en fassent plus qu'une...

    Pour y arriver, il "suffit" de décaler suffisemment "vers la gauche" (en fait, vers le bit de poids fort) la valeur d'une des variable de manière à ce que l'ajout de l'autre ne puisse plus modifier la valeur de la premiere et d'écrire les cas pour chacune des possiblités obtenues...

    Je m'explique:

    Imaginons que tu veuille effectuer un switch sur les variables a et b, toutes deux déclarées en tant que int, et ayant toutes deux une valeur potentielles comprise entre 0 et 7...

    Tu as donc une représentation binaire de l'ordre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    0 -> 0000
    1 -> 0001
    2 -> 0010
    3 -> 0011
    4 -> 0100
    5 -> 0101
    6 -> 0110
    7 -> 0111
    Comme tu peux le remarquer, le premier bit qui n'est pas utilisé pour l'instant, c'est le quatrieme

    Hé bien, il "suffit" de décaler la valeur d'une des variables de 3 bits...
    on pourra apres faire l'addition de a et de b sans perdre l'une des possibilités:
    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
     
    int finale=a;// j'utilise finale pour ne pas modifier a ;)
    finale<<3;   // décalage de trois bits vers la gauche de la valeur de finale
                 //(qui était jusqu'à présent la meme que a ;) )
                 // En fait, cela revient à multiplier par 8 :D
    finale+=b;   // on ajoute la valeur de b à finale...
               // on est sur de ne pas avoir perdu un seul bit de a du fait que
               // le premier bit utilisé pour a se trouve apres le dernier bit 
               // utilisé pour b :D
    switch (finale)
    {
        case 0: /*a et b valent 0 */ break;
        case 1: /*a  vaut 0 et b vaut 1 */ break;
    /* ... */
        case 7: /*a  vaut 0 et b vaut 7 */ break;
        case 8: /*a  vaut 1 et b vaut 0 */ break;
    /* ... */
        case 15: /*a  vaut 1 et b vaut 7 */ break;
        case 16: /*a  vaut 2 et b vaut 0 */ break;
    /* ... */
        case 23: /*a  vaut 2 et b vaut 7 */ break;
    /* ... */
        case 
       case 56: /* a vaut 7 et b vaut 0 */ break;
    /* ... */
        case 63 /* a vaut 7 et b vaut 7 */ break;
    }
    Maintenant, il ne te reste plus qu'à adapter cet exemple à ton cas personnel
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 387
    Par défaut
    Citation Envoyé par NESTLE
    Bonjour,
    Peut-on faire un switch avec 2 conditions ?
    Et comment on déclare les Case ?
    Merci de votre aide
    A+
    En faintant :
    Tu crée une structure contenant tes 2 types d'éléments, et tu fais un switch de cette structure.
    Solution de faciliter qui te prend 3-4 lignes de codes

  6. #6
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par koala01
    Salut,

    L'une des solutions les plus facile consiste a, si possible, regrouper les deux valeurs de manières à ce qu'elles n'en fassent plus qu'une...

    Pour y arriver, il "suffit" de décaler suffisemment "vers la gauche" (en fait, vers le bit de poids fort) la valeur d'une des variable de manière à ce que l'ajout de l'autre ne puisse plus modifier la valeur de la premiere et d'écrire les cas pour chacune des possiblités obtenues...
    Je dois admettre que c'est bien pensé
    Mais c'est quand même tordu à souhait ton truc !!

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Citation Envoyé par poukill
    Je dois admettre que c'est bien pensé
    Mais c'est quand même tordu à souhait ton truc !!
    Pourquoi tordu à souhait

    C'est juste une application sensée de la représentation de n'importe quelle valeur en mémoire
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par poukill
    Je dois admettre que c'est bien pensé
    Mais c'est quand même tordu à souhait ton truc !!
    Pas si tordu que ça, de manière générale c'est très pratique lorsque l'on doit avoir un bloc d'instruction différent par combinaison de variables. Disons que c'est surtout utilisé avec des combinaisons de bits, plutôt que des combinaisons d'entiers.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int collision = (collision_gauche << 3) &
                    (collision_droite << 2) &
                    (collision_haut   << 1) &
                    (collision_bas    << 0);
     
    switch (collision)
    {
        case 0 : // pas de collision
        case 1 : // collision haut
        case 2 : // collision bas
        case 3 : // collision haut + bas
        ...
        case 15 : // collision de tous les côtés
    }

  9. #9
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    PP(Team) :
    En faintant :
    Tu crée une structure contenant tes 2 types d'éléments, et tu fais un switch de cette structure.
    Solution de faciliter qui te prend 3-4 lignes de codes
    Sauf qu'on ne peut pas faire un switch sur une structure ou sur un tableau

  10. #10
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Merci laurent d'abonder en mon sens...

    D'autant plus que, en définitive, ca prend beaucoup moins de temps à mettre au point qu'à en expliquer le principe
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #11
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 387
    Par défaut
    Citation Envoyé par diogene
    PP(Team) : Sauf qu'on ne peut pas faire un switch sur une structure ou sur un tableau
    Ben c'est cool, je viens d'apprendre un truc .
    Même si j'avais déjà eu le cas il y a quelques temps...

  12. #12
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par Laurent Gomila
    Pas si tordu que ça, de manière générale c'est très pratique lorsque l'on doit avoir un bloc d'instruction différent par combinaison de variables. Disons que c'est surtout utilisé avec des combinaisons de bits, plutôt que des combinaisons d'entiers.
    Oui j'ai pas dit que c'était débile du tout... D'ailleurs Koala je ne me souviens pas avoir vu de remarques infondées de ta part!!!
    De plus, il est vrai qu'ayant déjà codé des protocoles de transmissions, j'aurai du me rappeler que c'était une technique pratique.
    Mais c'est vrai que c'est surtout utilisé en binaire (vrai ou faux)

    Mais comme l'a fait remarquer Koala, ça marche aussi avec des nombres plus grands... Ca j'y avais jamais pensé... ^^

  13. #13
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Personne n'a jamais pris ton intervention dans le sens de "c'est débile" (en tout cas, ce n'est pas mon cas)...

    Simplement, le fait est que "solution tordue", ca prend cette consonnance quelque peu péjorative de "solution tordue, tout droit sortie de l'esprit torturé de quelqu'un", ce qui est de nature à faire douter de ma santé mentale

    Et je peux te rassurer entièrement: ma santé mentale se porte à merveille

    C'est pourquoi, je préferes l'utilisation de termes proches de
    admirable mise en oeuvre de la logique d'implémentation en tenant compte des particularités induites par la représentation binaire des valeurs
    (bon, là, j'avoue, j'en fais peut etre un peu trop...)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  14. #14
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Ceci dit, j'avoue, apres réflexion, que la solution est un peu (mais pas à souhait,quand meme ) tordue dans le sens ou le décalage de bits n'est meme pas nécessaire...

    Il "suffit" de multiplier la valeur d'une des variable par la valeur maximale envisagée pour l'autre +1:
    • si bmax=10 finale=(a*11)+b
    • si bmax=16 finale=(a*17)+b
    • si bmax=3 finale=(a*4)+b
    • ...


    Le code devient donc:
    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
     
    //on considère que les valeurs possible sont de 0 à 9 inclus pour a et pour b
    int finale=a*10+b;
    /*sinon, de manière générale, ca prend la forme de
     finale=a*(bmax+1)+b ou bmax est la valeur maximale envisagée pour b ;)
     */ 
    switch (finale)
    {
        case 0: /*a et b valent 0 */ break;
        case 1: /*a  vaut 0 et b vaut 1 */ break;
    /* ... */
        case 9: /*a  vaut 0 et b vaut 9 */ break;
        case 10: /*a  vaut 1 et b vaut 0 */ break;
    /* ... */
        case 19: /*a  vaut 1 et b vaut 9 */ break;
        case 20: /*a  vaut 2 et b vaut 0 */ break;
    /* ... */
        case 27: /*a  vaut 2 et b vaut 7 */ break;
    /* ... */
        case 
       case 56: /* a vaut 5 et b vaut 6 */ break;
    /* ... */
        case 99: /* a vaut 9 et b vaut 9 soit la derniere possibilité */ break;
    }
    et sans oublier le fait que l'on n'est absolument pas obligé de prévoir tous les cas: on a encore la valeur default disponible, si certaines valeurs réagissent de manière similaire
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  15. #15
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Bien sûr! L'idée est toujours la même: faire tenir plusieurs informations dans la même donnée!

  16. #16
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Citation Envoyé par poukill
    Bien sûr! L'idée est toujours la même: faire tenir plusieurs informations dans la même donnée!
    Ben oui, mais, si tu veux arriver à tester l'ensemble des possibilités fournies par deux variables avec des switch...case, tu n'a pas beaucoup d'autre choix pour y arriver ...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  17. #17
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Vi vi...
    Et notre NESTLE? Qu'en penses t-il?

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 18
    Par défaut
    Merci
    A Tous pour vos infos
    Etant donne le peu de possiblite de mon switch : 2 valeurs par condition
    J'ai finalement opté pour un if else if ...
    A+
    NESTLE

  19. #19
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 387
    Par défaut
    Citation Envoyé par NESTLE
    Merci
    A Tous pour vos infos
    Etant donne le peu de possiblite de mon switch : 2 valeurs par condition
    J'ai finalement opté pour un if else if ...
    A+
    NESTLE
    mdr, c'est clair qu'un switch avec uniquement 2 conditions, ca ne sert à rien, mais bon.....au moins tu t'en est apercu.

  20. #20
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par NESTLE
    Merci
    A Tous pour vos infos
    Etant donne le peu de possiblite de mon switch : 2 valeurs par condition
    J'ai finalement opté pour un if else if ...
    A+
    NESTLE
    lol
    C'était bien la peine de trouver une méthode élégante...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. case du switch avec une condition
    Par benkunz dans le forum Langage
    Réponses: 5
    Dernier message: 04/05/2007, 12h14
  2. pb avec condition (switch)
    Par patou41000 dans le forum C++/CLI
    Réponses: 3
    Dernier message: 30/04/2007, 18h56
  3. Besoin d'aide pour la condition switch
    Par argon dans le forum Langage
    Réponses: 30
    Dernier message: 27/03/2006, 19h18
  4. probleme gestion condition switch - case
    Par DarkMax dans le forum Langage
    Réponses: 5
    Dernier message: 07/09/2005, 14h25
  5. Switch et conditions multiples
    Par The Wretched dans le forum Langage
    Réponses: 4
    Dernier message: 19/04/2005, 13h57

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