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 :

petit probleme avec une liste chainée


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut petit probleme avec une liste chainée
    hello,


    j'ai un probleme avec un petit programme que je suis entrain d'ecrire...
    il s'agit d'une calculatrice graphique.
    Mais à peine commencé, j'ai deja un probleme:
    ce que le programme est censé faire por l'ainstant, c'est de prends une chaine de caractere, par ex: 123+456
    de placer chaque caractere dans un emlement de la liste.
    puis, de "convertir" une suite de caractere codant des chiffres en nombre...
    je m'explique:

    quand je tappe 123+456
    je vais obtenir '1','2','3','+','4','5','6' (ou plutot leur code ascii)
    ensuite mon algorithme devrai creer une nouvelle liste qui contiendrai:le nombre 123/code ascii de '+'/le nombre 456

    sauf que je me retrouve avec pas mal de bug, quand je commence par un nombre, le premier nombre n'est pas mis dans la liste
    et d'autres bugs plus bizar les uns que les autres...
    le probleme est surement dans la fonction stock_nb, mais je voi pas trop ou...

    je sais pas si je me suis bien expliqué....enfin voila le code que j'ai ecris, s'il y a des questions sur le code n'hesitez pas !
    merci

    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
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    #include <stdio.h>
    #include<stdlib.h>
    #include <conio.h>
    #include<math.h>
     
    #define number 0
    #define add 1
    #define sub 2
    #define mult 3
    #define divi 4
    #define open 5
    #define close 6
    #define inconnu -1
     
     
     
     
    typedef struct elem
      {
        int value;
        int type;
        elem *prev;
        elem *next;
      };
     
    typedef struct string
      {
        elem *first;
        elem *last;
      };
     
     
    void Init(string *l)
    {
      l->first = NULL;
      l->last = NULL;
    }
     
     
     
    void PushBack(string *l, int val,int type)
    {
      elem *nouv = (elem*)malloc(sizeof(elem));
      if(!nouv)
        return;
      nouv->value = val;
      nouv->type=type;
      nouv->prev = l->last;
      nouv->next = NULL;
      if(l->last)
        l->last->next = nouv;
      else
        l->first = nouv;
      l->last = nouv;
    }
    /******************************************************************************/
     
    void PushFront(string *l, int val,int type)
    {
      elem *nouv = (elem*)malloc(sizeof(elem));
      if(!nouv)
        return;
      nouv->value = val;
      nouv->type=type;
      nouv->next = l->first;
      nouv->prev = NULL;
      if(l->first)
        l->first->prev = nouv;
      else
        l->last = nouv;
      l->first = nouv;
    }
     
    int PopBack(string *l)
    {
      int val;
      elem *tmp = l->last;
      if(!tmp)
        return -1;
      val = tmp->value;
      l->last = tmp->prev;
      if(l->last)
        l->last->next = NULL;
      else
        l->first = NULL;
      free(tmp);
      return val;
    }
    /******************************************************************************/
     
    int PopFront(string *l)
    {
      int val;
      elem *tmp = l->first;
      if(!tmp)
        return -1;
      val = tmp->value;
      l->first = tmp->next;
      if(l->first)
        l->first->prev = NULL;
      else
        l->last = NULL;
      free(tmp);
      return val;
    }
     
     
    int get_type(int a)
    {
     
      if (a>=48 && a<=57)
        return number;
      if (a==43)
        return add;
      if (a==45)
        return sub;
      if (a==42)
        return mult;
      if (a==47)
        return divi;
      if (a==40 || a==91)
        return open;
      if (a==41 || a==93)
        return close;
      return inconnu;
     
     
     
    }
    void Kscanf(string * l)
    {
      int a;
      int type;
      while (a != 13)
        {
          a = getch();
          printf("%c",a);
          type = get_type(a);
          if(a!=13)
            PushFront(l,a,type);
        }
     
    }
    void View(string l)
    {
      printf("\n");
      elem *pelem = l.first;
      while(pelem)
        {
          printf("%d type=%d\n",pelem->value,pelem->type);
          pelem = pelem->next;
        }
    }
     
     
     
     
    void stock_nb(string l, string * nb)
    {
      int last_digit_type=-2;
     
      int nb_tmp=0;
      int i=0;
      elem *pelem = l.first;
      while(pelem)
        {
     
     
          //if (is_digit(p->cara) == 1 &&last_digit==0 )Push_nb(Lnb,-1);
     
          if (pelem->type == 0)
            {
     
              while(pelem->type==0)
                {
                  nb_tmp=nb_tmp+((pelem->value)-48)*pow(10,i); //multipli les unité par 1, les diaine par 10 et les centaines par cent
                  i++;
                  //PushFront(nb,pelem->value,pelem->type);
                  pelem = pelem->next;
                }
              i=0;
              PushFront(nb,nb_tmp,0);
     
              nb_tmp=0;
            }
          if (pelem->type != 0)
            {
              PushFront(nb,pelem->value,pelem->type);
     
              pelem = pelem->next;
     
            }
     
     
          //last_digit=is_digit(p->cara);
     
        }
     
     
     
     
     
    }
     
     
     
     
     
     
     
    int main()
    {
     
      string  l;
      string nb;
      Init(&l);
      Init(&nb);
     
     
      Kscanf(&l); //lecture de la chaine
      View(l);
      stock_nb(l, &nb);
      View(nb);
     
     
    }
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  2. #2
    Membre averti
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    363
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 363
    Points : 353
    Points
    353
    Par défaut
    Au lieu de te casser la tete à couper ta chaine caractere par caractere et ensuite convertir chacun d'eux tu ne ferai pas un truc du genre:
    1) detection des opérande et des parentheses
    2) une fois que tu sais ou sont tes opérandes et tes parentheses tu peux savoir
    sur quel caractere commence le chiffre et aussi sur quel caractere il se fini.Donc a partir de la tu extrait le chiffre et tu le converti.

  3. #3
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    en utilisant ta methode je devrais aussi couper caractere par caractere lors de la saisie de ma chaine, j'ai pas tres bien compris ce que tu veux dire !
    je stoque chaque caractere dans un element d'une liste chainée, je ne devrais pas utiliser de liste chainée ?

    une fois stoqué dans ma liste chainée, mon programe va juste lire de droite a gauche la liste,
    si il tombe sur un chiffre il l'ajoute a une vaiable temporaire nb_tmp
    si l'element suivant est un chiffre, il le multiplie par 10 et l'ajoute a nb_tmp
    si il y a un troisieme chiffre a la suite il le multiplie par 100 et l'ajoute a nb_tmp ainsi de suite
    ensuite quand il tombe sur un operande ou parenthese, il pile nb_tmp ds une nouvelle liste puis pile l'operande...

    a la fin, je devrai me retrouver avec une liste contenant chaque nombre dans un element et chaque operande ou parenthese dans un element.....mais biensur....ca marche pas...

    je ne voi pas trop ce qu'il y a de casse tete...
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par kamouminator
    arg...personne n'a d'idée sur mon erreure ? le pire c'est que je suis sur que c'est un truc tout bête...mais je le trouve pas....et je suis dessus depuis hier matin...
    - Ton code ne compile pas avec gcc...

    Exemple de problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct elem
      {
        int value;
        int type;
        elem *prev;
        elem *next;
      };
    - Il n'y a pas un seul commentaire dans ton code

    Cela ne va pas pousser les gens à aider...
    Jc

  5. #5
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    c'est bizar...ca marche chez moi pourtant !
    je rajoute des commentaire et je repost mon code...

    ps: c'est quoi le probleme avec ma structure ? j'ai pas compris !
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  6. #6
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    voila le code commenté, et j'ai enlevé quelques fonctions inutiles pour l'ainstant:ps: chez moi avec gcc ca marche impec...

    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
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
     
    #include <stdio.h>
    #include<stdlib.h>
    #include <conio.h>
    #include<math.h>
     
    #define number 0
    #define add 1
    #define sub 2
    #define mult 3
    #define divi 4
    #define open 5
    #define close 6
    #define inconnu -1
     
     
     
     
    typedef struct elem
      {
        int value; //ici sera stocké soit le code ascii d'un operande soit la valeur d'un nombre
        int type; //type de l'element : nombre, operande, parenthese...
        elem *prev; //pointeur vers l'element precedent
        elem *next; //pointeur vers l'element suivant
      };
     
     
    /*structure contenant un pointeur sur le debut de la liste et un autre sur la fin*/
    typedef struct string
      {
        elem *first;
        elem *last;
      };
     
    /*fonction initialisation d'une liste*/
    void Init(string *l)
    {
      l->first = NULL;
      l->last = NULL;
    }
     
     
    /* fonction permettan de rajouter un element en fin de liste*/
    void PushBack(string *l, int val,int type)
    {
      elem *nouv = (elem*)malloc(sizeof(elem));
      if(!nouv)
        return;
      nouv->value = val;
      nouv->type=type;
      nouv->prev = l->last;
      nouv->next = NULL;
      if(l->last)
        l->last->next = nouv;
      else
        l->first = nouv;
      l->last = nouv;
    }
    /******************************************************************************/
    /*fonction permettant de rajouter un element au debut de la liste*/
    void PushFront(string *l, int val,int type)
    {
      elem *nouv = (elem*)malloc(sizeof(elem));
      if(!nouv)
        return;
      nouv->value = val;
      nouv->type=type;
      nouv->next = l->first;
      nouv->prev = NULL;
      if(l->first)
        l->first->prev = nouv;
      else
        l->last = nouv;
      l->first = nouv;
    }
     
     
    /* Fonction qui teste chaque caractere et renvoie son type */
    int get_type(int a)
    {
     
      if (a>=48 && a<=57)
        return number;
      if (a==43)
        return add;
      if (a==45)
        return sub;
      if (a==42)
        return mult;
      if (a==47)
        return divi;
      if (a==40 || a==91)
        return open;
      if (a==41 || a==93)
        return close;
      return inconnu;
     
     
     
    }
     
     
    /*fonction "imitant" le scanf, a chaque fois qu'on tape un caractere, il sera rajouté a la liste*/
    void Kscanf(string * l)
    {
      int a;
      int type;
      while (a != 13)
        {
          a = getch(); //on copie le code ascii du caractere dans a
          printf("%c",a); //on l'affiche
          type = get_type(a); //on evalue son type
          if(a!=13)
            PushFront(l,a,type); //on rajoute un element a la pile contenant: la valeur, et le type du caractere
        }
     
    }
     
    /*fonction affichant le contenu de la liste*/
    void View(string l)
    {
      printf("\n");
      elem *pelem = l.first;
      while(pelem)
        {
          printf("%d type=%d\n",pelem->value,pelem->type);
          pelem = pelem->next;
        }
    }
     
     
     
     
    void stock_nb(string l, string * nb)
    {
      int last_digit_type=-2;
     
      int nb_tmp=0;
      int i=0;
      elem *pelem = l.first;
      while(pelem) //tant qu l'element n'est pas NULL (fin de liste)
        {
     
     
          //if (is_digit(p->cara) == 1 &&last_digit==0 )Push_nb(Lnb,-1);
     
     
     
          if (pelem->type == number)
            {
     
              while(pelem->type==number)
                {
                  nb_tmp=nb_tmp+((pelem->value)-48)*pow(10,i);// lorsqu'on li les unité i =1, les disaines i=2, les centaines i=3
                  // on a donc a la fin nb_tmp= unité + 10 * dizaine + 100*centaine...
                  i++;
     
                  pelem = pelem->next; //la lecture se fais de droite a gauche pour pouvoir d'abord avoir les unité puis les dizaines puis les centaines etc...
                }
     
     
     
              PushFront(nb,nb_tmp,0);// quand le caractere lu n'est plus un chiffre, on rajoute nb_tmp a la nouvelle liste
                i=0;
              nb_tmp=0;
            }
     
     
          if (pelem->type != 0)
            {
              PushFront(nb,pelem->value,pelem->type); //quand le caractere lu n'est pas un chiffre, on le copie directement dans un nouvel element de la liste
     
              pelem = pelem->next;
     
            }
     
     
          //last_digit=is_digit(p->cara);
     
        }
     
     
     
     
     
    }
     
     
     
     
     
     
     
    int main()
    {
     
      string  l; //liste dans laquelle chaque element comporte un caractere(code ascii)
      string nb;//liste dans laquelle on place chaque nombre dans un element, et chaque operande(code ascii) dans un element
      Init(&l);
      Init(&nb);
     
     
      Kscanf(&l);
      View(l);
      stock_nb(l, &nb);
      View(nb);
     
     
    }
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  7. #7
    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 kamouminator
    c'est bizar...ca marche chez moi pourtant !

    ps: c'est quoi le probleme avec ma structure ? j'ai pas compris !
    C'est pas du C. Pour compiler en C, l'extension doit être .c et non .cpp ni .C.
    Pas de Wi-Fi à la maison : CPL

  8. #8
    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 kamouminator
    voila le code commenté, et j'ai enlevé quelques fonctions inutiles pour l'ainstant:ps: chez moi avec gcc ca marche impec...
    Ce genre d'affirmation me fera toujours rire...
    Compilateur: Default compiler
    Building Makefile: "C:\dev\forums\Makefile.win"
    Exécution de make...
    make.exe -f "C:\dev\forums\Makefile.win" all
    gcc.exe -c main.c -o main.o -I"C:/Dev-Cpp/include" -I"/clib" -Wextra -Wall -O2

    main.c:22: error: syntax error before "elem"
    main.c:22: warning: no semicolon at end of struct or union
    main.c:23: warning: type defaults to `int' in declaration of `next'
    main.c:23: warning: data definition has no type or storage class
    main.c:24: error: syntax error before '}' token
    main.c:30: error: syntax error before "elem"

    main.c:30: warning: no semicolon at end of struct or union
    main.c:31: warning: type defaults to `int' in declaration of `last'
    main.c:31: warning: data definition has no type or storage class
    main.c:32: error: syntax error before '}' token
    main.c:35: error: syntax error before '*' token
    main.c: In function `Init':
    main.c:37: error: `l' undeclared (first use in this function)
    main.c:37: error: (Each undeclared identifier is reported only once
    main.c:37: error: for each function it appears in.)
    main.c: At top level:
    main.c:43: error: syntax error before '*' token
    main.c: In function `PushBack':
    main.c:45: error: `elem' undeclared (first use in this function)
    main.c:45: error: `nouv' undeclared (first use in this function)
    main.c:45: error: syntax error before ')' token
    main.c:48: error: `val' undeclared (first use in this function)
    main.c:49: error: `type' undeclared (first use in this function)
    main.c:50: error: `l' undeclared (first use in this function)
    main.c: At top level:
    main.c:60: error: syntax error before '*' token
    main.c: In function `PushFront':
    main.c:62: error: `elem' undeclared (first use in this function)
    main.c:62: error: `nouv' undeclared (first use in this function)
    main.c:62: error: syntax error before ')' token
    main.c:65: error: `val' undeclared (first use in this function)
    main.c:66: error: `type' undeclared (first use in this function)
    main.c:67: error: `l' undeclared (first use in this function)
    main.c: At top level:
    main.c:103: error: syntax error before '*' token
    main.c: In function `Kscanf':
    main.c:113: error: `l' undeclared (first use in this function)
    main.c: At top level:
    main.c:119: error: syntax error before "l"
    main.c: In function `View':
    main.c:122: error: `elem' undeclared (first use in this function)
    main.c:122: error: `pelem' undeclared (first use in this function)
    main.c:122: error: `l' undeclared (first use in this function)
    main.c: At top level:
    main.c:133: error: syntax error before "l"
    main.c: In function `stock_nb':
    main.c:139: error: `elem' undeclared (first use in this function)
    main.c:139: error: `pelem' undeclared (first use in this function)
    main.c:139: error: `l' undeclared (first use in this function)
    main.c:162: error: `nb' undeclared (first use in this function)
    main.c:135: warning: unused variable `last_digit_type'
    main.c: In function `main':
    main.c:196: error: `string' undeclared (first use in this function)
    main.c:196: error: syntax error before "l"
    main.c:198: error: `l' undeclared (first use in this function)
    main.c:199: error: `nb' undeclared (first use in this function)

    make.exe: *** [main.o] Error 1

    Exécution terminée
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    hein ? mais je suis serieux !!! ca compile chez moi !!!
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  10. #10
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    j'utilise c::b, le projet est une "console application" j'ai choisi un c++ source file...
    dans compiler options, j'ai mis GNU gcc compiler...

    et ca compile vraiment !!!
    je peux meme fournir mon executable ! ou meme tout mon projet !

    j'y comprend plus rien...
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  11. #11
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    ah autant pour moi...j'avais pas lu ton avant dernier post...effectivement...je l'avais mis en c++ par habitude, il manquais juste des "struct" devant les declaration de mes structures...

    voila le code remodifié...dsl...

    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
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    #include <stdio.h>
    #include<stdlib.h>
    #include <conio.h>
    #include<math.h>
     
    #define number 0
    #define add 1
    #define sub 2
    #define mult 3
    #define divi 4
    #define open 5
    #define close 6
    #define inconnu -1
     
     
     
     
    struct elem
      {
        int value; //ici sera stocké soit le code ascii d'un operande soit la valeur d'un nombre
        int type; //type de l'element : nombre, operande, parenthese...
        struct elem *prev; //pointeur vers l'element precedent
        struct elem *next; //pointeur vers l'element suivant
      };
     
     
    /*structure contenant un pointeur sur le debut de la liste et un autre sur la fin*/
    struct string
      {
        struct elem *first;
        struct elem *last;
      };
     
    /*fonction initialisation d'une liste*/
    void Init(struct string * l)
    {
      l->first = NULL;
      l->last = NULL;
    }
     
     
    /* fonction permettan de rajouter un element en fin de liste*/
    void PushBack(struct string *l, int val,int type)
    {
      struct elem *nouv = (struct elem*)malloc(sizeof( struct elem));
      if(!nouv)
        return;
      nouv->value = val;
      nouv->type=type;
      nouv->prev = l->last;
      nouv->next = NULL;
      if(l->last)
        l->last->next = nouv;
      else
        l->first = nouv;
      l->last = nouv;
    }
    /******************************************************************************/
    /*fonction permettant de rajouter un element au debut de la liste*/
    void PushFront( struct string *l, int val,int type)
    {
      struct elem *nouv = ( struct elem*)malloc(sizeof( struct elem));
      if(!nouv)
        return;
      nouv->value = val;
      nouv->type=type;
      nouv->next = l->first;
      nouv->prev = NULL;
      if(l->first)
        l->first->prev = nouv;
      else
        l->last = nouv;
      l->first = nouv;
    }
     
     
    /* Fonction qui teste chaque caractere et renvoie son type */
    int get_type(int a)
    {
     
      if (a>=48 && a<=57)
        return number;
      if (a==43)
        return add;
      if (a==45)
        return sub;
      if (a==42)
        return mult;
      if (a==47)
        return divi;
      if (a==40 || a==91)
        return open;
      if (a==41 || a==93)
        return close;
      return inconnu;
     
     
     
    }
     
     
    /*fonction "imitant" le scanf, a chaque fois qu'on tape un caractere, il sera rajouté a la liste*/
    void Kscanf(struct string * l)
    {
      int a;
      int type;
      while (a != 13)
        {
          a = getch(); //on copie le code ascii du caractere dans a
          printf("%c",a); //on l'affiche
          type = get_type(a); //on evalue son type
          if(a!=13)
            PushFront(l,a,type); //on rajoute un element a la pile contenant: la valeur, et le type du caractere
        }
     
    }
     
    /*fonction affichant le contenu de la liste*/
    void View(struct string l)
    {
      printf("\n");
      struct elem *pelem = l.first;
      while(pelem)
        {
          printf("%d type=%d\n",pelem->value,pelem->type);
          pelem = pelem->next;
        }
    }
     
     
     
     
    void stock_nb(struct string l,struct string * nb)
    {
      int last_digit_type=-2;
     
      int nb_tmp=0;
      int i=0;
      struct elem *pelem = l.first;
      while(pelem) //tant qu l'element n'est pas NULL (fin de liste)
        {
     
     
          //if (is_digit(p->cara) == 1 &&last_digit==0 )Push_nb(Lnb,-1);
     
     
     
          if (pelem->type == number)
            {
     
              while(pelem->type==number)
                {
                  nb_tmp=nb_tmp+((pelem->value)-48)*pow(10,i);// lorsqu'on li les unité i =1, les disaines i=2, les centaines i=3
                  // on a donc a la fin nb_tmp= unité + 10 * dizaine + 100*centaine...
                  i++;
     
                  pelem = pelem->next; //la lecture se fais de droite a gauche pour pouvoir d'abord avoir les unité puis les dizaines puis les centaines etc...
                }
     
     
     
              PushFront(nb,nb_tmp,0);// quand le caractere lu n'est plus un chiffre, on rajoute nb_tmp a la nouvelle liste
              i=0;
              nb_tmp=0;
            }
     
     
          if (pelem->type != 0)
            {
              PushFront(nb,pelem->value,pelem->type); //quand le caractere lu n'est pas un chiffre, on le copie directement dans un nouvel element de la liste
     
              pelem = pelem->next;
     
            }
     
     
          //last_digit=is_digit(p->cara);
     
        }
     
     
     
     
     
    }
     
     
     
     
     
     
     
    int main()
    {
     
      struct string  l;
       struct string nb;
      Init(&l);
      Init(&nb);
     
     
      Kscanf(&l);
      View(l);
      stock_nb(l, &nb);
      View(nb);
     
     
    }
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  12. #12
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Salut,


    Pourquoi utilises-tu le mot clé typedef?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct elem
      {
        int value; //ici sera stocké soit le code ascii d'un operande soit la valeur d'un nombre
        int type; //type de l'element : nombre, operande, parenthese...
        struct elem *prev; //pointeur vers l'element precedent
        struct elem *next; //pointeur vers l'element suivant
      };
    Ici, tu ne définis aucun type avec le mot clé typedef. Ton code compile si tu remplace tous tes appels à elem par struct elem, car elem n'est pas définit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct elem elem_s;
    struct elem
      {
        int value; //ici sera stocké soit le code ascii d'un operande soit la valeur d'un nombre
        int type; //type de l'element : nombre, operande, parenthese...
        elem_s *prev; //pointeur vers l'element precedent
        elem_s *next; //pointeur vers l'element suivant
      };
    /* ... */
    elem_s element; /* déclaration d'une variable de type elem_s */

    ou encore


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /* pas de typedef ici */
    struct elem
      {
        int value; //ici sera stocké soit le code ascii d'un operande soit la valeur d'un nombre
        int type; //type de l'element : nombre, operande, parenthese...
        struct elem *prev; //pointeur vers l'element precedent
        struct elem *next; //pointeur vers l'element suivant
      };
     
    /* ... */
    struct elem element; /* déclaration d'une variable de type struct elem */

    ou alors


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct elem
      {
        int value; //ici sera stocké soit le code ascii d'un operande soit la valeur d'un nombre
        int type; //type de l'element : nombre, operande, parenthese...
        struct elem *prev; //pointeur vers l'element precedent
        struct elem *next; //pointeur vers l'element suivant
      } elem_s;
     
    /* ... */
    elem_s element; /* déclaration d'une variable de type elem_s */
    Salutations et bonne chance

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  13. #13
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    oui, je me suis enmelé les pinceaux...je sais pas pourqu'oi j'ai mi le typedef...

    mais bon ca marche toutjours pas, quand je commence par un nombre ca plante... alors que si je commence par auter chose ca marche plus ou moin bien....j'ai pas toujour ce que j'ai entré.... genre si j'entre *123*456
    je me retrouve avec 122 au lieu de 123 .....
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  14. #14
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    bouh...personne n'a d'idée sur mon erreure ?
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  15. #15
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    J'ai un peu regardé et il y a erreur ici :
    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
          if (pelem->type == number)
            {
     
     
              while(
                       pelem != NULL &&  <== j'ai rajouté ce qu'il faut
     
                     pelem->type==number) 
     
                {
                  nb_tmp=nb_tmp+((pelem->value)-48)*pow(10,i);// lorsqu'on li les unité i =1, les disaines i=2, les centaines i=3
                  // on a donc a la fin nb_tmp= unité + 10 * dizaine + 100*centaine...
                  i++;
     
                  pelem = pelem->next; //la lecture se fais de droite a gauche pour pouvoir d'abord avoir les unité puis les dizaines puis les centaines etc...
                }
     
     
     
              PushFront(nb,nb_tmp,0);// quand le caractere lu n'est plus un chiffre, on rajoute nb_tmp a la nouvelle liste
              i=0;
              nb_tmp=0;
            }
           if (pelem != NULL && pelem->type != 0)
            {
              PushFront(nb,pelem->value,pelem->type); //quand le caractere lu n'est pas un chiffre, on le copie directement dans un nouvel element de la liste
     
              pelem = pelem->next;
     
            }
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  16. #16
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    genial, merci, j'avais pas vu qu'il pouvais sortir de la liste...

    mais un petit probleme perciste.... quand je tappe 123 il m'affiche bien les bons codes ascii, mais une fois la convertion faite, j'obtien 122... en fait, jusqu'a 99 c'est bon, la convertion est correcte,apartir de 100 y'a un probleme...
    pareil, de 1000 a 1099 y'a pas de pb par contre de 1100 a 1999 y'a un pb..
    donc je pense que c'est quand i=2

    je me demande donc si le probleme ne peu pas venir de pow() ?
    y a t il une autre fonctioon pour calculer les puissances ?
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  17. #17
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    c'est peut etre pluto quand le troisieme chiffre est different de 0...
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  18. #18
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    bon, en fait, c'est plutot lorsque le chiffre des positions mutliples de 2 sont differents de 0 qu'il y a un pb...

    les centaine= position 2=> 10^(2*1)
    dizaine de millier : position 4=> 10^(2*2)
    ...

    problement lorsqu'on a 10^(2k), k etant un entier positif...
    je sais pas si ca precise le probleme....mais bon...je voi vraiment pas ou ca deconne...
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  19. #19
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut

    je suis sur le...deriere...

    j'utilise c::b, dans build options j'ai coché "optimise generated code" (j'utilise gcc pour compiler)

    et alors la, surprise, le programme fonctionne tres bien, il me ressort exactement ce que je lui entre....
    quelqu'un aurai une explication sur ce phenomene....surnaturel...??

    ps: le probleme n'etait pas du a ma variable "i" parceque des fois y'avais un probleme, des fois pas...
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  20. #20
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Essaye de faire afficher le résultat de pow avec le maximum de précision possible (au moins 16 chiffres).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

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

Discussions similaires

  1. probleme avec une liste chainée
    Par simpatico dans le forum Débuter
    Réponses: 10
    Dernier message: 25/07/2011, 08h45
  2. Problème avec une liste chainée
    Par 0v3rb1t dans le forum C
    Réponses: 3
    Dernier message: 08/05/2007, 19h27
  3. Probleme avec une liste
    Par Papri dans le forum ANT
    Réponses: 3
    Dernier message: 14/02/2007, 15h18
  4. Probleme avec une liste chainée
    Par apen2k2 dans le forum C
    Réponses: 7
    Dernier message: 14/12/2006, 16h31
  5. [MySQL] Problème avec une liste déroulante
    Par leloup84 dans le forum SQL Procédural
    Réponses: 19
    Dernier message: 24/01/2006, 12h57

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