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 :

Imbriquer plusieurs switch ?


Sujet :

C

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Points : 241
    Points
    241
    Par défaut Imbriquer plusieurs switch ?
    Bonjour, à tous,
    j'ai juste une petite question :
    - peut - on imbriquer plusieurs switch - case l'un dans l'autre ?
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    switch ( reponse1) {
    case (1) :
        printf "eee";
    case (2):
        printf "ffff";
             switch (reponse2) {
              case(1):
            printd "test réussi");
     
    etc..etc..
    Ps : le code que j'indique ci dessus n''est qu'un exemple pour simplifier ma question..Il est claire qu'en temps que tel le code n'est pas bon...

    Merci d'avance
    a+

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Un switch définissant une instruction, tu peux mettre un switch à n'importe quel endroit où une instruction peut apparaître, point final. Peut-être que ceci pourra t'aider : Les instructions du langage C

  3. #3
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Bonjour,

    la preuve par l'exemple :

    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
    #include <stdio.h>
     
    int main(void)
    {
            int a = 0, b = 1;
            switch(a) {
            case 0 :
                    switch(b) {
                    case 1 :
                            printf("Les switch imbriqués, ça fonctionne.\n");
                            break;
                    default :
                            printf("Les switch imbriqués, ça ne fonctionne pas.\n");
                    }
                    break;
            default :
                    printf("Les switch imbriqués, ça ne fonctionne pas.\n");
            }
            return 0;
    }
    Résultat :
    Les switch imbriqués, ça fonctionne.
    Pourquoi pensais-tu que l'imbrication des switch (ou autre conditionnelles) ne fonctionnerait pas? Il n'y a aucune raison à cela

    ++

    €dit : grilled
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Points : 241
    Points
    241
    Par défaut
    Oui je pensaits bien que l'on pouvait imbirquer..seulement voilà j'ai un message d'"erreur, non pas à la compilation du programme mais au moment de l'exécution qui me dit :
    line 103: 16110 Erreur de segmentation "$pgm" "$@"
    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
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    /*
     * 
     */
    int main(int argc, char** argv) {
     
     
     
        int xPrincipal;                  // Choix du menu principal
        int xInteret;                    // Choix du menu intérêts
     
                        float CapitalPrete;         // Variable du montant prêté, placé..
                        int nbAnneesPlacement;      // Variable de la durée     
                        float TauxPlacement;        // Variable du taux de placement
                        float InteretSimple;        // Variable de résultat
        // printf("\x1B[2J" ); // Pour effacer l'écran
     
        system("clear");
     
        printf("\n\n\n\n\n");
        printf("        Intérêts  =   1\n");
        printf("        Taux      =   2\n");
        printf("        Crédits   =   3\n");
     
        printf("\n\n");
        printf("\t\t Indiquez votre choix : ");
     
        //ChoixMenuPrincipal = getchar();
        scanf("%d",&xPrincipal);
     
     
        switch (xPrincipal) {
     
            case(1):
     
                system("clear");
     
                printf("\n\n");
                printf("Calcul de l'intérêt simple  = 1\n");
                printf("Calcul de l'intérêt sur une durée de placement = 2\n");
                printf("\n\n");
                printf("Retour Menu Principal = 0\n\n");
                printf("Sélectionnez votre choix : ");
     
               // ChoixMenuInteret = getchar();
                scanf("%d",xInteret);
     
            break; 
    ////////////////// Calcul sur les intérêt /////////////////////////////////            
                switch (xInteret) {
     
                    case(0):
                        printf("Ok -> retour menu principal\n");
     
                    break;
     
                    case (1) :
                    //  float CapitalPrete;         // Variable du montant prêté, placé..
                     //   int nbAnneesPlacement;      // Variable de la durée     
                     //   float TauxPlacement;        // Variable du taux de placement
                     //    float InteretSimple;        // Variable de résultat
     
                        printf("CACUL DE L'INTERET SIMPLE\n");
                        printf("\n\n\n");
                        printf("Montant du Capital ; \n");
                        scanf("%f",CapitalPrete);
                        printf("Nombre année(s) de la durée du prêt ( ou du placement)");
                        scanf("%d",nbAnneesPlacement);
                        printf("Taux du prêt ( ou du placement) :");
                        scanf("%f",TauxPlacement);
                        InteretSimple = ((CapitalPrete*TauxPlacement*nbAnneesPlacement)/100);
     
                        printf("Un capital de %f",CapitalPrete);
                        printf("placé ou prêté pendant %d", nbAnneesPlacement);
                        printf("an(s), au taux de %f", TauxPlacement);
                        printf(" %% ");
                        printf("fournira au prêteur un intérêt égal à : %f", InteretSimple);
                        printf(" %%\n");
     
                    break;        
     
                }
     
        }
     
     
     
     
     
        //return (EXIT_SUCCESS);
        return (0);
    }

    est ce la redondance d'utilisation du case (1) qui peuts créer une confusion entre les différents switch case..bien que celà ne devrait pas...?

    A savoir je suis sous linux et j'utilise netbeans comme IDE...

  5. #5
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    De trois choses l'une :

    1. Dans les case, pas besoin de mettre de parenthèses autour de ta valeur, donc case 1
    2. Tu fais des scanf sur des variables non déclarées, de plus, il manque le passage par référence lors du scan, ce qui n'est évidemment pas bon
    3. Pense à purger le flux d'entrée...


    Corrige ça et t'y verras plus clair
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  6. #6
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Autre chose encore, ta fonction "CalculInteret" ne sera jamais appelée étant donné que tu place un "break" juste avant

    ++
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Points : 241
    Points
    241
    Par défaut
    Je viens de rectificer le code par rapport à case, ainsi que suppresion du break..

    Tu fais des scanf sur des variables non déclarées, de plus, il manque le passage par référence lors du scan, ce qui n'est évidemment pas bon
    C'est pas bon ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int xInteret;                    // Choix du menu intérêts
    ...
    ...
    ...
     
     scanf("%d",xInteret);

    3. Pense à purger le flux d'entrée...
    Comment et pourquoi purger ?
    a+

  8. #8
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    La réponse à tes questions se trouvent dans ce post très bien détaillé par Thierry, si tu as des questions sur le code, n'hésitent pas à les poser

    Lien : http://www.developpez.net/forums/sho...84&postcount=4

    P.S : bien sûr dans le cas du post, on parle d'un tableau, mais le principe de récupération du scanf reste le même, faut juste l'adapter à ton cas
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Points : 241
    Points
    241
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int rv; /* -tc- valeur de retour de scanf() */
     
    rv = scanf("%d", &n);
    Oui celà fonctionne dans ce sens...mais n'est ce pas quelque part alourdir le code ( alourdir n'est pas le mot approprié..mais je dirais plutôt compliquer légèrement...) pour le même résultat ?

    En relisant une xème fois, je viens de m'apercevoir que j'ai oublié l'opérateur :
    que j'ai remplacé par :

    Et celà fonctionne à présent...
    Fallait la trouver celle - là...

    Encore merci pour l'intervention...
    a+

  10. #10
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Ca n'alourdi ou complique pas spécialement le code, c'est juste une sécurité supplémentaire que tout c'est bien passé, mais tu peux t'en passer

    Pour l'oubli du &, c'est ce que je tentais de t'expliquer quand je disais qu'il faut passer ta variable par référence, désolé si tu ne l'as pas compris en tant que tel

    Si ton souci est clic sur le bouton approprié en bas de page



    [edit] J'avais même pas vu que t'était un "voisin"
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Points : 241
    Points
    241
    Par défaut
    Juste pour terminer...
    Je suppose que le & est souvent oublié.. un moyen quelconque de le détecter facilement.. ?
    Car après x lecture + déboguage je n'avait toujours pas trouvé..En tous les cas maintenant je ferais un peu plus attention...

  12. #12
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Non, il n'y a pas de moyen "spécial" pour détecter ça, le meilleur moyen restant ton attention avant tout

    Seul moment ou tu peux vraiment le voir, c'est lors de l'exécution si tu as un résultat inattendu...

    ++
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Points : 241
    Points
    241
    Par défaut
    ok, merci
    a+

  14. #14
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Telemak Voir le message
    Je suppose que le & est souvent oublié.. un moyen quelconque de le détecter facilement.. ?
    En réglant le compilateur en mode "strict", il peut être possible de détecter ce genre d'erreur, mais ca depends du compilateur utilisé.

  15. #15
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par buchs Voir le message
    De trois choses l'une :
    Euh, non ! Les 3 points sont importants ...
    Pas de Wi-Fi à la maison : CPL

  16. #16
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par buchs Voir le message
    Pour l'oubli du &, c'est ce que je tentais de t'expliquer quand je disais qu'il faut passer ta variable par référence,
    Il n'y a pas de 'référence' en C. C'est justement pour ça qu'il faut passer la valeur de l'adresse explicitement.
    Pas de Wi-Fi à la maison : CPL

  17. #17
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Telemak Voir le message
    Je suppose que le & est souvent oublié.. un moyen quelconque de le détecter facilement.. ?
    http://emmanuel-delahaye.developpez....tm#cfg_compilo

    Mais rien ne remplace la maitrise du langage. En C, on peut pas se contenter de bricoler.
    Pas de Wi-Fi à la maison : CPL

  18. #18
    Membre actif
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Points : 241
    Points
    241
    Par défaut
    ok, impecable...j'ai rajouté l'option : -Wunreachable-code sous netbeans..et il me détecte l'erreur au moment de la compilation...

    a+

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

Discussions similaires

  1. requetes imbriquées : plusieurs colonnes
    Par AliceG dans le forum Requêtes
    Réponses: 5
    Dernier message: 19/04/2013, 11h50
  2. Imbriquer plusieurs swf à la suite
    Par biguiz dans le forum ActionScript 3
    Réponses: 3
    Dernier message: 11/03/2010, 13h05
  3. comment imbriquer plusieurs evenements
    Par nazimb dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 05/07/2006, 14h57
  4. [vb6] Imbriquer plusieurs tableaux
    Par Asdorve dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 22/06/2006, 16h49

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