/*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D E S N O M B R E S R A T I O N N E L S : */ /* */ /* */ /* Author of '$xci/valeurs_ArbreSternBrocot$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20220802132730). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R F A C E ' listG ' : */ /* */ /* */ /* :Debut_listG: */ /* :Fin_listG: */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F I C H I E R S D ' I N C L U D E S : */ /* */ /*************************************************************************************************************************************/ #include INCLUDES_MINI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #define PROFONDEUR_DE_L_ARBRE \ TROIS \ /* Profondeur de l'arbre a generer. */ #define TRIER_LES_NOMBRES_RATIONNELS_PAR_ORDRE_CROISSANT \ VRAI #define UTILISER_LE_TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE \ VRAI /* Doit-on ('VRAI') ou pas ('FAUX') trier les nombres rationnels par ordre croissant ? */ #define EDITER_LES_VALEURS_DECIMALES \ FAUX \ /* Faut-il editer les valeurs decimales utiliser pour le tri ('VRAI') ou pas ('FAUX') ? */ \ /* ceci a ete introduit le 20220816135310... */ #include xci/valeurs.01.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #include xci/valeurs.02.I" #define PROFONDEUR_MAXIMALE_DE_L_ARBRE \ VINGT_QUATRE \ /* Profondeur maximale de l'arbre a generer... */ #define LONGUEUR_DES_LISTES(profondeur) \ PRED(INTE(DECG(UN,profondeur))) \ /* Longueur utile des listes qui est donc egale a une puissance de 2 moins 1. On notera */ /* que l'on ne peut pas utiliser 'PRED(INTE(PUIX(DEUX,profondeur)))' au niveau 'Local'... */ #define LONGUEUR_MAXIMALE_DES_LISTES \ LONGUEUR_DES_LISTES(PROFONDEUR_MAXIMALE_DE_L_ARBRE) \ /* Profondeur maximale de l'arbre a generer. */ #define LONGUEUR_COURANTE_DES_LISTES \ LONGUEUR_DES_LISTES(profondeur_de_l_arbre) #define INDEX_DU_PREMIER_NOMBRE_RATIONNEL \ INDEX0 #define INDEX_DU_DERNIER_NOMBRE_RATIONNEL \ LSTX(INDEX_DU_PREMIER_NOMBRE_RATIONNEL,LONGUEUR_COURANTE_DES_LISTES) /* Definition de la zone utile des listes... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N D E C A L C U L D ' U N N O M B R E R A T I O N N E L : */ /* */ /*************************************************************************************************************************************/ DEFV(Local,DEFV(Positive,INIT(profondeur_de_l_arbre,PROFONDEUR_DE_L_ARBRE))); DEFV(Local,DEFV(Positive,INIT(profondeur_courante_de_l_arbre,ZERO))); /* Profondeur de l'arbre a generer et profondeur courante au cours de la generation... */ DEFV(Local,DEFV(Float,DdTb1(POINTERf ,liste_des_nombres_decimaux ,LONGUEUR_MAXIMALE_DES_LISTES ,ADRESSE_NON_ENCORE_DEFINIE ) ) ); DEFV(Local,DEFV(fractionI,DdTb1(POINTERs ,liste_des_nombres_rationnels ,LONGUEUR_MAXIMALE_DES_LISTES ,ADRESSE_NON_ENCORE_DEFINIE ) ) ); DEFV(Local,DEFV(Int,DdTb1(POINTERi ,liste_des_index_des_nombres_rationnels ,LONGUEUR_MAXIMALE_DES_LISTES ,ADRESSE_NON_ENCORE_DEFINIE ) ) ); /* Listes utiles... */ DEFV(Local,DEFV(Int,INIT(index_courant_des_nombres_rationnels,INDEX0))); /* Index de rangement dans les listes utiles... */ BFonctionV DEFV(Local,DEFV(FonctionV,CalculDuNombreRationnelSuivant(NombreRationnel_Gauche_______,NombreRationnel_Droite_______))) DEFV(Argument,DEFV(fractionI,NombreRationnel_Gauche_______)); DEFV(Argument,DEFV(fractionI,NombreRationnel_Droite_______)); /* Couple de nombres rationnels Argument donnant naissance a un nombre rationnel Resultat. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(fractionI,NombreRationnel_MoyenneMediane); /*..............................................................................................................................*/ INCR(profondeur_courante_de_l_arbre,I); /* Montee dans l'arbre... */ MOYENNE_MEDIANE_DE_DEUX_FRACTIONS(NombreRationnel_MoyenneMediane,NombreRationnel_Gauche_______,NombreRationnel_Droite_______) /* Calcul de la moyenne mediane de {Gauche,Droite}... */ TRANSFERT_FRACTION(IdTb1sd(liste_des_nombres_rationnels,index_courant_des_nombres_rationnels),NombreRationnel_MoyenneMediane); /* Memorisation de la moyenne mediane qui est donc le nombre rationnel courant... */ EGAL(IdTb1sd(liste_des_index_des_nombres_rationnels,index_courant_des_nombres_rationnels),index_courant_des_nombres_rationnels); /* Memorisation de l'index du nombre rationnel courant, cette liste etant {0,1,2,...} */ /* avant le tri eventuel... */ EGAL(IdTb1sd(liste_des_nombres_decimaux,index_courant_des_nombres_rationnels) ,DIVI(FLOT(NumerateurFraction__(NombreRationnel_MoyenneMediane)),FLOT(DenominateurFraction(NombreRationnel_MoyenneMediane))) ); /* Memorisation du nombre rationnel courant en nombre decimal afin de pouvoir faire ensuite */ /* et si besoin est un tri par valeur croissante... */ INCR(index_courant_des_nombres_rationnels,I); /* Progression de l'index de rangement dans les listes utiles... */ Test(IFLT(profondeur_courante_de_l_arbre,profondeur_de_l_arbre)) /* Cas ou l'on n'a pas encore atteint la profondeur de l'arbre... */ Bblock CalculDuNombreRationnelSuivant(NombreRationnel_Gauche_______,NombreRationnel_MoyenneMediane); /* Calcul du prochain nombre rationnel avec {Gauche,MoyenneMediane}... */ CalculDuNombreRationnelSuivant(NombreRationnel_MoyenneMediane,NombreRationnel_Droite_______); /* Calcul du prochain nombre rationnel avec {MoyenneMediane,Droite}... */ Eblock ATes Bblock /* Cas ou l'on a atteint la profondeur de l'arbre... */ Eblock ETes DECR(profondeur_courante_de_l_arbre,I); /* Descente dans l'arbre... */ RETU_VIDE; Eblock EFonctionV /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D E S N O M B R E S R A T I O N N E L S : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Logical,INIT(trier_les_nombres_rationnels_par_ordre_croissant,TRIER_LES_NOMBRES_RATIONNELS_PAR_ORDRE_CROISSANT)); DEFV(Logical,INIT(utiliser_le_tri_d_une_liste_quelconque_VERSION_N_AU_CARRE ,UTILISER_LE_TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE ) ); /* Doit-on ('VRAI') ou pas ('FAUX') trier les nombres rationnels par ordre croissant ? */ DEFV(Logical,INIT(editer_les_valeurs_decimales,EDITER_LES_VALEURS_DECIMALES)); /* Faut-il editer les valeurs decimales utiliser pour le tri ('VRAI') ou pas ('FAUX') ? */ /* ceci a ete introduit le 20220816135310... */ #include xci/valeurs.03.I" /*..............................................................................................................................*/ GET_ARGUMENTS_(nombre_d_arguments ,BLOC(GET_ARGUMENT_I("profondeur=""p=",profondeur_de_l_arbre); GET_ARGUMENT_L("tri=""trier=""ordre_croissant=",trier_les_nombres_rationnels_par_ordre_croissant); GET_ARGUMENT_N("ordre_calcul=",trier_les_nombres_rationnels_par_ordre_croissant); GET_ARGUMENT_L("tri_N2=""N_carre=""N_au_carre=""N_AU_CARRE=""N2=" ,utiliser_le_tri_d_une_liste_quelconque_VERSION_N_AU_CARRE ); GET_ARGUMENT_N("tri_NlogN=""NlN=""N_log_N=""N1=",utiliser_le_tri_d_une_liste_quelconque_VERSION_N_AU_CARRE); GET_ARGUMENT_L("editer=""valeurs_decimales=""evd=",editer_les_valeurs_decimales); /* Parametre introduit le 20220816135310. */ PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1; ) ); Test(IFGT(profondeur_de_l_arbre,PROFONDEUR_MAXIMALE_DE_L_ARBRE)) Bblock PRINT_ERREUR("la profondeur de l'arbre est trop importante"); EGAL(profondeur_de_l_arbre,PROFONDEUR_MAXIMALE_DE_L_ARBRE); CAL1(Prer1("(la valeur %d maximale est forcee)\n",profondeur_de_l_arbre)); Eblock ATes Bblock Eblock ETes begin_nouveau_block Bblock MdTb1(liste_des_nombres_decimaux ,LONGUEUR_COURANTE_DES_LISTES ,Float ,ADRESSE_NON_ENCORE_DEFINIE ); MdTb1(liste_des_nombres_rationnels ,LONGUEUR_COURANTE_DES_LISTES ,fractionI ,ADRESSE_NON_ENCORE_DEFINIE ); MdTb1(liste_des_index_des_nombres_rationnels ,LONGUEUR_COURANTE_DES_LISTES ,Int ,ADRESSE_NON_ENCORE_DEFINIE ); begin_nouveau_block Bblock DEFV(fractionI,INIS(NombreRationnel_01,IstructL02(ZERO,UN))); DEFV(fractionI,INIS(NombreRationnel_10,IstructL02(UN,ZERO))); CalculDuNombreRationnelSuivant(NombreRationnel_01,NombreRationnel_10); /* Lancement du processus a partir des nombres rationnels 0/1 et 1/0 (=infini)... */ Eblock end_nouveau_block DECR(index_courant_des_nombres_rationnels,I); /* Ne sert a rien, mais par pure hygiene... */ Test(IL_FAUT(trier_les_nombres_rationnels_par_ordre_croissant)) Bblock TRI_D_UNE_LISTE_QUELCONQUE(liste_des_nombres_decimaux ,liste_des_index_des_nombres_rationnels ,INDEX_DU_PREMIER_NOMBRE_RATIONNEL ,INDEX_DU_DERNIER_NOMBRE_RATIONNEL ,FAUX ,utiliser_le_tri_d_une_liste_quelconque_VERSION_N_AU_CARRE ,IdTb1sd ); /* Passage de l'ordre du calcul a l'ordre croissant... */ Eblock ATes Bblock Eblock ETes begin_nouveau_block Bblock DEFV(Int,INIT(index_courant,UNDEF)); DoIn(index_courant,INDEX_DU_PREMIER_NOMBRE_RATIONNEL,INDEX_DU_DERNIER_NOMBRE_RATIONNEL,I) Bblock CAL2(Prin2("%d/%d" ,NumerateurFraction__(IdTb1sd(liste_des_nombres_rationnels ,IdTb1sd(liste_des_index_des_nombres_rationnels,index_courant) ) ) ,DenominateurFraction(IdTb1sd(liste_des_nombres_rationnels ,IdTb1sd(liste_des_index_des_nombres_rationnels,index_courant) ) ) ) ); /* Edition des nombres rationnels dans un certain ordre... */ Test(IL_FAUT(editer_les_valeurs_decimales)) /* Test introduit le 20220816135310... */ Bblock CAL2(Prin1("=%+.^^^" ,IdTb1sd(liste_des_nombres_decimaux ,IdTb1sd(liste_des_index_des_nombres_rationnels,index_courant) ) ) ); /* Edition eventuelle des valeurs decimales des nombres rationnels... */ Eblock ATes Bblock Eblock ETes CAL2(Prin0("\n")); Eblock EDoI Eblock end_nouveau_block FdTb1(liste_des_index_des_nombres_rationnels ,LONGUEUR_MAXIMALE_DES_LISTES ,Int ,ADRESSE_NON_ENCORE_DEFINIE ); FdTb1(liste_des_nombres_rationnels ,LONGUEUR_MAXIMALE_DES_LISTES ,fractionI ,ADRESSE_NON_ENCORE_DEFINIE ); FdTb1(liste_des_nombres_decimaux ,LONGUEUR_MAXIMALE_DES_LISTES ,Float ,ADRESSE_NON_ENCORE_DEFINIE ); Eblock end_nouveau_block RETU_Commande; Eblock ECommande