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 case en c


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 42
    Points : 51
    Points
    51
    Par défaut switch case en c
    Bonjour

    Je dois faire un programme qui repond a cet énoncé :

    Demande l'âge de l'utilisateur et affiche sa catégorie :
    -Poussin : 6-7 ans
    -Pupille : 8-9 ans
    -Minime : 10-11 ans
    -Cadet : 12+
    -Pas de catégorie : 5 ans et -

    J'ai réussi a le faire avec des si ça donne ça :

    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
     
    // Ce programme demande l'age de l'utilisateur et lui affiche sa categorie
     
    #include "stdafx.h"
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int age = 0;
    	printf("Quel est votre age ?\n");
    	scanf_s("%d", &age);
     
     
    		if (age<=7 && age>=6)
    		{
    			printf("Vous faites parti de la categorie Poussin\n");
    		}
    		else 
    		{
    			if (age<=9 && age>=8)
    			{
    				printf("Vous faites parti de la categorie Pupille\n");
    			}
    			else
    			{
     
    				if (age<=11 && age>=10)
    				{
    					printf("Vous faites parti de la categorie Minime\n");
    				}
    				else
    				{
    					if (age>=12)
    					{
    						printf("Vous faites parti de la categorie Cadet\n");
    					}
    					else 
    					{
    						if (age<6)
    						{
    						printf("Vous ne faites parti d'aucune categorie\n");
    						}
    					}
    				}
    			}
    		}
     
    	return 0;
    }
    Par contre je n'arrive pas a le faire avec un switch, pour l'instant j'ai fais ça mais ca ne marche pas :

    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
     
    // TP1_Pb3.cpp*: définit le point d'entrée pour l'application console.
    // Ce programme demande l'age de l'utilisateur puis lui affiche sa catégorie
     
    #include "stdafx.h"
     
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int age = 0;
    	int categorie=0;
    	printf("Quel est votre age ?\n");
    	scanf_s("%d", &age);
     
    	switch (categorie)
    	{
     
    	case 1:
    		if (age<=7 && age>=6)
    		{
    			printf("Vous faites parti de la categorie Poussin\n");
    		}
    		break;
     
    	case 2:
    		if (age<=9 && age>=8)
    		{
    			printf("Vous faites parti de la categorie Pupille\n");
    		}
    		break;
     
    	case 3:
    		if (age<=11 && age>=10)
    		{
    			printf("Vous faites parti de la categorie Minime\n");
    		}
    		break;
     
    	case 4:
    		if (age>=12)
    		{
    			printf("Vous faites parti de la categorie Cadet\n");
    		}
    		break;
     
    	default:
    		if (age<=6)
    		{
    			printf("Vous ne faites parti d'aucune categorie\n");
    		}
    		break;
    	}
     
    	return 0;
    }
    Quelles sont mes erreurs ? Comment faire pour répondre a l'énoncé avec un switch ?


    Merci

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Points : 321
    Points
    321
    Par défaut
    Bonjour,

    Ici le switch est sur categorie, il faut donc qu'elle soit déjà déterminée au moment du switch.
    Dans le présent programme : int catégorie=0;
    Donc on sera toujours dans case 0: ou default !

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 42
    Points : 51
    Points
    51
    Par défaut
    a ok,

    Du coup j'ai modifié mon code mais j'ai encore un problème, je ne sais pas comment gérer le 12 ans et +
    Y a il une solution plus simple que de rajouter un truc genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    case 12:
    case 13:
    case 14:
    ...

    pour l'intant voilà 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
     
    // TP1_Pb3.cpp*: définit le point d'entrée pour l'application console.
    // Ce programme demande l'age de l'utilisateur puis lui affiche sa catégorie
     
    #include "stdafx.h"
     
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int age = 0;
    	printf("Quel est votre age ?\n");
    	scanf_s("%d", &age);
     
    	switch (age)
    	{
     
    	case 6:
    	case 7:
    		printf("Vous faites parti de la categorie Poussin\n");
    		break;
     
    	case 8:
    	case 9:
    		printf("Vous faites parti de la categorie Pupille\n");
    		break;
     
    	case 10:
    	case 11:
    		printf("Vous faites parti de la categorie Minime\n");
    		break;
     
    	case 12:
    		printf("Vous faites parti de la categorie Cadet\n");
    		break;
     
    	default:
    		printf("Vous ne faites parti d'aucune categorie\n");
    		break;
    	}
     
    	return 0;
    }

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Tu pourrais créer des cases 0 à 5 avec un résultat du type "trop jeune".

    Ainsi le default pourrait être affecté aux +12.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 42
    Points : 51
    Points
    51
    Par défaut
    a c'est pas con

    merci

    Je vais faire comme ça mais il n'y a pas d'autres solutions ?

    edit : mon code marche nickel

    voilà du coup mon code final :

    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
     
    // TP1_Pb3.cpp*: définit le point d'entrée pour l'application console.
    // Ce programme demande l'age de l'utilisateur puis lui affiche sa catégorie
     
    #include "stdafx.h"
     
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int age = 0;
    	printf("Quel est votre age ?\n");
    	scanf_s("%d", &age);
     
    	switch (age)
    	{
     
     
    	case 0:
    	case 1:
    	case 2:
    	case 3:
    	case 4:
    	case 5:
    		printf("Vous ne faites parti d'aucune categorie\n");
    		break;
     
    	case 6:
    	case 7:
    		printf("Vous faites parti de la categorie Poussin\n");
    		break;
     
    	case 8:
    	case 9:
    		printf("Vous faites parti de la categorie Pupille\n");
    		break;
     
    	case 10:
    	case 11:
    		printf("Vous faites parti de la categorie Minime\n");
    		break;
     
     
    	default:
    		printf("Vous faites parti de la categorie Cadet\n");
    		break;
    	}
    	return 0;
    }
    si vous avez une autre solution pour faire ce programme avec un switch je veux bien savoir comment faire par curiosité

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par tib44 Voir le message
    a c'est pas con

    merci

    Je vais faire comme ça mais il n'y a pas d'autres solutions ?

    edit : mon code marche nickel
    Il y a peut être d'autres moyens de faire. Maintenant l'avantage d'un switch(); est que ca rend le code bien plus lisible.

    Pendant que j'y suis tu devrais borner age. Imagines que l'utilisateur entre -5 !

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 42
    Points : 51
    Points
    51
    Par défaut
    C'est une bonne idée je viens donc de le rajouter dans 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
     
    // TP1_Pb3.cpp*: définit le point d'entrée pour l'application console.
    // Ce programme demande l'age de l'utilisateur puis lui affiche sa catégorie
     
    #include "stdafx.h"
     
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int age = 0;
    	printf("Quel est votre age ?\n");
    	scanf_s("%d", &age);
     
    	do{
    		if (age < 0){
    			printf("L'age saisi est négatif, veuillez entrer un age positif\n");
    			scanf_s("%d", &age);
    		}
    	} while (age < 0);
     
     
    	switch (age)
    	{
     
     
    	case 0:
    	case 1:
    	case 2:
    	case 3:
    	case 4:
    	case 5:
    		printf("Vous ne faites parti d'aucune categorie, vous etes trop jeune\n");
    		break;
     
    	case 6:
    	case 7:
    		printf("Vous faites parti de la categorie Poussin\n");
    		break;
     
    	case 8:
    	case 9:
    		printf("Vous faites parti de la categorie Pupille\n");
    		break;
     
    	case 10:
    	case 11:
    		printf("Vous faites parti de la categorie Minime\n");
    		break;
     
     
    	default:
    		printf("Vous faites parti de la categorie Cadet\n");
    		break;
    	}
    	return 0;
    }

  8. #8
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par tib44 Voir le message
    C'est une bonne idée je viens donc de le rajouter dans 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
    // TP1_Pb3.cpp*: définit le point d'entrée pour l'application console.
    // Ce programme demande l'age de l'utilisateur puis lui affiche sa catégorie
    
    #include "stdafx.h"
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int age = 0;
    	printf("Quel est votre age ?\n");
    	scanf_s("%d", &age);
    
    	do{
    		if (age < 0){
    			printf("L'age saisi est négatif, veuillez entrer un age positif\n");
    			scanf_s("%d", &age);
    		}
    	} while (age < 0);
    ...
    Un scanf_s(); de trop non ? Tu dois pouvoir revoir ce petit algo il me semble...

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 42
    Points : 51
    Points
    51
    Par défaut
    Pour supprimé le scanf_s dont tu me parle il faut que j'initialise age a -1 car si non je ne vais pas rentrer dans le do while qui me demande de rentrer l'age et le problème c'est que si je fais ça l'algo va afficher L'age saisi est négatif, veuillez entrer un age positif avant même que je rentre l'age dans le programme.

    Je me trompe ?

    Tu vois une autre façon de l'améliorer ?

  10. #10
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Et comme ca, qu'en penses-tu ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int _tmain(int argc, _TCHAR* argv[])
    {
      int age = 0;
     
      do
      {
        printf("Quel est votre age ?\n");
        scanf_s("%d", &age);
     
        if (age < 0)
          printf("L'age saisi est négatif, veuillez entrer un age positif\n");
      } while (age < 0);

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 42
    Points : 51
    Points
    51
    Par défaut
    Je viens de le tester il y a un problème quand je lance le programme et que je met directement -5 la première fois qu'il me demande mon age il me redemande mon age sans me prévenir que j'ai rentrer a un age négatif c'est seulement quand je rentre une deuxième fois un nombre négatif dans mon test j'ai rerentré -5 et la il m'a affiché, L'age saisi est négatif..
    Quel est votre age ?

    Edit : en fait je crois que c'étais moi qui avais fais une erreur je vais vérifier

    Edit 2 : j'avais bien loupé un truc j'avais oublié d'enlever le code entre int age et do du coup il ne rentrait pas tout de suite dans le do while
    Ta solution marche très bien merci

  12. #12
    Membre habitué
    Homme Profil pro
    Collégien
    Inscrit en
    Septembre 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Septembre 2014
    Messages : 65
    Points : 158
    Points
    158
    Par défaut
    Sinon simplement faire
    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
     switch (age)
        {
         case 0 ... 5:
          printf("Vous ne faites parti d'aucune categorie, vous etes trop jeune\n");
          break;
         case 6 ... 7:
          printf("Vous faites parti de la categorie Poussin\n");
          break;
        case 8 ... 9:
          printf("Vous faites parti de la categorie Pupille\n");
          break;
        case 10 ... 11:
          printf("Vous faites parti de la categorie Minime\n");
          break;
        default:
          printf("Vous faites parti de la categorie Cadet\n");
          break;
        }
    ce qui est bien plus élégant que d'énumérer toutes les valeurs possibles que l'age peut prendre

  13. #13
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Lokicoule Voir le message
    Sinon simplement faire
    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
     switch (age)
        {
         case 0 ... 5:
          printf("Vous ne faites parti d'aucune categorie, vous etes trop jeune\n");
          break;
         case 6 ... 7:
          printf("Vous faites parti de la categorie Poussin\n");
          break;
        case 8 ... 9:
          printf("Vous faites parti de la categorie Pupille\n");
          break;
        case 10 ... 11:
          printf("Vous faites parti de la categorie Minime\n");
          break;
        default:
          printf("Vous faites parti de la categorie Cadet\n");
          break;
        }
    ce qui est bien plus élégant que d'énumérer toutes les valeurs possibles que l'age peut prendre
    Je plussois
    Je ne connaissais pas cette possibilité.

  14. #14
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 109
    Points : 168
    Points
    168
    Par défaut
    Citation Envoyé par Lokicoule Voir le message
    Sinon simplement faire
    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
     switch (age)
        {
         case 0 ... 5:
          printf("Vous ne faites parti d'aucune categorie, vous etes trop jeune\n");
          break;
         case 6 ... 7:
          printf("Vous faites parti de la categorie Poussin\n");
          break;
        case 8 ... 9:
          printf("Vous faites parti de la categorie Pupille\n");
          break;
        case 10 ... 11:
          printf("Vous faites parti de la categorie Minime\n");
          break;
        default:
          printf("Vous faites parti de la categorie Cadet\n");
          break;
        }
    ce qui est bien plus élégant que d'énumérer toutes les valeurs possibles que l'age peut prendre

    *
    Cette syntaxe n'est pas permise par tous les compilateurs.

  15. #15
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    En effet, c'est la première fois que je la vois.
    Ce n'est d'ailleurs pas standard, d'après l'option -pedantic de GCC. Mais à part ça, il accepte sans broncher (version 4.7.3).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Donc, ce n'est même pas du C99 ou C11, mais du GNU pur?
    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.

  17. #17
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    J'ai essayé les flags -std=c89, -std=c90, -std=c99 et à chaque fois, cela passait.
    Et malheureusement, je ne sais pas quoi utiliser pour trouver dans Google cette syntaxe et son origine.
    Lorsque je mets -pedantic :
    case.c:7:7: warning: range expressions in switch statements are non-standard [-pedantic]
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  18. #18
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Et malheureusement, je ne sais pas quoi utiliser pour trouver dans Google cette syntaxe et son origine.
    Google --> "gnu extensions c switch case" --> https://gcc.gnu.org/onlinedocs/gcc/Case-Ranges.html en 2e réponse

    Cette solution a base de switch et énormément de cases est absolument hideuse à mon goût. Elle est surtout dure à maintenir et sujette à erreur (imaginons une catégorie 20-50 ans !!!).

    La meilleure solution est de passer dans une série de if / else if / else (et j'insiste sur les else if pour ne pas avoir une indentation comme dans le message #1) et que le test soit fait dans une fonction. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool isPoussin(unsigned int age)
    {
        return age == 6 || age == 7; // Encore mieux si on mets les bornes dans des #define
    }
    Puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    if(isPoussin())
    {
        puts("C'est un poussin !");
    }
    else if(isCadet())
    {
    ....
    }
    else
    {
    ...
    }
    PS : du coup j'ai testé la nouvelle fonctionnalité de blog avec ce sujet : http://www.developpez.net/forums/blo...ges-valeurs-c/

  19. #19
    Membre averti
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Points : 411
    Points
    411
    Par défaut
    Citation Envoyé par Bktero Voir le message
    (...)
    Cette solution a base de switch et énormément de cases est absolument hideuse à mon goût. Elle est surtout dure à maintenir et sujette à erreur (imaginons une catégorie 20-50 ans !!!).

    La meilleure solution est de passer dans une série de if / else if / else (et j'insiste sur les else if pour ne pas avoir une indentation comme dans le message #1) et que le test soit fait dans une fonction.
    (...)
    Je suis d'accord avec toi, cependant, faire une fonction pour chaque catégorie me semble lourd et redondant, de même l'affichage.

    Pour éviter cela, je mettrai une partie de l'intelligence nécessaire dans des données, comme cela.

    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
    #include <stdio.h>
     
    enum age_lim {
    	LIM_POUSSIN = 6,
    	LIM_PUPILLE = 8,
    	LIM_MINIME = 10,
    	LIM_CADET = 12
    };
     
    enum age_cat {
    	TROP_JEUNE, POUSSIN, PUPILLE, MINIME, CADET, MAX_AGE_CAT
    };
    static const char* const arr_cat[MAX_AGE_CAT] = { "trop jeune", "poussin",
    		"pupille", "minime", "cadet" };
     
    enum age_cat get_category(int age) {
    	if (age < LIM_POUSSIN)
    		return TROP_JEUNE;
    	else if (age >= LIM_POUSSIN && age < LIM_PUPILLE)
    		return POUSSIN;
    	else if (age >= LIM_PUPILLE && age < LIM_MINIME)
    		return PUPILLE;
    	else if (age >= LIM_MINIME && age < LIM_CADET)
    		return MINIME;
    	else if (age >= LIM_CADET)
    		return CADET;
    	/* ce return ne devrait jamais être traité */
    	return -1;
    }
     
    int main(void) {
    	int age = 0;
    	puts("Age ?");
    	/* scanf pas terrible mais simple pour cet exemple */
    	scanf("%d", &age);
     
    	printf("Il a %d ans ?\n", age);
    	printf("Cet âge correspond à la catégorie : %s\n",
    			arr_cat[get_category(age)]);
     
    	return 0;
    }
    Une seule fonction est, à mon avis, suffisante et plus claire pour traiter la détermination de la catégorie, qui peut être utilisée comme un index vers les données organisées sous forme de tableau, séparant ainsi le code des données.

    L'enum age_cat permet de gérer non seulement la désignation numérique des catégories, mais aussi le nombre de catégories maximales, grâce à la dernière entrée MAX_AGE_CAT, qui est déterminée à la compilation et permet de borner le tableau de chaînes C, le tout fonctionnant en C89.

    Enfin, lorsque l'on veut classer quelque chose dans une catégorie, dans un programme réel, c'est rarement juste pour afficher un message, mais pour opérer des traitements différenciés en fonction de la catégorie en question, le cas échéant à plusieurs endroits du programme. Donc, pouvoir obtenir et stocker la catégorie une bonne fois pour toutes est également utile pour l'élaboration d'un programme réel et c'est une autre bonne raison de créer une fonction get_category(), à mon sens.


    Eks

  20. #20
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Ta solution est efficace pour ce problème donné, sans doute plus que la mienne.

    Elle me semble en revanche moins généraliste : comment faire pour dire "si c'est un cadet ou un minime, alors....." ? Tu vas te retrouver à tester le retour de getCategory() contre plusieurs valeurs pour faire ton test alors que tu pourrais appeler mes fonctions qui te renvoie un booléen directement et faire un OU logique entre les retours. Si pour chaque catégorie, tu souhaites non pas afficher un texte mais faire différentes actions, tu vas faire un tableau de pointeurs de fonctions ; si ailleurs, tu veux faire une autre série d'actions, tu vas faire un second tableaux de pointeurs de fonctions ? Si plusieurs catégories répondent à la même action, tu vas enregistrer plusieurs fois le même pointeur ?

    Après, je ne suis pas fan de ce genre d'utilisation des énumérations. Pour les limites, tu testes un int contre un type énuméré, certains compilateurs peuvent te générer des warnings, c'est embêtant. Enfin, un type énuméré avec un "MAX_AGE" pour connaitre le nombre de valeurs dans l'énumération pour dimensionner un tableau est sans doute pratique, mais (et ce n'est qu'un point de vue personnel) me semble peu rigoureux sémantiquement. Une énumération DAY_OF_WEEK ne se termine pas par "le plus grand des jours", par exemple. Ca peut simplifier la maintenance, mais cela ne devrait pas être visible pour l'utilisateur final du code.

    Je ne dis pas que l'approche pas lookup table est mauvaise, elle peut se réléver très utile. Une fonction pour récupérer la catégorie et attaquer une table de correspondance est très puissante. En revanche, j'aurai personnellement préféré encapsuler la récupération du texte dans une fonction const char* getCategoryName(unsigned int age). De plus, l'approche par table n'est pas incompatible avec des if / else. D'ailleurs, au final, tu pourrais coder ta fonction getCategory() avec mes fonctions et on pourrait avoir les 2 mécanismes à disposition.

Discussions similaires

  1. [Language]Probleme de switch case
    Par nana1 dans le forum Langage
    Réponses: 20
    Dernier message: 17/11/2005, 00h49
  2. switch case pour deux variable en meme temps
    Par petitours dans le forum C
    Réponses: 3
    Dernier message: 06/11/2005, 19h20
  3. [Tableaux] Problème avec Switch case
    Par philippef dans le forum Langage
    Réponses: 4
    Dernier message: 07/09/2005, 16h37
  4. probleme gestion condition switch - case
    Par DarkMax dans le forum Langage
    Réponses: 5
    Dernier message: 07/09/2005, 14h25
  5. [Language] aide sur les switch case
    Par pouss dans le forum Langage
    Réponses: 3
    Dernier message: 05/04/2005, 11h34

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