Erreur dans mon examen de TP, fonction PGCD

Erreur dans mon examen de TP, fonction PGCD - C - Programmation

Marsh Posté le 15-01-2004 à 16:59:44    

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
Reply

Marsh Posté le 15-01-2004 à 16:59:44   

Reply

Marsh Posté le 15-01-2004 à 19:55:38    

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.     }

Reply

Marsh Posté le 15-01-2004 à 20:07:05    

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
Reply

Marsh Posté le 15-01-2004 à 23:11:55    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed