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 :

convertir une chaine


Sujet :

C

  1. #1
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut convertir une chaine
    bonjour,
    voila je cherche comment mettre ma chaine de caractere dans un tableau des reels
    exemple :
    12*13%((-2.2)+1)
    la permiere case doit contenir 12
    la 2eme code de *
    la 3eme 13
    la 4eme code de %
    5eme code de parenthese ouvrante
    6eme code de parenthese
    la 7eme case -2.2
    etc
    voila merci d avance pour votre aide
    a+

  2. #2
    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 ralf91
    voila je cherche comment mettre ma chaine de caractere dans un tableau des reels
    exemple :
    12*13%((-2.2)+1)
    la permiere case doit contenir 12
    la 2eme code de *
    la 3eme 13
    la 4eme code de %
    5eme code de parenthese ouvrante
    6eme code de parenthese
    la 7eme case -2.2
    Ca ressemble fort à un analyseur d'expression mathématique. J'ai bien peur que ce soit un peu plus compliqué que tu ne le croies...

    Quel est ton énoncé exactement ?

  3. #3
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut
    salut,
    ben c'est l'evaluation d'expressions arithmetique, au fait demande d'ecrire une fonction operation qui en parametre x1, x2 et operateur et elle retourn le resultat donc je dois generer un vecteur des reels correspondant a l'expression arithmetique, chaque case du vecteur doit contenir soit un operande, un operateur (son code) ou une parenthese.

    exemple
    chaine = "-14+12.3*(12%2)"
    et le vecteur doit contenir :
    -14 code de '+' 12.3 code de '*' code de '(' etc...
    voila
    a+

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    eh bien si tu dois coder ça, suis les bonnes pratiques de développement.

    Spécification (l'énoncé)

    Conception préliminaire :
    réfléchis à l'agorithme qu'il te faut.

    Conception détaillée :
    écris ton algorithme en pseudo-code

    Programmation :
    Essaye ensuite de le coder

    et là on pourra t'aider..


  5. #5
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut
    voici quelque fonctions que j'ai pu faire, ce prgramme a deux problemes le premier est : il ne marche pas je ne sais pas pourquoi j'ai essayé de le dérouler manuellement ca marche mais avec DEV non ! le deusieme, il lui manque quelque cas comme les nombres négatifs ?? je pense que j'ai un sérieu probleme la, j'ai besoin d'aide svp
    pour les fonctions:
    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
     
     
    float code(char c)
    {
          switch (c)
          {
          case '0': return 0;    break;
          case '1': return 1;    break;
          case '2': return 2;    break;
          case '3': return 3;    break;
          case '4': return 4;    break;
          case '5': return 5;    break;
          case '6': return 6;    break;
          case '7': return 7;    break; 
          case '8': return 8;    break;
          case '9': return 9;    break;
          case '(': return 11;    break;
          case ')': return 12;    break;
          case '+': return 13;    break;
          case '-': return 14;    break;
          case '*': return 15;    break;
          case '/': return 16;    break;
          case '%': return 17;    break;
          }
    }    
     
     
    void conversion(char *ch, float **t, int *pos)
    {
         int i=0,j=0,b=0,l,k=0,pui,l2,pui2;
         float nombre1,nombre2;
         char ch2[22],ch3[22];
     
         *pos=0;
      while(i<=strlen(ch));
      {
         b=0;   j=0;   k=0;
     
         while (!operateur(ch[i]) && ch[i]!=')' && ch[i]!='(' && ch[i]!='\0')  //chercher les nombres et les sauvgarder dans des chaines
         {
               if(ch[i]=='.' || ch[i]=='e' || ch[i]=='E')
               {
                             i++;
                             b==1;
                             }
               if(b==0) 
                  {  ch2[j]=ch[i];   j++;  }
               else 
                  {  ch3[k]=ch[i];   k++;  }
         i++;
         }
     
         nombre1=nombre2=pui=pui2=0;
     
         if(j!=0)   
         {
                 l=strlen(ch2);
                 while(l>0)   //construction de la partie gauche du nombre  (avant le point)
                 {
                  nombre1 = nombre1 + (code(ch2[l-1])*(pow(10,pui)));
                  pui++;
                  l--;
                 }
                 if(k!=0)
                 {
                  l2=strlen(ch3);
                  while(l2>0)   //construction de la partie droite du nombre (apres le point)
                  {
                   nombre2 = nombre2 + (code(ch3[l2-1])*(pow(10,pui2)));
                   pui2++;
                   l2--;
                   }
                 }
     
                 (*t)[(*pos)]=nombre1+((nombre2)/(pow(10,strlen(ch3))));  //mettre le nombre final dans un tableau
                 (*pos)++;
         }
     
         if (operateur(ch[i])==1 || ch[i]=='(' || ch[i]==')' || ch[i]=='e' || ch[i]=='E')  // autre qu'un nombre
         { 
            (*t)[(*pos)]=code(ch[i]);
            (*pos)++;
            }
            i++;
      } 
     
    }
    pour vérifier si ca marche ou pas j'ai éssayé d'afficher le tableau alors j'ai mis dans le main

    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
     
    int main(int argc, char *argv[])
    {
        int i,pos;
        char ch[20];
        float *t;
     
        t=(float *)malloc(20*sizeof(float));
     
        printf("entrer l operation :  ");
            gets(ch);
     
        conversion(ch,&t,&pos);
     
        for (i=0; i<pos; i++)
            printf("case %d est : %f \n",i,t[i]); 
     
     
      system("PAUSE");	
      return 0;
    }
    j'ai pas trouve le probleme merci pour votre aide
    a+

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 131
    Par défaut
    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
    ...
    float code(char c)
    {
          switch (c)
          {
          case '0': return 0;    break;
          case '1': return 1;    break;
          case '2': return 2;    break;
          case '3': return 3;    break;
          case '4': return 4;    break;
          case '5': return 5;    break;
          case '6': return 6;    break;
          case '7': return 7;    break; 
          case '8': return 8;    break;
          case '9': return 9;    break;
          case '(': return 11;    break;
          case ')': return 12;    break;
          case '+': return 13;    break;
          case '-': return 14;    break;
          case '*': return 15;    break;
          case '/': return 16;    break;
          case '%': return 17;    break;
          }
    }   
    ...
    Aie si tu retournes, cela ne sert a rien de mettre un break.

    je te conseille deja de faire ca :
    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
    ...
    float code(char c)
    {
          int val;
          switch (c)
          {
          case '0': val = 0;    break;
          case '1': val = 1;    break;
          case '2': val = 2;    break;
          case '3': val = 3;    break;
          case '4': val = 4;    break;
          case '5': val = 5;    break;
          case '6': val = 6;    break;
          case '7': val = 7;    break; 
          case '8': val = 8;    break;
          case '9': val = 9;    break;
          case '(': val = 11;    break;
          case ')': val = 12;    break;
          case '+': val = 13;    break;
          case '-': val = 14;    break;
          case '*': val = 15;    break;
          case '/': val = 16;    break;
          case '%': val = 17;    break;
          default: val = -1;
          }
     
          return val;
    }
    ...
    Je n ai pas encore regarde le reste du code

  7. #7
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut
    salut,
    j'ai trouve une erreur dans la permiere boucle while un ";" en plus c pour ca le programme bloque, et je pense qu'il ya un probleme dans le premier else 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
     
     while (!operateur(ch[i]) && ch[i]!=')' && ch[i]!='(' && ch[i]!='\0')  //chercher les nombres et les sauvgarder dans des chaines
         {
               if(ch[i]=='.' || ch[i]=='e' || ch[i]=='E')
               {
                             i++;
                             b==1;
                             }
               if(b==0) 
                  {  ch2[j]=ch[i];   j++;  }
               else 
                  {  ch3[k]=ch[i];   k++;  }
         i++;
         }
    voila je ne sais pas pourquoi le programme n'accede pas au premier else ???

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    tu incrémentes 2 fois i si tu passes dans le premier if..

  9. #9
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut
    salut,
    j'ai trouve l'erreur dans le premier if j'ai mis b==1 et normalement je dois mettre b=1.
    maintenant je viens de trouver un autre probleme quand l'utilisateur entre une chaine courte par exemple 2.25+2*4 c'est bon mais il fait entrer des chaines longues comme 1.23335+17+(12*1.10)-0*4
    le programme affiche des valeurs fausses pourquoi ????
    a+

  10. #10
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut
    sault,
    personne n'a trouve une erreur !!!
    ou elles sont mes erreurs svp
    a+

  11. #11
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    elle est ou ta fonction operateur ?

  12. #12
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut
    la fonction operateur est tres simple,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int operateur(char c)
    {
       if(c=='*' ||c=='/'||c=='+'||c=='-'||c=='%')
         return 1;
      return 0;
    }

  13. #13
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    D'abord :

    Citation Envoyé par ralf91
    ....quand l'utilisateur entre une chaine courte par exemple 2.25+2*4 c'est bon mais il fait entrer des chaines longues comme 1.23335+17+(12*1.10)-0*4
    le programme affiche des valeurs fausses pourquoi ????
    ..
    et ça ça serait pas la cause par hasard ??



    (pour exemple ta chaîne à 20 caractères est "1.23335+17+(12*1.1" ...

  14. #14
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut
    salut,
    non ce n'est pas a cause de ca car j'ai essaye de faire entrer une chaine de taille = 17, le probleme que j'ai eu ce n'est pas un bloquage du programme, il fait des calcules et tout mais le resultat est faux par exemple :
    12+1.2*(1.2+3)

    il affichera :

    12
    code de +
    1.2
    code de *
    code de (
    et la 20.2 (pas exactement mais a peu pres ca il n affiche pas 1.2)
    code de +
    la aussi il n affiche pas 3 il affiche autre chose
    code de )
    voila je ne sais pas pourquoi ????

  15. #15
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    c'est bien compliqué comme 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
     
    void conversion(char *ch, float **t, int *pos)
    {
    char ch1[22] ;
    int   start = -1 ;
    int   end = 0 ;
    int   l = strlen(ch) ;
     
      while ( i < l )
       {
         if ( (!operateur(ch[i])) && (ch[i]!=')') && (ch[i]!='(') && (ch[i]!='\0') )
           {
               /* Si c'est le premier caractère du chiffre, on marque le début */
               if ( start < 0 )
                 start = i ;
     
               end = i -start ;
     
               ch1[i-start] = ch[i] ;
           }
         else
           {
              /* On vient de finir un chiffre */
              if ( start >= 0 )
                {
                   ch1[end] = '\0' ;
                   sscanf ( ch1, "%f",  &((*t)[(*pos)]) );
                   (*pos)++;
                }
     
              /* On stocke l'opérateur ou le séparateur */
              start = -1 ;
     
              (*t)[(*pos)]=code(ch[i]);
              (*pos)++;
           }
     
         i++ ;
       }
     
      /* Si on termine sur un chiffre sans séparateur à la fin */
      if ( start >= 0 )
        {
             ch1[end] = '\0' ;
             sscanf ( ch1, "%f",  &((*t)[(*pos)]) );
             (*pos)++;
        }
    }

  16. #16
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut
    salut,
    merci pour la reponse mais c'est quoi ce code, une correction a mon code ou bien ton propre code
    merci

  17. #17
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    c'est le code simplifié de ta fonction...

    Pourquoi faire compliqué alors qu'on peut faire simple ??

    tu t'embêtes à aller chercher des points, des E, etc.., à copier les 2 parties d'un réel, alors que ça peut se faire d'un seul coup avec des fonctions standards...

    Si tu as des questions n'hésite pas...

    J'ai pris ton code de fonction, et je l'ai simplifié : chaque fois que j'ai un séparateur, je démarre un chiffre, et je stocke les caractères dans ch1. Dès que je trouve un séparateur, je termine la chaine, et la lit avec la fonction standard. C'est tout.

    Pour les "e", je ne souviens plus si %f les comprend. Sinon c'est %g qu'il faut mettre.

  18. #18
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut
    salut,
    merci beaucoup souviron34 pour votre aide a moi !
    en fait moi je ne connais pas la fonction sscanf, en fin j'ai entendu parler mais je l'ai jamais utiliser d'ailleurs je n'utilise pas trop les fonctions standard
    pour le code que vous m'avez envoye j'ai essayer de le derouler manuellement ca marche parfaitement mais puisque je ne connais pas la fonction sscanf alors j'ai suppose qu'elle fait une convesion d'une chaine en float , mais quant j'ai essaye avec le DEV-C++ il m'affiche un resultat ??? qui n'est pas du tout ce qu'il faut afficher svp essayez de le compiler,
    je ne sais pas peut etre qu'il faut ajouter une bibliotheque pour le sscanf ?
    merci encore pour votre aide
    a+

  19. #19
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    ok c'est tout bête..

    3 fautes de ton côté, 2 du mien..

    • Tu as oublié d'inclure <string.h>
    • Tu n'as pas initialisé pos à 0
    • Tu ne testes pas si l'allocation s'est bien passée.


    D'autre part, j'utiliserais plus volontiers fgets...

    De mon côté , dans la routine :



    Et chez moi ça marche bien.

  20. #20
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut
    salut,
    merci souviron34 pour tes reponses rapides, au fait j'ai tout mis string.h, pos=0 et meme declaration de i=0, mais ce que je n'ai pas mis (j'ai pas fait attention) a [end-1] c'est tout je pense, en tout merci beaucoup, au j'ai trouve tous les problemes de mon programme (en fin presque) il me reste un seul : LE SIGNE
    merci encore
    a+

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

Discussions similaires

  1. [VB]Convertir une chaine de caractere en entier
    Par budylove dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 21/02/2006, 11h06
  2. Réponses: 3
    Dernier message: 03/01/2006, 23h14
  3. [C#] Convertir une chaine accentue => sans accents
    Par alex57 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/09/2005, 09h21
  4. Convertir une chaine en format heure
    Par Lars dans le forum ASP
    Réponses: 3
    Dernier message: 24/05/2005, 11h44
  5. Convertir une chaine UTF8 en ISO-8859-1
    Par eods dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 26/08/2004, 16h57

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