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 :

Menu switch avec énumération


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 13
    Par défaut Menu switch avec énumération
    Bonjour tout le monde,

    Je tente depuis deux jours de réaliser une énumération et ensuite l'utilisé dans un menu. Cependant, malgré toutes mes bidouilles je n'obtient que des erreurs de compilations.

    Voilà le code que j'utilise pour réaliser mon menu et cela de manière simpliste sans utilisé l'énumération que je définis au début. Ce code compile.

    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
    typedef enum Figure Figure;
    	enum Figure
    		{
    			POINT, CERCLE, TRIANGLE
    		};
     
     
    int saisirFigure()
    	{
    		int choixFigure;
     
    		while (choixFigure < 0 || choixFigure > 2)
    		{
    			printf("Figures disponibles :\n");
    			printf("1 : Point\n");
    			printf("2 : Cercle\n");
    			printf("3 : Triangle\n");
    			printf("Votre choix ?");
    			scanf("%d", &choixFigure);
    		}
     
    		return choixFigure;
    	}
     
     
     
     
     
     		saisirFigure();
     
     
     				switch (saisirFigure())
    		{
    			case 1:
    				printf("Vous avez choisi la figure Point\n");
    					break;
    			case 2:
    				printf("Vous avez choisi la figure Cercle\n");
    					break;
    			case 3:
    				printf("Vous avez choisi la figure Triangle \n");
    					break;
    			default: 
                	printf ("Figure inconnue\n"); 
                		break; 
    		}
     
      		return 0;
      	}
    Je ne vois vraiment pas comment faire, tous les exemples dont j'ai essayé de m'inspirer n'ont pas vraiment aider.

    Est ce que quelqu'un pourrait m'expliquer la marche à suivre?

    Merci d'avance.

  2. #2
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Dans ta fonction int saisirFigure() tu utilises dans le while la variable choixFigure sans lui avoir attribut de valeur (par saisi de l'utilisateur).
    De plus dans ton choix de figure, on ne peux jamais choisir de triangle d'après ta condition:
    Par contre on peut saisir un 0 qui correspond à aucune figure:

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 13
    Par défaut
    Citation Envoyé par LinuxUser Voir le message
    Dans ta fonction int saisirFigure() tu utilises dans le while la variable choixFigure sans lui avoir attribut de valeur (par saisi de l'utilisateur).
    Pourtant il y a un scanf("%d", &choixFigure) à la fin du while pour y stocker le choix de l'utilisateur.

    Je ne comprend pas

  4. #4
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Oui mais au moment du while, choixFigure n'a pas de valuer.
    Cela aurait pu marcher avec un do{} while(); du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      int choixFigure;
     
     do
    {
      printf("Figures disponibles :\n");
      printf("1 : Point\n");
      printf("2 : Cercle\n");
      printf("3 : Triangle\n");
      printf("Votre choix ?");
      scanf("%d", &choixFigure);
    }while (choixFigure <= 0 || choixFigure > 3);

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 13
    Par défaut
    Ok, je ce que tu veux dire.

    C'est juste que déjà à la base je ne vois pas comment intégrer l'énumération à mon menu et surtout quelle sera la différence fondamentale avec le fait de laisser mon menu comme je l'ai fait avant.

    Est ce que tu pourrais, si tu as le temps, me l'expliquer avec des mots? Je n'arrive pas à assimiler ce concept...

    Merci d'avance.

  6. #6
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 754
    Par défaut
    Hello,

    Pour ton problème, et pour ne rien changer à ton while, le plus simple est de 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
     
     
    int saisirFigure()
    {
    	int choixFigure.
     
            choixFigure=POINT-1;
    	while (choixFigure < POINT || choixFigure > TRIANGLE) {
    		printf("Figures disponibles :\n");
    		printf("1 : Point\n");
    		printf("2 : Cercle\n");
    		printf("3 : Triangle\n");
    		printf("Votre choix ?");
    		scanf("%d", &choixFigure);
    		}
    	return choixFigure;
    }
    Mais voilà, ça va poser un petit problème, puisque POINT vaut 0, et TRIANGLE vaut 2.

    Donc, ou tu changes to input (0: point, 1: cercle, 2: triangle), ou tu changes ton enum:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    enum Figure
    {
    	POINT=1, CERCLE, TRIANGLE
    };

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 13
    Par défaut
    Merci, ça marche plutôt bien en utilisant cette technique.

    J'ai un seul soucis c'est que le printf du default n'apparait pas lorsque je rentre autre chose que les options disponible, le programme renvoie automatiquement le menu sans afficher le message "figure indisponible" entre temps.

    Je souhaiterais aussi savoir, s'il vous plaît, comment empêcher mon programme d'aller dans une boucle infinie lorsque je rentre une valeur autre que integer pour le choix de la figure.

    Merci d'avance.

  8. #8
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 754
    Par défaut
    Une soution est la suivante (mais je n'ai pas l'habitude des entrées console)
    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
    int saisirFigure()
    {
    	int choixFigure;
    	char tmp[5];
     
            choixFigure=POINT-1;
    	while (choixFigure < POINT || choixFigure > TRIANGLE) {
    		printf("Figures disponibles :\n");
    		printf("1 : Point\n");
    		printf("2 : Cercle\n");
    		printf("3 : Triangle\n");
    		printf("Votre choix ?");
    		fgets(tmp,sizeof(tmp),stdin);
    		choixFigure=atoi(tmp);
    		}
    	return choixFigure;
    }

  9. #9
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 130
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    Il y a encore une dernière erreur, c'est que la fonction saisirFigure est appelée deux fois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    saisirFigure();
     
    switch (saisirFigure()){
      case 1:
      printf("Vous avez choisi la figure Point\n");
      break;

  10. #10
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 754
    Par défaut
    Il y a encore une dernière erreur, c'est que la fonction saisirFigure est appelée deux fois.
    Oui, j'avais vu, je comptais y venir par la suite

  11. #11
    Membre expérimenté Avatar de moins1
    Homme Profil pro
    Autre
    Inscrit en
    Février 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autre
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 85
    Par défaut
    Citation Envoyé par mandok Voir le message
    Je souhaiterais aussi savoir, s'il vous plaît, comment empêcher mon programme d'aller dans une boucle infinie lorsque je rentre une valeur autre que integer pour le choix de la figure.
    Merci d'avance.
    Tu vas devoir vider le buffer clavier. Ça pourrait être une fonction dédié, disont: ViderBuffer(). Et pour être sûr que l'entrée est un entier, tu peux vérifier le retour de ton scanf(). La fonction retourne le nombre d'argument correctement lu.

    Genre:
    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
    #include <stdio.h>
     
    void ViderBuffer(void);
    int LireEntier(void);
     
    int main(void)
    {
        int e = LireEntier();
        printf("Entier lu: %d", e);
        return 0;
    }
     
    void ViderBuffer(void)
    {
        int c;
        while((c = getchar()) != '\n' && c != EOF)
            ;
    }
     
    int LireEntier(void)
    {
        int r, e;
        do
        {
            printf("Entrer un entier: ");
            r = scanf("%d", &e);
            ViderBuffer();
        }while(!r); //En ajoutant tes choix d'entier à la condition
        return e;
    }

  12. #12
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1
    Par défaut
    Attention quand même à n'appeler ViderBuffer() que si le buffer stdin n'est pas vide !

    Le problème vient de scanf() : cette fonction n'est pas fait pour des entrées utilisateurs. Mieux vaut utiliser fgets() et en extraire le contenu. Si on y arrive pas, on affiche un message d'erreur. On n'a besoin de vider le buffer clavier que si le buffer de fgets() était trop petit.

  13. #13
    Membre expérimenté Avatar de moins1
    Homme Profil pro
    Autre
    Inscrit en
    Février 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autre
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 85
    Par défaut
    Et tu vérifies comment pour savoir si le buffer est vide? Parce que bon même si le nombre d'argument lu est bon il peut rester des trucs dans le buffer. Par exemple quand scanf() attend un entier et que l'on entre disont: 12abcd la fonction retourne 1.


  14. #14
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1
    Par défaut
    A ma connaissance, tu ne peux pas le savoir sans lire dedans justement. Tu montres bien là un problème de scanf() : elle n'est pas adaptée aux saisies utilisateur. Ou alors, il faut faire des choses bien plus compliquées que juste scanf("%d", &nb) : http://xrenault.developpez.com/tutoriels/c/scanf/

  15. #15
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    Aucun problème, le buffer d'entrée ne sera jamais vide après un simple scanf("%d") : Il y aura toujours au moins le retour à la ligne qui sera toujours présent dans le buffer.
    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.

Discussions similaires

  1. 'switch' avec du String
    Par schousso dans le forum Langage
    Réponses: 12
    Dernier message: 07/07/2015, 14h27
  2. [MySQL] Menu déroulant avec données sql
    Par matt38 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 08/08/2012, 23h40
  3. [PHP-JS] besoin d'aide pour menu déroulant avec lien
    Par Damarus dans le forum Langage
    Réponses: 3
    Dernier message: 06/10/2005, 18h43
  4. Menu déroulant avec préselection automatique
    Par Invité dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 16/06/2005, 12h11
  5. Menu CSS avec bordures - fonctionne firefox, pas ie
    Par Romalafrite dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 21/11/2004, 15h40

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