/*************************************************************************************************************************************/ /* */ /* E N U M E R A T I O N D E S R A T I O N N E L S : */ /* */ /* */ /* Author of '$xtc/EnumerationDesRationnels.01$vv$c' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20220730095624). */ /* */ /*************************************************************************************************************************************/ #include "INCLUDES.01.I" #define TRIER \ VRAI typedef struct { unsigned int Numerateur; unsigned int Denominateur; } Fraction; /* Definition d'une fraction (nombre rationnel). */ #define Numer(fraction) \ (fraction.Numerateur) #define Denom(fraction) \ (fraction.Denominateur) #define EGAL(fraction,numerateur,denominateur) \ { \ Numer(fraction) = numerateur; \ Denom(fraction) = denominateur; \ } #define MOYENNE_DE_BROCOT(Rationnel_R,Rationnel_A1,Rationnel_A2) \ { \ EGAL(Rationnel_R,Numer(Rationnel_A1)+Numer(Rationnel_A2),Denom(Rationnel_A1)+Denom(Rationnel_A2)); \ /* Voir 'v $ximD/definit.1$DEF MOYENNE_MEDIANE_DE_DEUX_FRACTIONS' a ce propos... */ \ } #define PROFONDEUR \ 3 int compteur=0; #define LONGUEUR \ ((1<<PROFONDEUR)-1) #define INDEX0 \ 0 #define INDEXn \ (LONGUEUR-1) double tableau[LONGUEUR]; int numerateurs__[LONGUEUR]; int denominateurs[LONGUEUR]; int permutation[LONGUEUR]; int IndexRationnels=0; void EnumerationDesRationnels(Rationnel_A1,Rationnel_A2) Fraction Rationnel_A1; Fraction Rationnel_A2; { Fraction Rationnel_A1A2; compteur++; MOYENNE_DE_BROCOT(Rationnel_A1A2,Rationnel_A1,Rationnel_A2); tableau[IndexRationnels] = ((double)Numer(Rationnel_A1A2))/((double)Denom(Rationnel_A1A2)); numerateurs__[IndexRationnels] = Numer(Rationnel_A1A2); denominateurs[IndexRationnels] = Denom(Rationnel_A1A2); IndexRationnels++; if (TRIER == FAUX) { printf("%f" ,((double)Numer(Rationnel_A1A2))/((double)Denom(Rationnel_A1A2)) ); printf(" %d/%d" ,Numer(Rationnel_A1A2),Denom(Rationnel_A1A2) ); printf(" =M(%d/%d,%d/%d)" ,Numer(Rationnel_A1),Denom(Rationnel_A1) ,Numer(Rationnel_A2),Denom(Rationnel_A2) ); printf("\n"); } else { } if (compteur < PROFONDEUR) { EnumerationDesRationnels(Rationnel_A1,Rationnel_A1A2); EnumerationDesRationnels(Rationnel_A1A2,Rationnel_A2); } else { /* Cas ou l'on a genere suffisamment de Rationnels... */ } compteur--; } #include "tri_N2.02.I" void main() { Fraction Rationnel_01; Fraction Rationnel_10; EGAL(Rationnel_01,0,1); EGAL(Rationnel_10,1,0); EnumerationDesRationnels(Rationnel_01,Rationnel_10); if (TRIER == VRAI) { int index; for (index=INDEX0 ; index<=INDEXn ; index++) { permutation[index] = index; } tri(INDEX0,INDEXn); /* Tri des Rationnels dans l'ordre croissant... */ for (index=INDEX0 ; index<=INDEXn ; index++) { printf("%d/%d\n",numerateurs__[permutation[index]],denominateurs[permutation[index]]); } } else { } }