addition de nombres stocké sous forme de char - Page 2
Répondre à la discussion
Page 2 sur 2 PremièrePremière 2
Affichage des résultats 31 à 59 sur 59

addition de nombres stocké sous forme de char



  1. #31
    invite1c6b0acc

    Re : addition de nombres stocké sous forme de char


    ------

    Citation Envoyé par physiquantique Voir le message
    Bonjour ,
    je viens de rajouter des caractères null à la fin des résultats (dans addition et multichiffre) , et toujours le même résultat . Un exemple : multiplication de 11*222222222222.

    Code:
    + 022
    + 0220
    + 02200
    + 022000
    + 0220000
    + 02200000
    + 022000000
    + 0220000000
    + 02200000000
    + 022000000000
    + 0220000000000
    + 02200000000000
    resultat: 244444444442010
    déjà :
    11*222222222222 = 2444444444442
    tu trouves :
    11*222222222222 = 244444444442010
    Donc ton résultat est faux, même si on suppose qu'il est suivit par des chiffres non désirés : il manque un 4.
    D'autre part, au moment où tu l'affiches, il n'y a PAS de caractère nul à la place du 0.
    Donc, soit tu ne l'as jamais mis, soit tu l'écrases par la suite.
    C'est très facile à voir : il te suffit d'avancer pas par pas avec un debugger en regardant à quel moment il change.

    -----

  2. #32
    invite76db3c86

    Re : addition de nombres stocké sous forme de char

    Bonjour,
    Emacs permet il le deboggage ?

    Par ailleurs , effectivement quand je fais 11*2222222222 , le résultat est faux , mais quand je fais 222222222*11 (ou plus géneralement quand je met le plus grand nombre à gauche) , le résultat est bon (bien que toujours suivi de caractères bizzarres).

    Je ne comprends pas , d'un point de vue simplement algorithmique , comment ca peut se produire . Après , je suis novice en c ...

    Merci en tout cas pour votre réponse .

    Bonne journée .

  3. #33
    invite2d7144a7

    Re : addition de nombres stocké sous forme de char

    Bonjour,

    Solution : retour au papier + crayon.

    Tu choisis 2 nombres (pas besoin qu'ils soient trop longs)

    Et tu exécutes ton programme à la main, en notant l'évolution des variables ("tu exécutes ton programme à la main" signifie que tu suis ton code ligne à ligne, ce que tu as effectivement écrit, et non ce que tu penses avoir fait !)

    Tu finiras par trouver le problème.


  4. #34
    invite76db3c86

    Re : addition de nombres stocké sous forme de char

    Le truc c'est que pour des petits nombres le programme retourne le bon résultat . Le problème vient à coup sur de la gestion des chaines de caractères . Donc j'aurais beau le faire au crayon , à moins de le faire pour b avec au moins 12 chiffres , je ne trouverais pas le problème.

    Mais ça vient surement de ma gestion des pointeurs qui est hasardeuse ...

    Bref , si quelqu'un voyait par hasard une erreur dans mon code (et il ne doit pas y en avoir qu'une) , je lui en serait reconnaissant , ca me permettrait d'évoluer un peu sur plusieurs outils que je maitrise mal .

  5. #35
    invite2d7144a7

    Re : addition de nombres stocké sous forme de char

    Bonjour,
    Citation Envoyé par physiquantique Voir le message
    Le truc c'est que pour des petits nombres le programme retourne le bon résultat . Le problème vient à coup sur de la gestion des chaines de caractères . Donc j'aurais beau le faire au crayon , à moins de le faire pour b avec au moins 12 chiffres , je ne trouverais pas le problème.

    Mais ça vient surement de ma gestion des pointeurs qui est hasardeuse ...

    Bref , si quelqu'un voyait par hasard une erreur dans mon code (et il ne doit pas y en avoir qu'une) , je lui en serait reconnaissant , ca me permettrait d'évoluer un peu sur plusieurs outils que je maitrise mal .
    Désolé pour toi, mais quand on veut progresser, il faut faire des efforts.

  6. #36
    invite76db3c86

    Re : addition de nombres stocké sous forme de char

    Citation Envoyé par whoami Voir le message
    Bonjour,

    Désolé pour toi, mais quand on veut progresser, il faut faire des efforts.
    c'est cruel .
    Aller un indice !
    Cu sta maioun , noun si bagna (citation de "Ben" ...).

  7. #37
    invite76db3c86

    Re : addition de nombres stocké sous forme de char

    Bon déja pour l'erreur sys malloc chez pas trop quoi , la solution se trouvait dans le code proposé par wizard of lynn : lorsque je fait malloc pour un char * , il faut que j'écrives (char *)malloc(...) .

    Je sais pas trop pourquoi , mais soit .

    Mais sinon , ya toujours la non symétrie de ma multiplication , qui donne un résultat bon lorsque je met le plus grand nombre en premier , et faux dans le cas contraire .

    Je me remets au boulot ... (papier crayon doliprane etc...) .

  8. #38
    Jack
    Modérateur

    Re : addition de nombres stocké sous forme de char

    Bon déja pour l'erreur sys malloc chez pas trop quoi , la solution se trouvait dans le code proposé par wizard of lynn : lorsque je fait malloc pour un char * , il faut que j'écrives (char *)malloc(...) .

    Je sais pas trop pourquoi , mais soit .
    Surement parce que tu utilises un compilateur C++.

    PS: il faudrait que tu republies ton code à jour parce qu'on ne sait plus trop où tu en es.

  9. #39
    invite76db3c86

    Re : addition de nombres stocké sous forme de char

    Citation Envoyé par Jack Voir le message
    Surement parce que tu utilises un compilateur C++.

    PS: il faudrait que tu republies ton code à jour parce qu'on ne sait plus trop où tu en es.
    Avec plaisir :
    Code:
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #define NMAX 100
    #include "definitions.h"
    typedef struct {
      char * chiffres;
    } nombre ;
    
    /* MULTIPLICATION --------------------------------------------------------------------------------------------------*/
    char *multiplication(char a[],char b[])
    {
      nombre liste[strlen(b)];
      nombre sum;
      sum.chiffres="0";
      int i=strlen(b)-1;
    
      /*On remplit les résultats des multiplications nombre-chiffres dans une liste 
        de nombres*/
    
      while(i>=0)
        {
          liste[i].chiffres=multichiffre(a,b[i]-'0',(int)strlen(b)-i-1); /* liste des multchiffre*/
          printf("+ %s\n",liste[i].chiffres);
          i=i-1;
        }
    
      /* Addition des élements de la liste */
    
      i=0;
      while(i<=strlen(b)-1) /* somme des liste[i]*/
        {
         sum.chiffres=addition(liste[i].chiffres,sum.chiffres);
         zerosdebut(sum.chiffres);
         printf("i= %d , sum = %s\n",i,sum.chiffres);
          i=i+1;
        }
    
      /*suppression des zeros en début*/
    
      zerosdebut(liste[strlen(b)-1].chiffres);
      return sum.chiffres;
    }
    
    /*MULTIPLICATION NOMBRE-CHIFRRE ----------------------------------------------------------*/
    char *multichiffre(char a[],int b,int n)
    {
      char *resultat;
      resultat=(char*)malloc((strlen(a)+n+1)*sizeof(char));
      int k;
      int retenue=0;
      int chiffre=0;
      char z[]="";
      int i=strlen(a)-1;
    
      while (i>=0)
        {
          chiffre=(a[i]-'0')*b+retenue;
        
          if (chiffre>9)
    	{
    	  retenue=(chiffre-chiffre%10)/10;
    	  chiffre=chiffre%10;
    	}
          else
    	{
    	  retenue=0;
    	}
    	  
          resultat[i+1]=chiffre+'0';
    	  i=i-1;
        }
      resultat[0]=retenue+'0';
          int j=0;
    
          for (j=strlen(a)+1;j<(strlen(a)+n+1);j++)
    	{
    	  resultat[j]='0';
    	}
    
          resultat[strlen(resultat)]='\0'; 
      
          return resultat;
          free(resultat);
    }
    /* ENLEVER LES ZEROS DE DEBUT--------------------------------------------------------*/
    void zerosdebut(char a[])
    {
      while(a[0]=='0')
        {
          RemoveChar(a,0);
        }
    }
    
    /*RETIRER LES c PREMIERS CARACTERES DE STR----------------------------------*/
    void RemoveChar(char *str,int c){
        int x = 0;
        c--;
        while(str[x] != '\0'){
            if(x >= c){
                str[x] = str[x+1];
            }
            x++;
        }
        printf("removechar done : %s\n",str);
    }
    Bonne journée .

  10. #40
    invite76db3c86

    Re : addition de nombres stocké sous forme de char

    Et l'addition , qui est sûrement pas innocente dans l'histoire :

    Code:
    char * addition(char c[],char d[])
    {
      char * a;
      char * b;
      int lena=strlen(c);
      int lenb=strlen(d);
      if (lena>lenb)
        {
          b=zeros(d,lena-lenb);
          a=c;
        }
      else
        {
          a=zeros(c,lenb-lena);
          b=d;
        }
      char * resultat =(char*)malloc(strlen(a)*sizeof(*b));
      int j=0;
     for (j=0;j<strlen(a);j++)
        {
          resultat[j]='0';
    
        } 
      int i=(int)strlen(b)-1; /* Initialisation de i*/
    
      int tempa,tempb,retenue,itemp;
      retenue=0;
      while (i>=0)
        {
          tempa=a[i]-'0';            /* On lit le ieme chiffre*/
       
          tempb=b[i]-'0';
         
          itemp=tempa+tempb+retenue; /*chiffre de a + chiffre de b +retenue*/
          if (itemp>9)
    	{
    	  retenue=1;
    	  itemp=itemp-10;
    
    	  resultat[i+1]=itemp+'0';
    	}
          else
    	{
    	  retenue=0;
    	  resultat[i+1]=itemp+'0';
     
    	}
    
          i=i-1;
        }
    
      /* Si la retenue n'est pas nulle après la boucle*/
      if (retenue!=0)
        {
          resultat[0]='1';
       
        }
      else
        {
          resultat[0]='0';
        }
      resultat[strlen(resultat)]='\0';
      return resultat;
    }
    /* fonction qui ajoute n zeros en début de nombre*/
    char * zeros(char nombre[],int n)
    {
      int i=0;
      int len=(int)strlen(nombre);
      char * c=(char*)malloc((strlen(nombre)+n)*sizeof(*c));
      char d[n];
      
      while (i<n)
        {
          c[i]='0';
          i=i+1;
        }
      i=0;
      strcat(c,nombre);  /* LIGNE QUE JE SOUPCONNE DE FAIRE DECONNER LA MULTIPLICATION */
     
      return c;
    }

  11. #41
    Jack
    Modérateur

    Re : addition de nombres stocké sous forme de char

    Quel est le contenu de definition.h?

  12. #42
    Jack
    Modérateur

    Re : addition de nombres stocké sous forme de char

    Code:
    char *multiplication(char a[],char b[]){
      nombre liste[strlen(b)];
    Tu as quoi comme compilateur pour pouvoir déclarer des tableaux dynamiques ainsi?

  13. #43
    invite76db3c86

    Re : addition de nombres stocké sous forme de char

    C'est simplement la collection des signatures des fonctions utilisés dans les différents fichiers à compiler :

    Code:
    char * addition(char c[],char d[]);
    char * multichiffre(char a[],int b,int n);
    void modulo(char a[] ,char b[]);
    int biggerthan(char a[],char b[]);
    char * zeros(char a[],int n);
    char * addition(char c[],char d[]);
    void RemoveChar(char *str,int c);
    
    void zerosdebut(char a[]);

  14. #44
    invite76db3c86

    Re : addition de nombres stocké sous forme de char

    Citation Envoyé par Jack Voir le message
    Code:
    char *multiplication(char a[],char b[]){
      nombre liste[strlen(b)];
    Tu as quoi comme compilateur pour pouvoir déclarer des tableaux dynamiques ainsi?
    gcc version 4.8.2 .

    Mais effectivement ca vient surement de là le problème .
    (multiplication est une fonction par contre, et je voudrais qu'elle renvoit un pointeur sur un tableau) .

  15. #45
    Jack
    Modérateur

    Re : addition de nombres stocké sous forme de char

    Je vais avoir du mal à tester ton programme car mon compilateur ne reconnait pas les tableau à taille variable

  16. #46
    invite76db3c86

    Re : addition de nombres stocké sous forme de char

    Citation Envoyé par Jack Voir le message
    Je vais avoir du mal à tester ton programme car mon compilateur ne reconnait pas les tableau à taille variable
    Je ne dois pas avoir un compilateur si particulier pourtant . Je ne sais pas si ce sont des tableau à taille variable , mais l'idée c'est c'était de faire des pointeurs vers des tableau pour pouvoir renvoyer un tableau depuis les fonctions , et de choisir leur taille lors de leur allocation .

  17. #47
    Jack
    Modérateur

    Re : addition de nombres stocké sous forme de char

    Mon compilateur ne traite que du code C++, donc pas de tableau à taille variable. J'ai une VM debian pour voir si ça compile avec gcc

  18. #48
    invite76db3c86

    Re : addition de nombres stocké sous forme de char

    Je crois que le mien aussi compile le C++ , non ?

    Un compilateur qui compile C++ ne compile pas le C également ?

  19. #49
    Jack
    Modérateur

    Re : addition de nombres stocké sous forme de char

    Non, bien que très proches, ce sont 2 langages difféfrents.

    D'après ce que j'ai pu lire, les tableaux de taille variable ont été introduits avec C99, alors qu'à cette époque, C++ vivait déjà sa propre vie.

  20. #50
    Jack
    Modérateur

    Re : addition de nombres stocké sous forme de char

    Il n'y a pas de fonction main dans ton programme?

  21. #51
    invite1c6b0acc

    Re : addition de nombres stocké sous forme de char

    Moi, je ne peux pas le compiler.
    Il manque le fichier definition.h

  22. #52
    Jack
    Modérateur

    Re : addition de nombres stocké sous forme de char

    Citation Envoyé par Chanur Voir le message
    Moi, je ne peux pas le compiler.
    Il manque le fichier definition.h
    Réponse message #43

  23. #53
    invite76db3c86

    Re : addition de nombres stocké sous forme de char

    Bonjour ,

    à Jack : si j'ai un main à part que je compile avec les autres fichiers . C'est un main très court du genre :

    Code:
    int main(...)
    {
     char a[NMAX];
     char b[NMAX];
     printf("a=?\n");
     scanf("%s",a);
     printf("b=?\n");
     scanf("%s",b);
    char resultat[NMAX];     /* OU BIEN  *resultat (JE NE SUIS PAS CHEZ MOI J AI PLUS MES FICHIERS) */
    printf("resultat: %s\n",resultat);
    return 0;
    }
    Mais qui sait , c'est ptetre ce ptit bout de code qui fout le bouzin .

    à Chanur : definitions.h contient juste les signatures des fonctions (cf. message 43).

    A tout le monde (relax ) : il faut remplacer , si c'est pas déja fait , dans addition.c : le malloc par (char*)malloc... . /!\

    Bonne journée .

  24. #54
    invite76db3c86

    Re : addition de nombres stocké sous forme de char

    Citation Envoyé par Jack Voir le message
    Il n'y a pas de fonction main dans ton programme?
    Plus sérieusement : voici la fonction main :
    Code:
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include "definitions.h"
    #define NMAX 100
    
    
    
    int main(int argc,char *argv[])
    {
      char a[NMAX];
      char b[NMAX];
      printf("a=?\n");
      scanf("%s",a);
      printf("b=?");
      scanf("%s",b);
    
     
      
      char *resultat;
      resultat=multiplication(a,b);
      resultat[strlen(resultat)]='\0';
      printf("resultat: %s \n",resultat);
    
      return 0;
    }
    *

  25. #55
    Jack
    Modérateur

    Re : addition de nombres stocké sous forme de char

    J'avoue que j'ai un peu la flemme de me plonger dans ton algo parce que ça risque de prendre un temps fou.
    En revanche, j'ai essayé avec les données que tu avais essayées: 11 et 2222222222
    Contrairement à ce que tu disais, le résultat est faux quel que soit l'ordre d'introduction des données.

  26. #56
    invite76db3c86

    Re : addition de nombres stocké sous forme de char

    Bonjour ,
    Pas pour moi : resultat : 24444444442.
    (en faisant 22222*11... mais pas 11*222...) .
    De toute façon , il y a peu de chance que l'algorithme lui même soit faux vu que je fais pas quelquechose d'hors du commun , mais je penche plutôt pour une mauvaise gestion soit des chaines de caractères , soit des pointeurs .

    L'état actuel du programme est le suivant (j'ai testé beaucoup de grande , très grandes valeurs) : le résultat contient TOUJOURS le bon résultat suivit selon le cas de caractères spéciaux , et qui sont réellements contenus dans la variables résultat (ils s'additionent quand je fais addition(résultat,resultat) ) .

    Bref , L'épée est toujours plantée dans le rocher (par contre , elle n'ouvre sûrement pas la porte d'un grand royaume désolé) .
    Bonjour.

  27. #57
    invite76db3c86

    Re : addition de nombres stocké sous forme de char

    Du coup j'y vais en bidouille :

    Première remarque : quand je change le (char *) malloc ((strlen(a)+n+1)*sizeof(char)) par (char *) malloc((strlen(a)+n+1000)) bah ... ça bug plus pour des nombres avec qui ça buguait ....

    Ca doit se passer au niveaux des tailles des pointeurs ...


    Si j'y arrive pas , je vais tous refaire comme wizard of Lynn m'a conseillé , en utilisant tout le temps la structure NOMBRE .

  28. #58
    Jack
    Modérateur

    Re : addition de nombres stocké sous forme de char

    j'ai exécuté ton code et voici le résultat qui me semble incorrect.

  29. #59
    invite76db3c86

    Re : addition de nombres stocké sous forme de char

    Toute façons j'abandonne , ça me gonfle j'y arrive pas ... Maintenant j'ai modifié mon addition même elle elle ne marche plus .

Page 2 sur 2 PremièrePremière 2

Discussions similaires

  1. Programme addition de nombres (débutant)
    Par invite382dfa13 dans le forum Électronique
    Réponses: 2
    Dernier message: 01/04/2012, 22h23
  2. Tout petit insecte en forme de char d'assaut
    Par zyket dans le forum Identification des espèces animales ou végétales
    Réponses: 2
    Dernier message: 20/07/2011, 16h45
  3. Déterminer la forme algébrique d'un nombre complexe écrit sous forme trigonométrique
    Par invite8412c11b dans le forum Mathématiques du collège et du lycée
    Réponses: 6
    Dernier message: 13/01/2009, 21h53
  4. Factorisation d un nombre premier sous la forme P=(x-1)(y-1) (x,y deux nombres premiers)
    Par invite37f01ff2 dans le forum Mathématiques du supérieur
    Réponses: 6
    Dernier message: 10/12/2008, 11h57
  5. [C]-Conversion Int -> Char, Float -> Char, ...
    Par invite3c35244f dans le forum Électronique
    Réponses: 2
    Dernier message: 25/06/2008, 11h05