Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2332 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Erreur dans mon examen de TP, fonction PGCD

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Erreur dans mon examen de TP, fonction PGCD

n°612743
Zipo
Ours bipolaire
Posté le 15-01-2004 à 16:59:44  profilanswer
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5. #define MAX 100 /* taille maximale des grands entiers manipulA~(c)s */
  6. #define BASE 10000
  7. typedef unsigned int CHIFFRE;
  8. typedef CHIFFRE BIGNUM[MAX];
  9. void affiche(BIGNUM z)
  10. {
  11. /* affiche a l'ecran le grand entier z */
  12.   int k;
  13. /* on cherche le chiffre le plus significatif */
  14.   k=MAX-1;
  15.   while ((k >=0) && (z[k] == 0))
  16.     k--;
  17. /* si le nombre n'est pas nul */   
  18.   if (k >= 0) 
  19.   {
  20.     /* on affiche le chiffre significatif */
  21.      printf("%u",z[k]);
  22.      k--;
  23.      while (k  >= 0)
  24.         {
  25. /* le format %.4u ecrit sur 4 caracteres en completant a gauche par des 0 */
  26. /* si necessaire */
  27.           printf("%.4u",z[k]);
  28.           k--;
  29.         } 
  30.    }
  31.   else
  32.      printf("0" ); 
  33.   printf("\n" );
  34. }
  35. void zero(BIGNUM z)
  36. {
  37. /* initialise le grand entier z a zero */
  38.   memset(z,0,sizeof(BIGNUM));
  39. }
  40. void alea(BIGNUM z, unsigned int n)
  41. {
  42. /* remplit les n premiers chiffres du grand entier z de fac,on aleatoire */
  43.   unsigned int j;
  44.  
  45.   zero(z);
  46.   srand(time(NULL));
  47.   for (j = 0; j < n; j++)
  48.      z[j] = rand() % BASE;
  49. }
  50. void copier(BIGNUM x, BIGNUM y)
  51. {
  52. /* copie la valeur du grand entier x dans le grand entier y */
  53.   memcpy(y,x,sizeof(BIGNUM));
  54. }
  55. /***** PARTIE A COMPLETER *************/
  56. void inc(BIGNUM z)
  57. {
  58. int i=0;
  59. while ( ((z[i] + 1) % BASE == 0)  &&  (i<MAX)  )
  60.        {  z[i] = 0;
  61.       i++;
  62.    } 
  63. z[i] += 1;
  64. }
  65. unsigned char plusgrand(BIGNUM z, BIGNUM y)
  66. { int k;
  67.   k=MAX-1;
  68.   while ((k >=0) && (z[k] == 0) && (y[k] == 0))
  69.     k--;
  70.        if ( z[k] >= y[k] )
  71.       return 1;
  72. else
  73.   return 0; 
  74. }
  75. void sub(BIGNUM z, BIGNUM y)
  76. int k, c;
  77.    BIGNUM x;                             
  78.    copier(y, x);
  79.  
  80.   for( k=0 ; k<MAX ; k++)
  81.      { 
  82.      if( z[k] >= x[k] )
  83.         z[k] -= x[k];
  84. else {
  85.        c = z[k] - x[k];
  86.        z[k] = BASE + c;
  87.  
  88.    if(k<MAX-1)
  89.       x[k+1] += 1;
  90. }
  91. }
  92. }
  93. void divise(BIGNUM a, BIGNUM b, BIGNUM q, BIGNUM r)
  94.    BIGNUM x;
  95.    copier(a, x);
  96.    zero(q);
  97.  
  98.    while ( plusgrand(x, b) ){
  99.            sub(x, b);
  100.            inc(q);
  101.            }
  102.    copier(x, r);
  103. }
  104. int notnul(BIGNUM a)
  105. {
  106.     int k = MAX-1;
  107. while (k >= 0){
  108.        if (a[k] != 0)
  109.        return 1;
  110.  
  111.    k--;
  112.       }   
  113. return 0;
  114. }
  115. void pgcd(BIGNUM a, BIGNUM b, BIGNUM d)
  116. {
  117.    if ( notnul(b) == 0 )
  118.         copier(a, d); 
  119.  
  120. else{
  121.        if (  plusgrand(a, b) )
  122.         {    sub(a, b);
  123. pgcd(a, b, d);
  124. }
  125. else  pgcd(b, a, d);
  126. }
  127. }
  128. int main()
  129. {
  130.   BIGNUM a,b,q,r,d;
  131.  
  132.   zero(a);
  133.   zero(b);
  134.   a[15] = 998;
  135.   a[1] = 12;
  136.   b[14] = 8;
  137.   b[0] = 3;
  138.   printf("a = " );
  139.   affiche(a);
  140.   printf("b = " );
  141.   affiche(b);
  142.   divise(a,b,q,r);
  143.   printf("q = " );
  144.   affiche(q);
  145.   printf("r = " );
  146.   affiche(r);
  147.   zero(a);
  148.   zero(b);
  149.   a[4] = 768;
  150.   a[1] = 12;
  151.   a[0] = 727;
  152.   b[3] = 2179;
  153.   b[2] = 2321;
  154.   b[0] = 428; 
  155.   printf("a = " );
  156.   affiche(a);
  157.   printf("b = " );
  158.   affiche(b);
  159.  
  160.   pgcd(a, b, d);
  161.   printf("d = " );
  162.   affiche(d);
  163.   return 0;
  164. }


 
