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 :

la fonction switch en c (sélection dans un intervalle de nombres)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 2
    Par défaut la fonction switch en c (sélection dans un intervalle de nombres)
    Salut a tous et a toutes,
    Une petite question met venue à l'esprit alors que je faisait un générateur aléatoire de labyrinthe en C. Quelqu'un sait-il comment faire ou est-il possible de faire un switch dont la sélection de l'action a réaliser correspond a un intervalle de valeur? Moi même j'ai un peu de mal avec ma question donc voila un exemple:


    la version normal:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    switch(choix)
        {
            case 0: --action 1-- break;
            case 1: --action 1-- break;
            case 2: --action 2-- break;
            case 3: --action 3-- break;
     
        }
    la version que je voudrais réaliser:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    switch(choix)
        {
            case  0<choix<10:     --action 1--; break;
            case 10<choix<20:     --action 1--; break;
            case 20<choix<30:     --action 2--; break;
            case 30<choix<40:     --action 3--; break;
     
        }
    merci pour vos réponses.

  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    A ma connaissance, il n'est pas possible de specifier des intervalles. Mais tu peux faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    switch (choix)
    {
      case 1 : 
      case 2 : 
      case 3 : 
      case 4 :  /* code pour 1, 2, 3 ou 4 */  break ;
     
      case 5 : 
      case 6 : 
      case 7 :  /* code de 5 a 7 */ break
     
      default : /* other */ break;
    }
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  3. #3
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 768
    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 768
    Par défaut
    Citation Envoyé par dudu_man Voir le message
    switch(choix)
    {
    case 0<choix<10: --action 1--; break;
    case 10<choix<20: --action 1--; break;
    case 20<choix<30: --action 2--; break;
    case 30<choix<40: --action 3--; break;

    }
    On peut le faire en C , en sachant que le switch n'accepte que des entiers
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        if ((choix >= 0) && (choix <= 9)) {
    //      action 1
        } else if ((choix >= 10) && (choix <= 19)) {
    //      action 1
        } else if ((choix >= 20) && (choix <= 29)) {
    //      action 2
        } else if ((choix >= 30) && (choix <= 39)) {
    //      action 3
        }
    Et si on combine 2 intervalles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        if (((choix >= 0) && (choix <= 9)) || ((choix >= 20) && (choix <= 29))) {
    //      action 1
        } else if ((choix >= 10) && (choix <= 19)) {
    //      action 2
        } else if ((choix >= 30) && (choix <= 39)) {
    //      action 3
        }
    Édit: gangsoleil a raison case est un mot clef . Et pour un coup en français

  4. #4
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Attention, ce n'est pas if ((case < ..., mais if ((choix < ...

    if (( case va provoquer une erreur de syntaxe.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    A proprement parlé, switch n'est pas une fonction mais un opérateur. Et non il ne permet pas de faire des sélections sur des plages.

    Tu as la solution de gangsoleil, à mon avis peu lisible et maintenable. Tu as la solution de foetus, qui peut-être améliorée avec une fonction ou une macro isInRange(min, max).

  6. #6
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Idée "stupide", mais dans le même genre que foetus : faire une enum, et faire un switch/case sur l'énumération !

    Si l'énumération "inversée" existait ce serait fabuleux !... mais en C ça serait ardu de déclarer des ensembles de valeurs !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  7. #7
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 768
    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 768
    Par défaut
    Citation Envoyé par Metalman Voir le message
    Idée "stupide", mais dans le même genre que foetus : faire une enum, et faire un switch/case sur l'énumération !

    Si l'énumération "inversée" existait ce serait fabuleux !... mais en C ça serait ardu de déclarer des ensembles de valeurs !
    Si tu es [très] joueur tu peux faire un espèce de "hash" pour les intervalles

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        int hash = generate_hash(choice);
     
        switch (hash) {
        case HASH_ACTION_1: /* action1 */ break;
        case HASH_ACTION_2: /* action2 */ break;
        case HASH_ACTION_3: /* action3 */ break;
        default: /* other */ break;
        }

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/07/2012, 12h22
  2. [AC-2007] Attribuer une valeur en fonction d'une sélection dans une liste
    Par Gregk84 dans le forum VBA Access
    Réponses: 7
    Dernier message: 09/07/2012, 17h31
  3. Réponses: 11
    Dernier message: 23/04/2012, 09h55
  4. Réponses: 23
    Dernier message: 07/05/2008, 08h09
  5. slection dans une intervalle d'enregistrement
    Par toome dans le forum Langage SQL
    Réponses: 1
    Dernier message: 30/08/2005, 15h17

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