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 :

Convertion de chaine en grand nombre et calcul


Sujet :

C

  1. #1
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut Convertion de chaine en grand nombre et calcul
    Bonjour à tous,

    Voici mon code exact:
    (val est une chaine de 12 caractères initialisée à 107252372255)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int cle,res1,res2,res3; 
    float code,reste; 
    char strTmp[11]=""; 
     
    strncpy(strTmp,val,10); // Extraire les 10 premiers 
    sscanf(strTmp,"%f",&code); // Stocker le code en numérique 
    printf("0>(%f)<",code); // Affiche 1072523712.000 (au lieu de 1072523722.000) // ERREUR 1
    reste = code/100; 
    printf("1>(%f)<",reste); // Affiche 10725237.000 
    res1 = code-(100*reste); 
    res2 = reste-(17*(code/1700)); 
    res3 = ((res1+res2)%100); 
    printf("2>(%d)(%d)(%d)<",res1,res2,res3); // Affiche (0)(0)(0) ERREUR 2
    while(!kbhit());
    Pourquoi ça ne marche pas ?

    Merci d'avance.
    David.

  2. #2
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut Re: Convertion de chaine en grand nombre et calcul
    Montre l'initialisation de val stp
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  3. #3
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Bonjour sorry60,
    En fait, elle est travaillée de multiple fois, mais je ne pense pas qu'elle soit la cause.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char prod[32];
    strcpy(prod,"");
    strncpy(prod,temp,31); // Sachant que temp fait rarement 31
    Ensuite, je la passe dans la fonction ci-dessus
    David.

  4. #4
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Salut,

    Pour ton erreur1, met code en type double, ça passera.
    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
     
    #include <stdio.h>
    #include <string.h>
     
    int main()
    {
      char val[12] = "107252372255";
      double code;
      char strTmp[11];
     
      strncpy(strTmp,val,10);
      puts(strTmp);
      sscanf(strTmp,"%lf",&code);
      printf("%lf\n",code);
     
      return 0;
    }
    [Toma@tux ~]$ prog
    1072523722
    1072523722.000000
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  5. #5
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Pour res1, c'est normal que ça fasse 0 :
    1072523722 - 100*(1072523722/100) = 0

    Pour res2, idem

    Pour res3 donc aussi.

    Revois tes formules, ou alors j'ai loupé un épisode
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  6. #6
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Ok, c'est extra, la premiere étape est passée, merci.

    As tu une idée pour la deuxième ?

    Comment faire des calculs avec des types différents ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int sortir=0,cle,res1,res2,res3;
    double code,reste;
     
    res1 = (int)(code-(100*reste)); // Reste = 10725237
    res2 = (int)(reste-(17*(code/1700))); // Code = 1072523722
    res3 = (((int)(res1+res2))%100);
    printf("(%d)(%d)(%d)<",res1,res2,res3); // Affiche 0,0,0
    David.

  7. #7
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Non, car c'est
    072523722 - 100*entier(1072523722/100) =
    072523722 - 072523700 = 22

    Que je veux (faut virer la virgule en fait, mais je ne peux pas le transformer en int...)
    David.

  8. #8
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par dacid
    Non, car c'est
    072523722 - 100*entier(1072523722/100) =
    072523722 - 072523700 = 22

    Que je veux (faut virer la virgule en fait, mais je ne peux pas le transformer en int...)
    Si je comprend bien ce que tu veux faire (car c'est difficile), tu souhaites que le résultat de code/100 soit entier ? dans ce cas c'est simple tu cast (tronque en math) comme cela :
    1072523722/100 =>> 10725237
    Donc apres si tu fais * 100 ça donnera bien 1072523700
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  9. #9
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Ui, c'est ça en gros sauf que le résultat peut ne pas tenir dans un int.

    Mais j'ai fait ça avec un long et c'est ok:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    double code;
    long reste100,reste1700;
     
    reste100 = (long)(code/100);
    reste1700 = (long)(code/1700);
    res1 = (int)(code-(100*reste100));
    res2 = (int)(reste100-(17*reste1700));
    res3 = ((res1+res2)%100);
    Merci pout tout.
    David.

  10. #10
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Pense à la banniere resolu.

    Bon courage pour la suite
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  11. #11
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Grrrr,
    Tout marchait bien jusqu'à ce que ça ne marche plus !

    Avec une autre donnée: 3321145038
    ne passe pas le test: res1 = (int)(code-(100*reste100));
    Ca devrait renvoyer 38, et ça renvoie -1.
    David.

  12. #12
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par dacid
    Grrrr,
    Tout marchait bien jusqu'à ce que ça ne marche plus !

    Avec une autre donnée: 3321145038
    ne passe pas le test: res1 = (int)(code-(100*reste100));
    Ca devrait renvoyer 38, et ça renvoie -1.
    33211450*100 doit etre trop grand, je veux dire, il ne doit pas etre codable dans un long..
    Je me renseigne et je confirme.

    Edit :
    Un long int pourra contenir, sous Linux, une valeur entre :
    -2147483648 et 2147483647
    Voila...
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  13. #13
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Alors... Si tu as du temps devant toi, je te suggere la solution suivante :

    Si tu dois gerer des resultats entiers, mais qui ne tiennent pas dans des entiers, il existe une solution longue mais efficace: tu utilise des tableaux d'entiers.

    En effet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    31447895468252144 = 3 * 10^15 + 1 * 10^14 + und so weiter + 1 * 10^2 + 4 * 10^1 + 4 * 10^0
    Tu rentre ton nombre dans un tableau et hop !

    Comme ca tu n'es (presque) plus limite en taille. L'affichage c'est du gateau.
    Note: en plus apres tu peux bosser dans n'importe quelle base inferieure a 128

    Un seul inconvenient (distrayant): Il faut recoder les cinq operations de base...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char    *int_tab_add(char *nb1, char *nb2);
    char    *int_tab_sub(char *nb1, char *nb2);
    char    *int_tab_mult(char *nb1, char *nb2);
    char    *int_tab_div(char *nb1, char *nb2);
    char    *int_tab_mod(char *nb1, char *nb2);
    Mais bon si ton programme n'a pas a gerer des cas extremes, ce n'est pas la peine. Oublies ce post. Tout depend des contraintes.

    Cela dit, ce n'est pas si long que ca. Seule la multiplication pose un probleme. Elle est dure a coder de maniere efficace.
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  14. #14
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par Jack_serious
    Alors... Si tu as du temps devant toi, je te suggere la solution suivante :

    Si tu dois gerer des resultats entiers, mais qui ne tiennent pas dans des entiers, il existe une solution longue mais efficace: tu utilise des tableaux d'entiers.
    Beaucoup plus simple : utiliser des long long int...
    Un long long int pourra contenir, sous Linux, une valeur entre :
    -9223372036854775808 et 9223372036854775807
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("res1 : %d\n",(int)(code - (100*(long long int)(code/100))));
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  15. #15
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    C'est bon,

    J'ai fait: res1 = (int)(code-(100*((double)reste100)));
    Mais ça commence à devenir agaçant toutes ces variables et ces transtypages imbuvables... ...Tout ça pour avoir un nombre entre 0 et 100.
    David.

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

Discussions similaires

  1. calcul du plus grand nombre
    Par bernards111 dans le forum Général Python
    Réponses: 23
    Dernier message: 13/05/2011, 13h53
  2. Réponses: 14
    Dernier message: 05/10/2010, 15h26
  3. Réponses: 4
    Dernier message: 07/08/2008, 13h40
  4. Calcul Grand nombre
    Par Thesum4113 dans le forum C#
    Réponses: 3
    Dernier message: 08/01/2008, 17h14
  5. Réponses: 2
    Dernier message: 16/04/2007, 11h53

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