Bonjour, voila je sors d'examen de TP de C
J'ai apparemennt tout fait mais lorsque j'execute la derniere fonction (pgcd) j'obtenais une segmentation fault (snif)
J'ai cherché tout le temps qui me restait mais j'ai pas trouvé d'ou venait l'erreur :/
Vous pouvez m'aider ? Pask du coup ca me turlupine, j'espère que ca vient pas d'autres fonctions au dessus ou quoi
Je précise que la main() et les fonctions affiche zero alea copier m'étaient données. voila
merci!


---------------
- mon feed-back
mood
Publicité
Posté le 15-01-2004 à 16:59:44  profilanswer
 

n°612925
jagstang
Pa Capona ಠ_ಠ
Posté le 15-01-2004 à 19:55:38  profilanswer
 

moi j'ai ça  
 

Code :
  1. int pgcd(int a, int b)
  2.     {
  3.     if (a%b == 0)
  4.         return b ;          // égal à 'b' si 'b' divise 'a'
  5.     return pgcd(b, a%b) ;   // sinon, égal un pgdc de 'b' et de 'a' mod 'b'
  6.     }

n°612931
Zipo
Ours bipolaire
Posté le 15-01-2004 à 20:07:05  profilanswer
 

jagstang a écrit :

moi j'ai ça  
 

Code :
  1. int pgcd(int a, int b)
  2.     {
  3.     if (a%b == 0)
  4.         return b ;          // égal à 'b' si 'b' divise 'a'
  5.     return pgcd(b, a%b) ;   // sinon, égal un pgdc de 'b' et de 'a' mod 'b'
  6.     }




 
 
Dans l'énnoncé ils demandaient de faire l'algo du PGCD avec les conditions suivantes :
 
pgcd(a, 0) = a
pgcd(a, b) = pgcd(b, a)  si a<b
pgcd(a, b) = pgcd(a-b, b) si a>=b
 
Vous la voyez ou l'erreur de segmentation dans le code :??:


---------------
- mon feed-back
n°613102
Zipo
Ours bipolaire
Posté le 15-01-2004 à 23:11:55  profilanswer
 

C'est bon j'ai trouvé... en fait c'était ma fonction plusgrand() qui foirait pff...
 
Voila le code correct :
 

Code :
  1. unsigned char plusgrand(BIGNUM z, BIGNUM y)
  2.   { int k;
  3.    
  4.       k=MAX-1;
  5.       while ((k >= 0) && (z[k] == 0) && (y[k] == 0))
  6.         k--;
  7.    
  8.       while((k >= 0) && (z[k] == y[k]))
  9.              k--;
  10.         if(k<0)
  11.         return 1;
  12.         else{
  13.                    if(z[k]>=y[k])
  14.                      return 1;
  15.                    else
  16.                      return 0;
  17.             }
  18.   }


Message édité par Zipo le 15-01-2004 à 23:39:02

---------------
- mon feed-back

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Erreur dans mon examen de TP, fonction PGCD

 

Sujets relatifs
$_FILES, move_uploaded_file => erreur ![C++] pb avec un return d une fonction dans une class
ASP - ADSI Impossible d'ajouter un User, erreur 80005008fonction
[Pro*C]recuperer le resultat d'une fonction pl/sql[C++] [newbiz] Fonction de tirage aléatoire ?
Fonction string sous Interbase[PERL] Objet et fonction "private"
Melange de bbcode et html avec la fonction "nl2br" [résolu]return !0 en fin de fonction. D'ou viens cette notation ?
Plus de sujets relatifs à : Erreur dans mon examen de TP, fonction PGCD


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR