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 :

"case" ou "if()" ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de fullben
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Par défaut "case" ou "if()" ?
    Bonjour à tous! voilà, j'ai un dure dilèmne à résoudre: "case" ou "if()"
    je vous explique tout: je veux créer un jeux de réflexion en C++ avec plusieurs niveaux de difficulté si le joueur veut directement accédé aux niveaux supérieur il doit pouvoir le faire en saississant "niveau 1", par exemple, sur son clavier.
    Bon jusque là pas de problème
    Je veux simplement savoir si la fonction "case" eétait mieux adapté à ce type de manoeuvre ou si je pouvais mettre des "if()" !?
    Merci d'avance

  2. #2
    Membre confirmé Avatar de fullben
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Par défaut
    au faite, j'utilise Dev-C++

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Partout où un switch est utilisable, utiliser un switch.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par défaut
    Citation Envoyé par Médinoc
    Partout où un switch est utilisable, utiliser un switch.
    Pas tout à fait d'accord : je trouve que les switch/case vont compliquer la lecture si le traitement de chaque case nécessite plus de quelques instructions. De plus, il est tellement facile d'oublier un break, d'obtenir un comportement non attendu et de perdre du temps en débuggage. Pourquoi préconises tu le switch/case par rapport au if/then ?

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Parce qu'à partir du moment où on a acquis les automatismes, dès qu'on voit un switch(), on sait à quoi il sert.
    À moins d'être impliqué dans un truc bizarre comme le Duff's Device, le switch() est une bonne indication de la nature du code qui suit...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Le gros inconvéniant du switch, c'est qu'il est constant...

    Je veux dire par là, qu'il est impossible au programme de rajouter un "niveau" en lisant un fichier additionel par exemple, et de le rajouter dans le code du switch...

    Une boucle et des 'if' dedans sont quand même plus adaptés à ce genre de situation.
    Ou encore une hashtable...

    Maintenant, si les niveaux sont statiques... alors ... c'est juste une question de lisibilité... le compilo (enfin, l'optimiseur) fait le même code à la sortie...

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par roulious
    Pas tout à fait d'accord : je trouve que les switch/case vont compliquer la lecture si le traitement de chaque case nécessite plus de quelques instructions.
    Ce qui est aussi le cas d'un if else...

    Si la partie de code devient trop importante, penses à la factoriser, pour que cela puisse devenir
    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
     
    switch(variable)
    {
        case v1:
            f1();
            break;
         case v2:
            f2();
            break;
        //...
        default:
            f128();
    }
    //OU-OU-OU
    if(test)
    {
       f1();
    }
    else
    {
       f2();
    }
    De plus, il est tellement facile d'oublier un break, d'obtenir un comportement non attendu et de perdre du temps en débuggage.
    Ca, ca fait plutot partie des bonnes habitudes concernant l'ordre dans lequel on écrit le code...

    Personnellement, j'ai pris l'habitude (mais je n'oblige personne à faire pareil) de ne pas écrire le code de manière strictement linéaire:

    Si, par exemple, je dois effectuer un test if(test) else, je place le if, les accolade du if, le else, les accolades du else puis je m'occupe de ce qui se trouve dans chaque bloc...

    De la meme manière, si je dois écrire un switch case, je place le switch et ses accolade, puis chaque cas que j'ai déterminé avec le break qu'il nécessite, pour terminer par l'écriture de ce qui doit etre fait entre le case valeur: et son break;...

    De ce simple fait, j'évite tous les problèmes potentiels dû à l'oubli d'un break ou d'une accolade fermante
    Un autre bonne habitude à prendre est de prévoir systématiquement une valeur par défaut, qui peut tres bien se contenter d'afficher un "valeur non prise en compte"...
    Pourquoi préconises tu le switch/case par rapport au if/then ?
    Parce que, en gros, même si le code exécutable au niveau du processeur a des chances d'être sensiblement identique (quoi que, je ne sois pas sûr du tout qu'une succession de if ... else if ne provoque pas plus de modifications des valeurs de registre que le switch case correspondant), le if else est un test booléen (qui ne peut avoir comme résultat que "vrai" ou "faux"), alors que le switch case est, justement, prévu pour permettre de prévoir un comportement particulier en fonction de la valeur obtenue d'une variable

    Bien sur, il y a des cas particuliers dans lesquels, bien qu'un switch case puisse sembler applicable, on peut se rendre compte que ce n'est pas la meilleure solution...

    Tout comme, bien que le conseil général soit d'éviter l'utilisation de goto, il existe des situtations dans lesquelles il représentera la meilleure solution à un problème tout particulier...

    Ou comme, bien que je ne te conseillerai jamais de rouler à deux fois la vitesse maximale autorisée sur autoroute, tu puisse te trouver dans une situation dans laquelle tu n'auras pas le choix, et que tu prendra la décision de le faire

    Mais ces situations extrèmes qui ne sont là que pour confirmer la règle générale peuvent être, dans un premier temps en tout cas, considérées comme suffisemment marginales pour être omises lorsque l'on présente la regle générale à quelqu'un qui commence et qui mettra, sans doute, très longtemps avant de rencontrer "la" situation particulière dans laquelle la situation générale ne s'applique pas correctement...
    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
    Membre confirmé Avatar de fullben
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Par défaut
    merci à tous pour vos impressions
    je vais voir ce qui sera le plus lisible pour moi

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