IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Commentaires

  1. Avatar de stendhal666
    • |
    • permalink
    Un peu plus d'un an après le post...

    En s'inspirant de la solution Python on peut avoir aussi bien en C:

    Code C : 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
     
    typedef struct category {
      int low, high;
      const char* name;
    };
     
    const category categories [] = 
    {
      { .low = 0, .high = 5, .name = "sans categorie" },
      // etc.
    };
    const int NB_CAT = sizeof(categories) / sizeof(category);
     
    const char* get_category(int age) {
      for (int i = 0; i < NB_CAT; ++i) {
        if (age >= categories[i].low && age < categories[i].high)
          return categories[i];
      }
      return "too old :-(";
    }
  2. Avatar de Bktero
    • |
    • permalink
    Citation Envoyé par kolodz
    Il y a moyen d'édité le billet pour ajouter un =C sur la balise code pour avoir la coloration syntaxique ?
    C'est une bonne remarque, je viens de le faire
  3. Avatar de kolodz
    • |
    • permalink
    Il y a moyen d'édité le billet pour ajouter un =C sur la balise code pour avoir la coloration syntaxique ?
  4. Avatar de Bktero
    • |
    • permalink
    Citation Envoyé par Sve@r
    Mon premier commentaire aux nouveaux blogs du fofo. Dommage, j'aurais aimé avoir possibilité de citer la partie que je commente mais j'ai pas trouvé de bouton approprié (mais on peut le créer à la mano)
    Avec les commentaires, on peut faire répondre pour avoir une citation du commentaire souhaité

    Citation Envoyé par Sve@r
    Par exemple Python n'a pas de switch/case (accessoirement il a tant d'autres possibilités que cela ne me gêne même plus) mais il connait l'opérateur in. Associé au générateur xrange() cela devient trivial

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def getCat(age):
    	for (gen, libelle) in (
    		(xrange(0, 5), "sans catégorie"),
    		(xrange(5, 8), "Poussin"),
    		(xrange(8, 10), "Benjamin"),
    		(xrange(10, 13), "Minime"),
    		(xrange(13, 19), "Cadet"),
    	): if age in gen: return libelle
    # getCat()
    Ah c'est pas mal comme solution ! J'avais un truc bien beau et maintenable avec une dictionnaire mais il y avait une entrée par valeur souhaitée. Pour des plages longues, ce n'était pas du tout maintenable ou même faisable.

    Citation Envoyé par Sve@r
    Ca ça me gêne un petit peu. Certes je vois bien l'analogie avec les isalpha(), isalnum(), isdigit() etc mais ce qui me gêne c'est d'adapter ce genre de méthodes pour des éléments aussi liés les uns aux autres. Autant avec les isalpha, isalnum, isdigit, isspace etc on a couvert toutes les possibilités et si éventuellement on veut rajouter un "isvoyelle()" on peut le faire sans toucher aux autres fonctions, ici si on veut rajouter la catégorie "Espoir" entre "Minime" et "Cadet" on est obligé de reprendre les #define ainsi que les fonctions isMinime() et isCadet()...
    L'intérêt est surtout si les tests deviennent compliqués. Ici, on pourrait s'en passer. Quelque soit la technique, tu seras forcément embêté quand tu voudras rajouter des catégories intermédiaires ; des catégories au-dessus et en-dessous, c'est bons. Ici, avec les #define, il est simple de changer les bornes des catégories.

    Citation Envoyé par Sve@r
    PS: j'espère que je ne fais pas erreur en écrivant ce commentaire qui s'apparente à une début de débat lequel aurait alors sa place sur le vrai forum...
    Ben non c'est sympa de répondre ici En plus je crois qu'on a largement discuté sur le forum.
  5. Avatar de Sve@r
    • |
    • permalink
    Bonjour

    Mon premier commentaire aux nouveaux blogs du fofo. Dommage, j'aurais aimé avoir possibilité de citer la partie que je commente mais j'ai pas trouvé de bouton approprié (mais on peut le créer à la mano)

    Citation Envoyé par Bktero
    Le titre parle de C mais les principes sont génériques et applicables à d'autres langages.
    Donc peut-on envisager d'adapter cet article aux autres langages bien souvent plus étendus que le C et donc plus puissants ? Par exemple Python n'a pas de switch/case (accessoirement il a tant d'autres possibilités que cela ne me gêne même plus) mais il connait l'opérateur in. Associé au générateur xrange() cela devient trivial

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def getCat(age):
    	for (gen, libelle) in (
    		(xrange(0, 5), "sans catégorie"),
    		(xrange(5, 8), "Poussin"),
    		(xrange(8, 10), "Benjamin"),
    		(xrange(10, 13), "Minime"),
    		(xrange(13, 19), "Cadet"),
    	): if age in gen: return libelle
    # getCat()

    Citation Envoyé par Bktero
    Pour être encore plus élégant, on peut déléguer les tests à des fonctions. La structure devient alors très claire à lire, proche d'un énoncé humain : si c'est un poussin, si c'est un minime, etc.
    Ca ça me gêne un petit peu. Certes je vois bien l'analogie avec les isalpha(), isalnum(), isdigit() etc mais ce qui me gêne c'est d'adapter ce genre de méthodes pour des éléments aussi liés les uns aux autres. Autant avec les isalpha, isalnum, isdigit, isspace etc on a couvert toutes les possibilités et si éventuellement on veut rajouter un "isvoyelle()" on peut le faire sans toucher aux autres fonctions, ici si on veut rajouter la catégorie "Espoir" entre "Minime" et "Cadet" on est obligé de reprendre les #define ainsi que les fonctions isMinime() et isCadet()...

    Citation Envoyé par Bktero
    De manière plus large, on résonnera sur l'appartenance d'une valeur donnée à des plages possibles
    En fait, la façon de résoudre ce problème dépendra surtout si les plages sont liées les unes avec les autres (les pupilles sont adjacentes aux poussins mais que faire si on veut intercaler demain une autre catégorie) ou si elles sont idépendantes (rajouter un isvoyelle() n'impactera en rien les autres istruc())

    PS: j'espère que je ne fais pas erreur en écrivant ce commentaire qui s'apparente à une début de débat lequel aurait alors sa place sur le vrai forum...
    Mis à jour 01/11/2014 à 13h23 par Sve@r