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 : où est l'erreur ?


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 165
    Points : 76
    Points
    76
    Par défaut switch : où est l'erreur ?
    Bonjour tout le monde

    j'ai mis en place un code pour tester plusieurs conditions dans un même exercice le problème que je rencontre se trouve au niveau d'un switch qui m'affiche une erreur incompréhensible :
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
     
    {
     
    long 	choix , bools , cat_produit , quantite , remise , total_ttc;
     
    	choix 		= 0 ;
    	bools 		= 0 ;
    	cat_produit 	= 0 ;
    	quantite 	= 0 ; 
    	remise 		= 0 ;
         	total_ttc 	= 0 ;
     
    printf("voici les produits que vous pouvez acheter\n");
    printf("=== Menu ===");
    printf("1 - Barette mémoire\n");
    printf("2 - Disques durs\n");
    printf("3 - Moniteur LCD\n");
    printf("4 - Processeurs\n");
     
    scanf("%d",&choix);
     
    switch (choix);
    	{
    case 1:
    printf("vous avez choisi des barettes de 512 mo à 250 dh\n");
    cat_produit = 1;
    break;
     
    case 2:
    printf("vous avez choisi des disques durs 160 go à 600 dh\n");
    cat_produit = 2;
    break;
     
    case 3:
    printf("vous avez choisi des moniteurs lcd à 1600 dh\n");
    cat_produit = 3;
    break;
     
    case 4:
    printf("vous avez choisi des processeurs valant 2500 dh\n");
    cat_produit = 4;
    break;
     
    default:
    printf("vous avez choisi un produit inexistant\n");
    //break;
    	}
     
    printf("combien vous en voulez\n");
    scanf("%d",&quantite);
     
    if (cat_produit = 1)
    	{
    total_ttc = 250*quantite;
    	}
     
    else if (cat_produit = 2)
    	{
    total_ttc = 600*quantite;
    	}
     
    else if (cat_produit = 3)
    	{
    total_ttc = 1600*quantite;
    	}
     
    else if (cat_produit = 4)
    	{
    total_ttc = 2500*quantite;
    	}
     
    else
    	{
    printf("vous ne pouvez acheter un produit inexistant");
    	}
     
    remise = (total_ttc >= 1000) ? -200 : 0;
     
     
    if (remise < 0)
    	{
    bools = 1;
    	}
     
    else 
    	{
    bools = 0;
    	}
     
    if(bools)
    	{
    printf("vous avez eu droit à une remise de 200 dh\n");
    printf("votre tolat ttc est de : %d\n",total_ttc+remise);
    printf("merci pour votre visite chez abdelilah software\n");
    	}
     
    else	
    	{
    printf("votre tolat ttc est de : %d\n",total_ttc+remise);
    printf("merci pour votre visite chez abdelilah software\n");
     
    	}
     
    return 0;
     
    }
    le code en lui même aurait pu être simplifié au maximum mais j'ai fait en sorte pour tester plusieurs conditions.

    gcc m'affiiche cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    abdel@ubuntu:~/dev-c$ gcc -o condition_application condition_application.c
    condition_application.c: In function ‘main’:
    condition_application.c:28: error: case label not within a switch statement
    condition_application.c:31: error: break statement not within loop or switch
    condition_application.c:33: error: case label not within a switch statement
    condition_application.c:36: error: break statement not within loop or switch
    condition_application.c:38: error: case label not within a switch statement
    condition_application.c:41: error: break statement not within loop or switch
    condition_application.c:43: error: case label not within a switch statement
    condition_application.c:46: error: break statement not within loop or switch
    condition_application.c:48: error: ‘default’ label not within a switch statement
    abdel@ubuntu:~/dev-c$
    pouvez s.v.p m'aider car je ne vois pas d'où viendrait l'erreur.
    merci d'avance.

  2. #2
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    retire le ';'
    et corrige le reste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    test2.c:23: attention : format «%d" expects type «int *", but argument 2 has type «long int *"
    test2.c:53: attention : format «%d" expects type «int *", but argument 2 has type «long int *"
    test2.c:55: attention : parenthèses suggérées autour de l'affectation utilisée comme valeur de vérité
    test2.c:60: attention : parenthèses suggérées autour de l'affectation utilisée comme valeur de vérité
    test2.c:65: attention : parenthèses suggérées autour de l'affectation utilisée comme valeur de vérité
    test2.c:70: attention : parenthèses suggérées autour de l'affectation utilisée comme valeur de vérité
    test2.c:95: attention : format «%d" expects type «int", but argument 2 has type «long int"
    test2.c:101: attention : format «%d" expects type «int", but argument 2 has type «long int"
    test2.c:77: attention : ne sera jamais exécuté
    test2.c:70: attention : ne sera jamais exécuté
    test2.c:65: attention : ne sera jamais exécuté
    test2.c:60: attention : ne sera jamais exécuté
    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
    if (cat_produit = 1)
       {
          total_ttc = 250 * quantite;
       }
     
       else if (cat_produit = 2)
       {
          total_ttc = 600 * quantite;
       }
     
       else if (cat_produit = 3)
       {
          total_ttc = 1600 * quantite;
       }
     
       else if (cat_produit = 4)
       {
          total_ttc = 2500 * quantite;
       }
    j'imagine que tu voulais plutôt écrire
    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
    if (cat_produit == 1)
       {
          total_ttc = 250 * quantite;
       }
     
       else if (cat_produit == 2)
       {
          total_ttc = 600 * quantite;
       }
     
       else if (cat_produit == 3)
       {
          total_ttc = 1600 * quantite;
       }
     
       else if (cat_produit == 4)
       {
          total_ttc = 2500 * quantite;
       }
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 165
    Points : 76
    Points
    76
    Par défaut
    merci merci

    ça a bien marché une erreur de débutant

  4. #4
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 165
    Points : 76
    Points
    76
    Par défaut
    c'est vrai tu as raison j'y ai pas fait attention .

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 165
    Points : 76
    Points
    76
    Par défaut
    Au fait comment fait on pour récupérer la valeur sortie par switch puisque toute
    fonction renvoie une valeur.

    sous linux c'est echo $? , si ça renvoie un zéro ça marche .

    Quelqu'un aurait une réponse s.v.p?

    merci d'avance.

  6. #6
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    switch n'est pas une fonction.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  7. #7
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 165
    Points : 76
    Points
    76
    Par défaut
    donc je suppose que c'est impossible ?

    pourvue que ça soit le contraire

  8. #8
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Le switch est une simple instruction conditionnelle qui ne renvoi rien.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  9. #9
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 165
    Points : 76
    Points
    76
    Par défaut
    justement je cherche un moyen pour stopper complètement le programme si swicth n'est pas vérifiée.

    Bien switch doit exécuter default mais en même temps arrêter le programme
    car les autres étape n'aurons plus lieu d'être.

    pouvez m'aider sur ce coup s.v.p.

    merci d'avance.

  10. #10
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    qu'entends tu par switch non vérifié?
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  11. #11
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 165
    Points : 76
    Points
    76
    Par défaut
    c.a.d que le client a choisi un produit inexistant,comment faire pour qu'après
    l'affichage du printf suivant le default le programme se termine totalement.

  12. #12
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    étant donné que tu es dans le main() un simple return 0; suffira.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  13. #13
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 165
    Points : 76
    Points
    76
    Par défaut
    merci

    que dieu vous montre le droit chemin (je suis vraiment sincère)c'est le meilleur
    remerciement que je puisse t'offrir.

    je m'en vais tester.

  14. #14
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 165
    Points : 76
    Points
    76
    Par défaut
    suuuuuper ça marche.

    au fait j'avais également pensé à exit était ce un bon choix ?

  15. #15
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Je dirais que les 2 fonctionnent mais que les 2 sont des mauvais choix : comme suggère notre ami Emmanuel Delahaye il est préférable qu'il n'y ai qu'un seul return (ou exit() ) par fonction.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  16. #16
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    tu peux le tourner différemment pour éviter plusieurs return :
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    #include <stdio.h>
    #include <stdlib.h>
     
    long saisie (char const *text);
     
    int main (void)
    {
       long choix = saisie ("voici les produits que vous pouvez acheter\n"
                            "=== Menu ===\n"
                            "1 - Barette mémoire\n"
                            "2 - Disques durs\n"
                            "3 - Moniteur LCD\n"
                            "4 - Processeurs");
     
       if ((choix < 5) && (choix > 0))
       {
          long total_ttc = 0;
          long remise;
     
          switch (choix)
          {
          case 1:
             puts ("vous avez choisi des barettes de 512 mo à 250 dh");
             total_ttc = 250;
             break;
     
          case 2:
             puts ("vous avez choisi des disques durs 160 go à 600 dh");
             total_ttc = 600;
             break;
     
          case 3:
             puts ("vous avez choisi des moniteurs lcd à 1600 dh");
             total_ttc = 1600;
             break;
     
          case 4:
             puts ("vous avez choisi des processeurs valant 2500 dh");
             total_ttc = 2500;
             break;
          }
     
          total_ttc *= saisie ("combien vous en voulez");
          remise = (total_ttc >= 1000) ? -200 : 0;
     
          if (remise < 0)
          {
             printf ("vous avez eu droit à une remise de 200 dh\n"
                     "votre tolat ttc est de : %ld\n"
                     "merci pour votre visite chez abdelilah software\n",
                     total_ttc + remise);
          }
          else
          {
             printf ("votre total ttc est de : %ld\n"
                     "merci pour votre visite chez abdelilah software\n",
                     total_ttc + remise);
          }
       }
       else
       {
          puts ("vous ne pouvez acheter un produit inexistant");
       }
     
       return 0;
    }
     
    long saisie (char const *text)
    {
       int ret;
       long temp;
       do
       {
          puts (text);
          ret = scanf ("%ld", &temp);
          scanf ("%*[^\n]"), getchar ();
       }
       while (ret != 1);
       return temp;
    }
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  17. #17
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Avril 2007
    Messages : 31
    Points : 29
    Points
    29
    Par défaut
    J'étais aussi pratiquant de la religion du return unique, mais après avoir lu les scriptures sacrées du prophète Tannenbaum (code source de Minix), je trouve que traiter les cas d'erreurs au début de la fonction et retourner immédiatement n'est pas si mal que cela. Donc, en reprenant le code déjà publié dans ces colonnes, cela donne 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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
     
    #define ERROR_CODE -1
     
    long saisie (char const *text);
     
    int main (void)
    {
       long total_ttc = 0;
       long remise;
       long choix = saisie ("voici les produits que vous pouvez acheter\n"
                            "=== Menu ===\n"
                            "1 - Barette mémoire\n"
                            "2 - Disques durs\n"
                            "3 - Moniteur LCD\n"
                            "4 - Processeurs");
     
       if (choix <= 0 || choix > 4) 
       {
          puts ("vous ne pouvez acheter un produit inexistant");
          return ERROR_CODE;
       }
     
       assert (choix >= 0 && choix <= 4);
       switch (choix)
       {
          case 1:
             puts ("vous avez choisi des barettes de 512 mo à 250 dh");
             total_ttc = 250;
             break;
     
          case 2:
             puts ("vous avez choisi des disques durs 160 go à 600 dh");
             total_ttc = 600;
             break;
     
          case 3:
             puts ("vous avez choisi des moniteurs lcd à 1600 dh");
             total_ttc = 1600;
             break;
     
          case 4:
             puts ("vous avez choisi des processeurs valant 2500 dh");
             total_ttc = 2500;
             break;
       }
     
       total_ttc *= saisie ("combien vous en voulez");
       remise = (total_ttc >= 1000) ? -200 : 0;
     
       if (remise < 0)
       {
          printf ("vous avez eu droit à une remise de 200 dh\n"
                   "votre tolat ttc est de : %ld\n"
                   "merci pour votre visite chez abdelilah software\n",
                    total_ttc + remise);
       }
       else
       {
          printf ("votre total ttc est de : %ld\n"
                   "merci pour votre visite chez abdelilah software\n",
                   total_ttc + remise);
       }
     
       return 0;
    }
     
    long saisie (char const *text)
    {
       int ret;
       long temp;
       do
       {
          puts (text);
          ret = scanf ("%ld", &temp);
          scanf ("%*[^\n]"), getchar ();
       }
       while (ret != 1);
       return temp;
    }

  18. #18
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par DavidDeharbe Voir le message
    je trouve que traiter les cas d'erreurs au début de la fonction et retourner immédiatement n'est pas si mal que cela.
    Sûr un petit code comme ça ça ne pose pas de problème mais sur un gros source tu oublis à coup sûr de désallouer quelque chose, ou libérer une ressource...
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  19. #19
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 165
    Points : 76
    Points
    76
    Par défaut
    bonsoir

    je suis vraiment content et reconnaissant concernant ces réponses toutefois pour ne pas vous mentir je n'ai vraiment pas compris les deux derniers posts

    normale je ne suis pas encore de ce niveau en plus même si le code montre le contraire j'essaie toujours d'utiliser le code le plus facile quit à ce qu'il soit classic.

  20. #20
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Avril 2007
    Messages : 31
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    tu oublies à coup sûr de désallouer quelque chose, ou libérer une ressource...
    Oui, de toutes façons, cela arrive, où que je mette les "return". AMHA, le fait de ne pas casser le flot d'exécution permet surtout de simplifier les preuves de programme, mais ce n'est pas souvent qu'on en arrive là, hélas...

    D'autre part valgrind est mon ami...

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 30/01/2006, 14h21
  2. Où est l'erreur?
    Par Paulinho dans le forum C++
    Réponses: 3
    Dernier message: 26/10/2005, 09h48
  3. [VB.NET] Pagination DataGrid (où est l'erreur?)
    Par franculo_caoulene dans le forum ASP.NET
    Réponses: 2
    Dernier message: 25/10/2004, 11h46
  4. Ou est l'erreur ?
    Par Antoine NSG dans le forum Langage SQL
    Réponses: 6
    Dernier message: 08/09/2004, 10h56
  5. [Erreur] Quel est cette erreur?
    Par netah25 dans le forum C++Builder
    Réponses: 3
    Dernier message: 11/08/2004, 10h16

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