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 :

Transformer un String en décimal,fonction personelle.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 16
    Par défaut Transformer un String en décimal,fonction personelle.
    Bonjour ,

    Comme exercice je fait une fonction qui vas transformer
    une chaine de caractere en chiffre décimal ,

    mais si je place un chiffre de 3 ou 5 lettres ,
    il ne me renvoye pas le bon résultat ,
    exemple » "345" il me renvoye 344 ,
    voici le code , merci pour vos réponses .:-) Idefix

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    long strtoint(const char *chaine);
     
    int main(int argc, char *argv[])
    {
      int chiffre = 0 ;
      char monchiffre[13] = {0};//De 0 a 11 caracteres
      //affectation...
      monchiffre[0] = '3' ;monchiffre[1] = '4' ;monchiffre[2] = '5' ;
     
      chiffre = strtoint(monchiffre);//Appel de la procedure 'strtoint'
      printf("Chiffre de la chaine: %s est :%d\n",monchiffre,chiffre) ;
     
      system("PAUSE");
      return 0;
    }
     
    long strtoint(const char *chaine)
    {
      long longueurChaine = strlen(chaine);//longueur de la chaine
      //cptinterne = compteur qui décrémente
      long compteur = 0 , cptinterne = longueurChaine-1 , chiffre = 0 ;
      double base = 10 ;
      for (compteur = 0 ; compteur <= longueurChaine-1 ; compteur++)
            {
        switch (chaine[compteur])
              {
                      case '0':
                             cptinterne-- ;
                      break;
                      case '1':
                             chiffre += 1 * (pow(base, cptinterne));
                             cptinterne-- ;
                      break;
                      case '2':
                             chiffre += 2 * (pow(base, cptinterne));
                             cptinterne-- ;
                      break;
                      case '3':
                             chiffre += 3 * (pow(base, cptinterne));
                             cptinterne-- ;
                      break;
                      case '4':
                             chiffre += 4 * (pow(base, cptinterne));
                             cptinterne-- ;
                      break;
                      case '5':
                             chiffre += 5 * (pow(base, cptinterne));
                             cptinterne-- ;
                      break;
                      case '6':
                             chiffre += 6 * (pow(base, cptinterne));
                             cptinterne-- ;
                      break;
                      case '7':
                             chiffre += 7 * (pow(base, cptinterne));
                             cptinterne-- ;
                      break;
                      case '8':
                             chiffre += 8 * (pow(base, cptinterne));
                             cptinterne-- ;
                      break;
                      case '9':
                             chiffre += 9 * (pow(base, cptinterne));
                             cptinterne-- ;
                      break;
                      default:
                             chiffre = 0 ;
                             chaine = "" ;
                      break;
              }
            }
      return chiffre ;
    }

  2. #2
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    j'ai mis un trace pour afficher le chiffre à chaque tour de boucle,c'est le résultat après le passage dans les cas 3,4 et 5.

    visiblement 3*100 donne à l'affichage 299

    299
    339
    344
    Chiffre de la chaine: 345 est :344

    Press ENTER to continue.
    la fonction pow renvoi un double que tu stockes dans un long qui fait 4 octets sur ma machine de même qu'un int tandis qu'un double fait 8 octets.

    je n'ai aucune idée de comment se passe la conversion pour faire entrer un double (ou un float ou un long double selon la fonction pow utilisée) dans un long (chapitre conversion sur les types)

    j'ai testé avec le prototype float et double ca donne des résultats tout aussi approximatif

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 16
    Par défaut
    Merci hegros pour la réponse ,
    ca devrais dire que je doit aussi réécrire un nouveaux 'pow' ?

    Je place ici ma solution pour les personnes que ca intéressent ...

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    long _exp(const long E);
    long strtoint(const char *chaine);
     
    int main(int argc, char *argv[])
    {
      long chiffre = 0 ;
      char monchiffre[13] = {0};//De 0 a 11 caracteres
      //affectation...
      monchiffre[0] = '3' ;monchiffre[1] = '0' ;monchiffre[2] = '2' ;monchiffre[3] = '5' ;
      //monchiffre[4] = '0' ;monchiffre[5] = '0' ;monchiffre[6] = '5' ;monchiffre[7] = '1' ;
     
      chiffre = strtoint(monchiffre);//Appel de la procedure 'strtoint'
      printf("Chiffre de la chaine: %s est :%ld\n",monchiffre,chiffre) ;
     
      system("PAUSE");
      return 0;
    }
     
    long _exp(const long E)
    {
      int i = 0 , Ep = 1 ;
      if (E > 1)
      {
        for (i=1 ; i<=E-1 ; i++)
        {
          Ep *= 10 ;
        }
        return Ep ;
      }
      if (E == 1)
      {
        return 1 ;
      }
      if (E == 0)
      {
        return 0 ;
      }
    }
     
    long strtoint(const char *chaine)
    {
      long longueurChaine = strlen(chaine);//longueur de la chaine
      //cptinterne = compteur qui décrémente
      long compteur = 0 , cptinterne = longueurChaine , chiffre = 0 ;
      long base = 10 ;
      for (compteur = 0 ; compteur <= longueurChaine-1 ; compteur++)
            {
        switch (chaine[compteur])
              {
                      case '0':
                             cptinterne-- ;
                      break;
                      case '1':
                             chiffre += 1 * _exp(cptinterne) ;
                             cptinterne-- ;
                      break;
                      case '2':
                             chiffre += 2 * _exp(cptinterne);
                             cptinterne-- ;
                      break;
                      case '3':
                             chiffre += 3 * _exp(cptinterne);
                             cptinterne-- ;
                      break;
                      case '4':
                             chiffre += 4 * _exp(cptinterne);
                             cptinterne-- ;
                      break;
                      case '5':
                             chiffre += 5 * _exp(cptinterne);
                             cptinterne-- ;
                      break;
                      case '6':
                             chiffre += 6 * _exp(cptinterne);
                             cptinterne-- ;
                      break;
                      case '7':
                             chiffre += 7 * _exp(cptinterne);
                             cptinterne-- ;
                      break;
                      case '8':
                             chiffre += 8 * _exp(cptinterne);
                             cptinterne-- ;
                      break;
                      case '9':
                             chiffre += 9 * _exp(cptinterne);
                             cptinterne-- ;
                      break;
                      default:
                             chiffre = 0 ;
                             chaine = "" ;
                      break;
              }
            }
      return chiffre ;
    }

  4. #4
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    je te propose la solution suivante, qui me parait plus simple et qui ne nécessite pas l'utilisation de la fonction pow :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    long strtoint(const char *chaine) {
        int i, base=10, n, longueurChaine=strlen(chaine);
        long chiffre=0, basecur=1;
     
        for (i=longueurChaine-1;i>=0;i--) {
            if ( chaine[i]>='0' && chaine[i]<='9' ) {
                n = chaine[i] - '0';
                chiffre = chiffre + n * basecur;
                basecur = basecur * base;
            }
        }
     
        return chiffre ;
    }
     
    int main(void) {
        long chiffre = 0;
        char monchiffre[13] = {0};//De 0 a 11 caracteres
     
        printf("Veuillez entrer un nombre : ");
        fgets(monchiffre,13,stdin);
        chiffre = strtoint(monchiffre);
     
        printf("Chiffre de la chaine %s est : %ld\n",monchiffre,chiffre);
     
        return 0;
    }

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    Janvier 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 81
    Par défaut
    Bonjour
    J'ai trouvé cette petite fonction il n'y a pas longtemps :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <stdio.h>
     
    char buffer[256];
    int variable = 12;
    int verification;
     
    verification = sprintf(buffer,"%d",variable);
    printf("%s\n",buffer);

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Citation Envoyé par F0ul Voir le message
    Bonjour
    J'ai trouvé cette petite fonction il n'y a pas longtemps :

    <snip>
    Le titre du thread dit "fonction personnelle".
    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.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/02/2013, 05h15
  2. Réponses: 3
    Dernier message: 06/06/2011, 21h20
  3. Transformer une String en fonction
    Par Jevil dans le forum MATLAB
    Réponses: 12
    Dernier message: 07/02/2008, 23h46
  4. [XSLT] Transformer un String contenant du xml
    Par VinceFromBcn dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 07/07/2004, 12h42
  5. Transformer un String en InputStream
    Par felix79 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 07/07/2004, 12h18

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