/*************************************************************************************************************************************/ /* */ /* R E C H E R C H E D E S E X T R E M A D ' U N F I C H I E R N U M E R I Q U E : */ /* */ /* */ /* Author of '$xrv/extrema.01$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1997??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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_BASE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* V A L E U R S I M P L I C I T E S D E S P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #define N_EDITER_QUE_LE_MINIMUM \ FAUX #define N_EDITER_QUE_LE_MAXIMUM \ FAUX /* Faut-il n'editer que l'un des deux extrema ('VRAI') ou bien toutes les informations */ /* ('FAUX') ? Ceci a ete introduit le 20041018114653... */ #define N_EDITER_QUE_LE_FACTEUR_D_HOMOTHETIE \ FAUX #define N_EDITER_QUE_LA_TRANSLATION \ FAUX /* Faut-il n'editer que l'une des donnees de normalisation dans [0,1] ('VRAI') ou bien */ /* toutes les informations ('FAUX') ? Ceci a ete introduit le 20081109101949... */ #define N_EDITER_QUE_LA_MOYENNE \ FAUX #define N_EDITER_QUE_L_ECART_TYPE \ FAUX /* Faut-il n'editer que l'une des donnees de statistique ('VRAI') ou bien toutes les */ /* informations ('FAUX') ? Ceci a ete introduit le 20130512082010... */ #define MINIMUM_NOUVEAU \ COORDONNEE_BARYCENTRIQUE_MINIMALE #define MAXIMUM_NOUVEAU \ COORDONNEE_BARYCENTRIQUE_MAXIMALE /* Pour definir le facteur d'homothetie et la constante de translation... */ #define UTILISER_LE_MINIMUM_EN_CAS_DE_VALEURS_TOUTES_IDENTIQUES \ FAUX #define UTILISER_LE_MAXIMUM_EN_CAS_DE_VALEURS_TOUTES_IDENTIQUES \ FAUX /* Lorsque les valeurs du fichier Argument sont toutes identiques, la valeur utilisee pour */ /* calculer la constante de translation peut etre 'minimum_nouveau', 'maximum_courant' */ /* ou bien la moyenne de ces deux valeurs... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D U F I C H I E R : */ /* */ /*************************************************************************************************************************************/ #include xrv/ARITHMET.1d.I" /* Passage a l'allocation dynamique le 20060214191001... */ #define NOMBRE_DE_DECIMALES \ SEIZE #include xrv/ARITHMET.21.I" #include xrv/champs_5.41.I" #define VALEUR_IMPLICITE \ FZERO gGENERATION_D_UN_FICHIER(fichier_des_valeurs,liste_des_valeurs); /* Definition en memoire du fichier. */ #define ELEMENT_DU_FICHIER(index) \ gELEMENT_DU_FICHIER(liste_des_valeurs,index) \ /* Acces a un element courant du fichier. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S E D I T I O N S : */ /* */ /*************************************************************************************************************************************/ #define FORMAT_EFFECTIF_D_EDITION(message) \ Cara(chain_Aconcaten5(message,INTRODUCTION_FORMAT,valeurs_signees,".*",format_d_edition)) \ /* Format effectif de certaines editions... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R E C H E R C H E D E S E X T R E M A D ' U N F I C H I E R N U M E R I Q U E : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Logical,INIT(n_editer_que_le_minimum,N_EDITER_QUE_LE_MINIMUM)); DEFV(Logical,INIT(n_editer_que_le_maximum,N_EDITER_QUE_LE_MAXIMUM)); /* Faut-il n'editer que l'un des deux extrema ('VRAI') ou bien toutes les informations */ /* ('FAUX') ? Ceci a ete introduit le 20041018114653... */ DEFV(Logical,INIT(n_editer_que_le_facteur_d_homothetie,N_EDITER_QUE_LE_FACTEUR_D_HOMOTHETIE)); DEFV(Logical,INIT(n_editer_que_la_translation,N_EDITER_QUE_LA_TRANSLATION)); /* Faut-il n'editer que l'une des donnees de normalisation dans [0,1] ('VRAI') ou bien */ /* toutes les informations ('FAUX') ? Ceci a ete introduit le 20081109101949... */ DEFV(Logical,INIT(n_editer_que_la_moyenne,N_EDITER_QUE_LA_MOYENNE)); DEFV(Logical,INIT(n_editer_que_l_ecart_type,N_EDITER_QUE_L_ECART_TYPE)); /* Faut-il n'editer que l'une des donnees de statistique ('VRAI') ou bien toutes les */ /* informations ('FAUX') ? Ceci a ete introduit le 20130512082010... */ DEFV(Float,INIT(minimum_nouveau,MINIMUM_NOUVEAU)); DEFV(Float,INIT(maximum_nouveau,MAXIMUM_NOUVEAU)); /* Pour definir le facteur d'homothetie et la constante de translation... */ DEFV(Logical,INIT(utiliser_le_minimum_en_cas_de_valeurs_toutes_identiques ,UTILISER_LE_MINIMUM_EN_CAS_DE_VALEURS_TOUTES_IDENTIQUES ) ); DEFV(Logical,INIT(utiliser_le_maximum_en_cas_de_valeurs_toutes_identiques ,UTILISER_LE_MAXIMUM_EN_CAS_DE_VALEURS_TOUTES_IDENTIQUES ) ); /* Lorsque les valeurs du fichier Argument sont toutes identiques, la valeur utilisee pour */ /* calculer la constante de translation peut etre 'minimum_nouveau', 'maximum_courant' */ /* ou bien la moyenne de ces deux valeurs... */ DEFV(Float,INIT(minimum_courant,F_INFINI)); DEFV(Float,INIT(maximum_courant,F_MOINS_L_INFINI)); DEFV(Float,INIT(facteur_d_homothetie,FLOT__UNDEF)); DEFV(Float,INIT(translation,FLOT__UNDEF)); DEFV(Float,INIT(module,FLOT__UNDEF)); DEFV(Float,INIT(moyenne_courante,FZERO)); DEFV(Float,INIT(ecart_type,FZERO)); DEFV(Int,INIT(nombre_d_elements_traites,ZERO)); /* Preparation des resultats... */ #include xrv/ARITHMET.22.I" #include xci/valeurs.03.I" /*..............................................................................................................................*/ #include xrv/champs_5.1A.I" /* Ceci fut introduit le 20070103173720... */ GET_ARGUMENTS_(nombre_d_arguments ,BLOC(PROCESS_ARGUMENT_I("nombre_elements=""ne=",nombre_d_elements ,BLOC(VIDE;) ,BLOC(Bblock PRINT_AVERTISSEMENT("'ne=' doit etre defini avant toute entree de fichiers"); Eblock ) ); PROCESS_ARGUMENTS_DE_DEFINITION_DES_FICHIERS_01; PROKESF_ARGUMENT_FICHIER("fichier=" ,fichier_des_valeurs ,liste_des_valeurs ,VALEUR_IMPLICITE ,lTRANSFORMAT_0d ,iGENERATION_D_UN_FICHIER ); GET_ARGUMENT_L("minimum_seul=""ms=",n_editer_que_le_minimum); GET_ARGUMENT_L("maximum_seul=""Ms=",n_editer_que_le_maximum); GET_ARGUMENT_L("facteur_homothetie_seul=""homothetie_seule=""fhs=""hs=" ,n_editer_que_le_facteur_d_homothetie ); GET_ARGUMENT_L("translation_seule=""ts=",n_editer_que_la_translation); /* Les parametres de normalisation dans [0,1] ont ete introduits le 20081109101949... */ GET_ARGUMENT_L("moyenne_seule=""mys=",n_editer_que_la_moyenne); GET_ARGUMENT_L("ecart_type_seul=""ets=",n_editer_que_l_ecart_type); /* Parametres introduits le 20130512082010. */ GET_ARGUMENT_F("minimum=""m=",minimum_nouveau); GET_ARGUMENT_F("maximum=""M=",maximum_nouveau); GET_ARGUMENT_L("minimum_si_identiques=""mini=",utiliser_le_minimum_en_cas_de_valeurs_toutes_identiques); GET_ARGUMENT_L("maximum_si_identiques=""maxi=",utiliser_le_maximum_en_cas_de_valeurs_toutes_identiques); PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_3; /* Cette procedure fut introduite le 20070103173720... */ PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1; /* Cette procedure fut introduite le 20061226192538... */ ) ); DoIn(index ,PREMIER_ELEMENT_D_UN_FICHIER ,DERNIER_ELEMENT_D_UN_FICHIER ,I ) Bblock DEFV(Float,INIT(valeur_courante,ELEMENT_DU_FICHIER(index))); /* Recuperation de la valeur courante dans le fichier. */ EGAL(minimum_courant,MIN2(valeur_courante,minimum_courant)); EGAL(maximum_courant,MAX2(valeur_courante,maximum_courant)); /* Recherche des extrema. */ INCR(moyenne_courante,valeur_courante); INCR(nombre_d_elements_traites,I); /* Recherche de la moyenne. */ Eblock EDoI EGAL(module,MAX2(ABSO(minimum_courant),ABSO(maximum_courant))); /* Recherche du "module". */ EGAL(moyenne_courante,DIVZ(moyenne_courante,nombre_d_elements_traites)); /* Recherche de la moyenne. */ DoIn(index ,PREMIER_ELEMENT_D_UN_FICHIER ,DERNIER_ELEMENT_D_UN_FICHIER ,I ) Bblock DEFV(Float,INIT(valeur_courante,ELEMENT_DU_FICHIER(index))); /* Recuperation de la valeur courante dans le fichier. */ INCR(ecart_type,EXP2(SOUS(valeur_courante,moyenne_courante))); /* Recherche de l'ecart-type. */ Eblock EDoI EGAL(ecart_type,RACX(DIVI(ecart_type,nombre_d_elements_traites))); /* Le calcul de l'ecart-type a ete introduit le 20130512082010... */ Test(IFNE(minimum_courant,maximum_courant)) Bblock EGAL(facteur_d_homothetie ,DIVI(SOUS(maximum_nouveau,minimum_nouveau) ,SOUS(maximum_courant,minimum_courant) ) ); EGAL(translation ,DIVI(DET2(minimum_nouveau,maximum_nouveau ,minimum_courant,maximum_courant ) ,SOUS(maximum_courant,minimum_courant) ) ); /* Calcul des donnees utiles pour passer de [minimum,maximum] a [0,1] (en general...). */ Eblock ATes Bblock EGAL(facteur_d_homothetie ,FU ); EGAL(translation ,SOUS(COND(IL_FAUT(utiliser_le_minimum_en_cas_de_valeurs_toutes_identiques) ,minimum_nouveau ,COND(IL_FAUT(utiliser_le_maximum_en_cas_de_valeurs_toutes_identiques) ,maximum_nouveau ,MOYE(minimum_nouveau,maximum_nouveau) ) ) ,CHOI(minimum_courant,maximum_courant) ) ); /* Calcul des donnees utiles pour passer de [minimum,maximum] a [0,1] (en general...). */ Eblock ETes Test(I3ET(IFET(EST_FAUX(n_editer_que_le_minimum),EST_FAUX(n_editer_que_le_maximum)) ,IFET(EST_FAUX(n_editer_que_le_facteur_d_homothetie),EST_FAUX(n_editer_que_la_translation)) ,IFET(EST_FAUX(n_editer_que_la_moyenne),EST_FAUX(n_editer_que_l_ecart_type)) ) ) /* Test introduit le 20041018114653 et complete le 20081109101949 en ce qui concerne */ /* la normalisation dans [0,1], puis le 20130512082010 pour l'ecart-type et la moyenne... */ Bblock /* ATTENTION, les sorties sont compatibles avec celles de '$xcg/extrema.01$Z'... */ CAL2(Prin2(FORMAT_EFFECTIF_D_EDITION("\n minimum = "),nombre_de_decimales,minimum_courant)); CAL2(Prin2(FORMAT_EFFECTIF_D_EDITION("\n maximum = "),nombre_de_decimales,maximum_courant)); CAL2(Prin2(FORMAT_EFFECTIF_D_EDITION("\n module = "),nombre_de_decimales,module)); CAL2(Prin2(FORMAT_EFFECTIF_D_EDITION("\n moyenne = "),nombre_de_decimales,moyenne_courante)); CAL2(Prin2(FORMAT_EFFECTIF_D_EDITION("\n ecart-type = "),nombre_de_decimales,ecart_type)); /* Edition des extrema. */ CAL2(Prin0("\n\n")); CAL2(Prin4("pour passer de [%+.^^^,%+.^^^] a [%+.^^^,%+.^^^] :\n" ,minimum_courant,maximum_courant ,minimum_nouveau,maximum_nouveau ) ); /* Le 20060105161222, le format "16g" est passe a "^^g" pour plus de souplesse... */ /* */ /* Le 20091123123547, le format "^^g" est passe a "^^^" pour plus de souplesse... */ CAL2(Prin2(FORMAT_EFFECTIF_D_EDITION("\n facteur d'homothetie = ") ,NOMBRE_DE_DECIMALES_EFFECTIF(nombre_de_decimales) ,facteur_d_homothetie ) ); CAL2(Prin2(FORMAT_EFFECTIF_D_EDITION("\n translation......... = ") ,NOMBRE_DE_DECIMALES_EFFECTIF(nombre_de_decimales) ,translation ) ); CAL2(Prin0("\n")); /* ATTENTION, les sorties sont compatibles avec celles de '$xcg/extrema.01$Z'... */ Eblock ATes Bblock Test(IL_FAUT(n_editer_que_le_minimum)) Bblock EDITION_DANS_gOPERATION_SUR_LES_FICHIERS_AVEC_SAUT_DE_LIGNE(minimum_courant); /* Edition du minimum... */ /* */ /* Introduit sous cette forme le 20160804095206... */ Eblock ATes Bblock Eblock ETes Test(IL_FAUT(n_editer_que_le_maximum)) Bblock EDITION_DANS_gOPERATION_SUR_LES_FICHIERS_AVEC_SAUT_DE_LIGNE(maximum_courant); /* Edition du maximum... */ /* */ /* Introduit sous cette forme le 20160804095206... */ Eblock ATes Bblock Eblock ETes Test(IL_FAUT(n_editer_que_la_moyenne)) Bblock EDITION_DANS_gOPERATION_SUR_LES_FICHIERS_AVEC_SAUT_DE_LIGNE(moyenne_courante); /* Edition de la moyenne (introduit le 20130512082010). */ /* */ /* Introduit sous cette forme le 20160804095206... */ Eblock ATes Bblock Eblock ETes Test(IL_FAUT(n_editer_que_l_ecart_type)) Bblock EDITION_DANS_gOPERATION_SUR_LES_FICHIERS_AVEC_SAUT_DE_LIGNE(ecart_type); /* Edition de l'ecart-type (introduit le 20130512082010). */ /* */ /* Introduit sous cette forme le 20160804095206... */ Eblock ATes Bblock Eblock ETes Test(IL_FAUT(n_editer_que_le_facteur_d_homothetie)) Bblock EDITION_DANS_gOPERATION_SUR_LES_FICHIERS_AVEC_SAUT_DE_LIGNE(facteur_d_homothetie); /* Edition du facteur d'homothetie (introduit ainsi le 20081109101949)... */ /* */ /* Introduit sous cette forme le 20160804095206... */ Eblock ATes Bblock Eblock ETes Test(IL_FAUT(n_editer_que_la_translation)) Bblock EDITION_DANS_gOPERATION_SUR_LES_FICHIERS_AVEC_SAUT_DE_LIGNE(translation); /* Edition de la translation (introduit ainsi le 20081109101949)... */ /* */ /* Introduit sous cette forme le 20160804095206... */ Eblock ATes Bblock Eblock ETes Eblock ETes lGENERATION_D_UN_FICHIER(liste_des_valeurs,VALEUR_IMPLICITE); RETU_Commande; Eblock ECommande