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 :

Utilisation de valeurs enumérées pour une comparaison


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 63
    Par défaut Utilisation de valeurs enumérées pour une comparaison
    salut a tous
    premierement je voudrais de mander si lorsqu'on utilise le code ci-dessous cest correcte car dessus je ne vois pas d'allocation despace pour la variable test!!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
         typedef char *String;
     
         main()
         {
             String Text = "Thunderbird";
     
             printf("%s\n", Text);
         }
    ensuite j'aime rai que vous m'aidiez a corriger le code suivant afin que je puisse savoir si le string entrer par un utilisateur correspond a l'une des valeurs correspondantes de mon typedef:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef enum {add=0,remov,move,end} todo1;
    .........
    et puis 
    		printf("choose an Action : ");
    		fgets(todo,sizeof todo,stdin);
    		clean(todo);
    pourquoi ne puis je pas declarer une variable todo de type todo1 et ecrire simplement "if (todo==add).." par exempe ???
    merci d'avance!!!!

  2. #2
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 63
    Par défaut
    pour ceux que ca interessent voici l'etat actuel de mon programme
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
     
    static void purge( void)
    {
    	char c;
    	while ( ((c=getchar()) != '\n') && (c!=EOF) )
    	{};
    }
    static void clean(char *chaine)
    {
    	char *p=strchr(chaine,'\n');
    	if (p)
    		*p='\0';
    	else purge();
    }
     
    typedef enum {add=0,move,remove,delete,deleteall,save,end} todo1;
     
    char days[7][10]={"monday","tuesday","wednesday","thursday","friday","saturday","sunday"};
    char months[12][12]={"january","february","march","april","mai","june","july","august","september","october","november","december" };
     
    struct date 
    {
    	char d[10],m[11];
    	unsigned y;
    };
    struct client
    {
    	int num;
    	char name[50],street[60];
    	struct date limit;
    	struct client *prev,*next;
     
    };
    int main(void)
    {
    	char todo[15];
    	int t9;
    	FILE *liste;
     
    	printf(" CREATING A NEW LIST\n");
    	printf("Available Action : choose between  add/move/remove/delete/deleteall/save/end\n");
     
    	do
    	{
    		printf("choose an Action : ");
    		//scanf("%s",&todo);
    		fgets(todo,sizeof todo,stdin);
    		clean(todo);
    		switch 
    		if ( !strcmp(todo,"add") )
     
    /*
     
              jaimerais changer cet endroit en un switch case cest pour ca que je      
              pose la question
     
     */
    	} while( strcmp(todo,"end")!=0);
    }

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par chrysmac2003
    premierement je voudrais de mander si lorsqu'on utilise le code ci-dessous cest correcte car dessus je ne vois pas d'allocation despace pour la variable test!!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
         typedef char *String;
     
         main()
         {
             String Text = "Thunderbird";
     
             printf("%s\n", Text);
         }
    En fait le code en lui même ne contient pas de fautes... j'explique. Ceci:
    Créé un nouveau type utilisateur donc, ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String Text = "Thunderbird";
    est l'équivalent de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * Text = "Thunderbird";
    tout simplement


    Citation Envoyé par chrysmac2003
    ensuite j'aime rai que vous m'aidiez a corriger le code suivant afin que je puisse savoir si le string entrer par un utilisateur correspond a l'une des valeurs correspondantes de mon typedef:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef enum {add=0,remov,move,end} todo1;
    .........
    et puis 
    		printf("choose an Action : ");
    		fgets(todo,sizeof todo,stdin);
    		clean(todo);
    pourquoi ne puis je pas declarer une variable todo de type todo1 et ecrire simplement "if (todo==add).." par exempe ???
    merci d'avance!!!!
    Bin pourquoi tu pourrais pas déclarer une variable de ce type ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef enum {add=0,remov,move,end} todo1;
    todo1 todo;
    Pas de problèmes Par contre, si tu récupère une valeur avec fgets, il te faut la convertir en entier avec strtol pour pouvoir faire ta comparaison ! Le mieux, si c'est pour un choix utilisateur, une fois ta valeur convertie, c'est d'utiliser un switch comme par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    switch (todo)
    {
       case add:
       {
       }
       break;
     
       case remove:
       {
       }
       break;
    }
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Voici un petit exemple vite fait:
    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
    #include <stdio.h>
    #include <stdlib.h>
     
     
    typedef enum
    {
       ADD = 1,  /* 1 c'est plus simple pour une saisie utilisateur car,
                    0 veut souvent dire 'quitter'. */
       REMOVE,
       MOVE,
       END
    }
    todo_t; /* todo_t pour en fait toto_type */
     
     
    int main (void)
    {
       char todo [15] = { 0 };
       todo_t val;
     
     
       printf ("choose an Action : ");
       fgets (todo, sizeof todo, stdin);
     
       val = (todo_t) strtol (todo, NULL, 10);
     
       switch (val)
       {
          case ADD:
          {
             printf ("Action : ADD\n");
          }
          break;
     
          case REMOVE:
          {
             printf ("Action : REMOVE\n");
          }
          break;
     
          case MOVE:
          {
             printf ("Action : MOVE\n");
          }
          break;
     
          case END:
          {
             printf ("Action : END\n");
          }
          break;
     
          default:
          {
             printf ("Erreur, saisie incorrecte !\n");
          }
          break;
       }
     
     
       return 0;
    }
    Juste une petite précision, les énumération étant en fait des énumérations de constantes, il est en générale dans les règle de l'art, que les identifiants soit en majuscule car en fait, ce ne sont que des constantes, rien de plus

    Pose des questions sur ce que tu ne comprend pas
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 63
    Par défaut ouvrir un fichier
    merci pour l'aide franck,
    mais, lorsque je fais la convertion i=strtol (todo, NULL, 10);
    elle me donne toujours 0!??!
    quand jexecute ton exemple par exemple,ca donne toujours
    Erreur, saisie incorrecte ! quand bien meme j'entre ADD en majuscule

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par chrysmac2003
    [...]quand bien meme j'entre ADD en majuscule
    J'espère pour toi que tu n'entres pas comme saisie utilisateur:


    Il faut ici entrer une valeur numérique ... dans mon exemple ! Montre voir ton code qui ne fonctionne pas !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 63
    Par défaut
    en effet quand jentre le chiffre 1 comme utilisateur, ca passe bien dans le case ADD, mais un utilisateur nest pas sensé entré des chiffres!!!!!
    (et quand bien meme ca passe ma fonction fileexist bug le programme, apparemment il y'a une erreur dans mon fprintf,bon je ne lai jamais utiliser avant donc je ne sais pas trop
    en mettant le fprintf dans fileexist sous commentaire, le programme s'execute comme attendu(du moins ceque j'ai deja fais)
    voici le 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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
     
     
    typedef char *string;
    typedef enum {ADD=1,MOVE,REMOV,DELET,DELETALL,SAVE,END} todo_t;
    //typedef enum {monday,tuesday,wednesday,thursday,friday,saturday,sunday} day;
    char days[7][10]={"monday","tuesday","wednesday","thursday","friday","saturday","sunday"};
    char months[12][12]={"january","february","march","april","mai","june","july","august","september","october","november","december" };
     
    const int daymax=31;
    static void purge( void)
    {
    	char c;
    	while ( ((c=getchar()) != '\n') && (c!=EOF) )
    	{};
    }
    static void clean(char *chaine)
    {
    	char *p=strchr(chaine,'\n');
    	if (p)
    		*p='\0';
    	else purge();
    }
     
     
    struct date 
    {
    	int d;
    	char m[11];
    	unsigned int y;
    };
    struct client
    {
    	int num;
    	char name[50],street[60];
    	struct date limit;
    	struct client *prev,*next;
     
    };
    int fileexist(FILE *liste1)
    {
    	if ( ( liste1=fopen("C:\Programing\file02.doc","a+") )== NULL )
    		{
     
    			liste1=fopen("C:\Programing\file02.doc","a+");
     
    			//fprintf(liste1,"Client List :\n  Name\t\t Address \t\t\t\t Delay\t\t\t\n");
    			printf("return 1\n");
    			return 1;
    		}
    	else return 0;
     
    };
     
    void angabe(struct client *var,FILE *liste1)
    {
    	char c;
    	char str[3],str1[5];
     
    	printf("type a name please :");
    	fgets(var->name,50,stdin);
    	clean(var->name);
    	fprintf(liste1,"\n%d- %s \t",var->num,var->name);
     
    	printf("type the address of the client : ");
    	fgets(var->street,sizeof(var->street),stdin);
    	clean(var->street);
    	fprintf(liste1,"%s \t",var->street);
    	printf("give the delay for his/her payment :\nday :");
    	//scanf("%lu",&(var->limit.d));
    	fgets(str,2,stdin);
    	clean(str);
     
    	var->limit.d=string2int1(str,strlen(str));
    	fprintf(liste1,"%d \t",var->limit.d);
    	printf("; month : ");
    	fgets(var->limit.m,sizeof(var->limit.m),stdin);
    	clean(var->limit.m);
    	//scanf("%s",var->limit.m);
    	fprintf(liste1,"%s \t",var->limit.m);
    	printf("; year : ");
    	fgets(str,4,stdin);
    	//scanf("%lu",&(var->limit.y));
        clean(str);
     
    	var->limit.y=string2int1(str,strlen(str));
    	fprintf(liste1,"%d \t",var->limit.y);
    	printf(";\n");
    };
     
    int main(void)
    {
    	char todo[15],*char1=malloc(sizeof(char));
    	todo_t val1;
    	int t9;
    	FILE *liste;
    	struct client *first,*last,*var1,*temp,*var;
     
     
    	temp=malloc(sizeof(struct client));
    	printf(" CREATING A NEW LIST\n");
    	printf("Available Action : choose between  add/remov/delet/deleteall/save/end\n");
     
    	do
    	{
    		int z11;
     
    		printf("choose an Action : ");
    		//scanf("%s",&todo);
    		fgets(todo,sizeof(todo),stdin);
    		clean(todo);
    		val1=(todo_t) strtol(todo,NULL,10);
    		printf("todo=%s->%ld   val1=%d\n",todo,strtol(todo,NULL,10),val1);
    		switch (val1 )
    		{
    			                                               //typedef enum {ADD=1,MOVE,REMOV,DELET,DELETALL,SAVE,END} todo_t;
    		case ADD :                                                                    //if ( !strcmp(todo,"add") )
    			{
    				printf("ADD");
    			    z11=fileexist(liste);
    			    /*angabe(temp,liste);
     
    			    if ( first)
    			    {}
    			    else
    			    {
    				temp->num=0;
    				first=temp;
    			    last=temp;
     
    			    }*/
    			    free(temp);
    			    //fclose(liste);
    			    //printf("z11=%d",z11);
    			}; break;
    		case REMOV : break;
    		default : 
    			if ( strcmp(todo,"END")!=0 )
    				printf("please try again\n");
    		}
     
    	} while( strcmp(todo,"END")!=0);
    }

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par chrysmac2003
    premierement je voudrais de mander si lorsqu'on utilise le code ci-dessous cest correcte car dessus je ne vois pas d'allocation despace pour la variable test!!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
         typedef char *String;
     
         main()
         {
             String Text = "Thunderbird";
     
             printf("%s\n", Text);
         }
    C'est correct.

    http://emmanuel-delahaye.developpez....aine_litterale

    ensuite j'aime rai que vous m'aidiez a corriger le code suivant afin que je puisse savoir si le string entrer par un utilisateur correspond a l'une des valeurs correspondantes de mon typedef:
    Il n'y a pas de lien direct entre un enum et une chaine. Mais on peut en créer un.

    http://emmanuel-delahaye.developpez.com/item_list.htm

  9. #9
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Sympa la technique Un peu plus long à mettre en oeuvre mais cela peut s'avérer pratique sur des longues listes d'items c'est vrai.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  10. #10
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 63
    Par défaut
    encore une petite question avec fgets:
    croyez vous que je peus demander la lecture d'un jour du mois (donc compris entre 1 et 31) avec l'instruction suivante? :
    fgets(str,sizeof('31'),stdin);
    si non! comment le feriez vous???
    thanks!!!

  11. #11
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par chrysmac2003
    encore une petite question avec fgets:
    croyez vous que je peus demander la lecture d'un jour du mois (donc compris entre 1 et 31) avec l'instruction suivante? :
    fgets(str,sizeof('31'),stdin);
    si non! comment le feriez vous???
    thanks!!!
    Nan nan nan ... le second paramètre de fgets est la taille du buffer donc la taille maximum que doit lire cette fonction ! Si tu veux récupérer une valeur numérique pas le choix, tu la récupères avec fgets puis tu la convertie avec strtol
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  12. #12
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 63
    Par défaut
    ok, ca veut donc dire que dans ce cas si j'ai pas de moyen de delimiter la grandeur de la valeur lue ....

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

Discussions similaires

  1. Réponses: 40
    Dernier message: 04/11/2016, 17h28
  2. Réponses: 3
    Dernier message: 10/08/2012, 14h24
  3. utiliser une valeur float pour une boucle for
    Par didi59650 dans le forum Débuter
    Réponses: 6
    Dernier message: 18/04/2006, 17h32
  4. [Tableaux] Tableau valeur vide pour une clé
    Par hisy dans le forum Langage
    Réponses: 3
    Dernier message: 17/01/2006, 11h49
  5. [MASM] Utiliser un .IF pour une comparaison de nombre signés
    Par Crisanar dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 24/11/2004, 16h32

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