/*************************************************************************************************************************************/
/* */
/* O P E R A T I O N S A R I T H M E T I Q U E S S U R D E S F I C H I E R S : */
/* */
/* */
/* Author of '$xrv/ARITHMET.21$I' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 1997??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 : */
/* */
/*************************************************************************************************************************************/
#include xci/valeurs.01.I"
#include xci/valeurs.02.I"
#TestADef FORMATER_LE_RESULTAT_DE_L_OPERATION_SUR_LES_VALEURS_COURANTES \
FAUX \
/* Le '#define' a ete remplace par '#TestADef' le 20030929100259 afin de garantir un */ \
/* fonctionnement compatible de 'v $xrv/cumul.01$K 20030929093702' apres la modification */ \
/* qu'il a subit a ce moment-la... */
DEFV(Local,DEFV(Logical,INIT(formater_le_resultat_de_l_operation_sur_les_valeurs_courantes
,FORMATER_LE_RESULTAT_DE_L_OPERATION_SUR_LES_VALEURS_COURANTES
)
)
);
/* Faut-il utiliser le mode anterieur au 20000117104932 ('FAUX') ou bien utiliser un mode */
/* similaire a ce que l'on trouve dans '$xci/valeurs_????$K' ('VRAI'). */
#define EDITER_LA_VALEUR_RESULTANTE_DANS_gOPERATION_SUR_LES_FICHIERS \
VRAI
#define NE_PAS_EDITER_LA_VALEUR_RESULTANTE_DANS_gOPERATION_SUR_LES_FICHIERS \
NOTL(EDITER_LA_VALEUR_RESULTANTE_DANS_gOPERATION_SUR_LES_FICHIERS)
/* Pour rendre conditionnelle l'edition dans 'gOPERATION_SUR_LES_FICHIERS(...)'... */
#define PAS_DE_PARCOURS_D_UN_FICHIER \
I
DEFV(Local,DEFV(Int,INIT(pas_de_parcours_d_un_fichier,PAS_DE_PARCOURS_D_UN_FICHIER)));
DEFV(Local,DEFV(Int,INIT(premier_element_d_un_fichier,PREMIER_ELEMENT_D_UN_FICHIER)));
/* Introduits le 20160727144522 afin de permettre leur modification "dynamique"... */
#define NOMBRE_D_EXEMPLAIRES_DU_RESULTAT_DE_L_OPERATION_SUR_LES_VALEURS_COURANTES \
UN
DEFV(Local,DEFV(Positive,INIT(nombre_d_exemplaires_du_resultat_de_l_operation_sur_les_valeurs_courantes
,NOMBRE_D_EXEMPLAIRES_DU_RESULTAT_DE_L_OPERATION_SUR_LES_VALEURS_COURANTES
)
)
);
/* Nombre de fois que chaque resultat sera edite (une seule fois implicitement...). */
#define CUMULER_LES_VALEURS_RESULTANTES \
FAUX
DEFV(Local,DEFV(Logical,INIT(cumuler_les_valeurs_resultantes,CUMULER_LES_VALEURS_RESULTANTES)));
#define MOYENNER_LE_CUMUL_DES_VALEURS_RESULTANTES \
FAUX
DEFV(Local,DEFV(Logical,INIT(moyenner_le_cumul_des_valeurs_resultantes,MOYENNER_LE_CUMUL_DES_VALEURS_RESULTANTES)));
/* Le 20211003102324 a ete introduite la possibilite d'editer non plus la valeur courante, */
/* mais son cumul avec les valeurs courantes qui l'ont precedee, eventuellement */
/* "renormalise" avec le nombre de valeurs courantes deja rencontrees... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* G E S T I O N D E S F I C H I E R S : */
/* */
/*************************************************************************************************************************************/
#define DERNIER_ELEMENT_D_UN_FICHIER \
LSTX(PREMIER_ELEMENT_D_UN_FICHIER,nombre_d_elements) \
/* Introduit le 20200819115545 (bien tardivement...) pour simplifier... */
#define gDERNIER_ELEMENT_D_UN_FICHIER(liste_des_valeurs) \
LSTX(PREMIER_ELEMENT_D_UN_FICHIER,liste_des_valeurs`____nombre_d_elements) \
/* Introduit le 20240930170717 suite a 'v $xrv/ARITHMET.1g$I 20240930155301'... */
#define gEDITION_DANS_gOPERATION_SUR_LES_FICHIERS(operation_sur_les_valeurs_courantes,CalImpression,Impression1,Impression2) \
Bblock \
Test(IL_FAUT(formater_le_resultat_de_l_operation_sur_les_valeurs_courantes)) \
Bblock \
CalImpression(Impression2(Cara(chain_Aconcaten4(C_POUR_CENT,valeurs_signees,".*",format_d_edition)) \
,NOMBRE_DE_DECIMALES_EFFECTIF(nombre_de_decimales) \
,MULTIPLE_DE(ENTIER_FLOTTANT(operation_sur_les_valeurs_courantes)) \
) \
); \
/* Edition de la valeur courante. */ \
Eblock \
ATes \
Bblock \
CalImpression(Impression1(COND(IL_FAUT(utiliser_le_format_exponentiel),"%+.^^^","%+.^^^") \
,operation_sur_les_valeurs_courantes \
) \
); \
/* Edition de la valeur courante. */ \
/* */ \
/* Le 20060105160311, le format "16g" est passe a "^^g" pour plus de souplesse, de meme */ \
/* que le format "17f" est passe a "^^f"... */ \
/* */ \
/* Le 20091123123502, le format "^^g" est passe a "^^^" pour plus de souplesse... */ \
Eblock \
ETes \
Eblock \
/* Edition formatee ou non du resultat de l'operation sur 'valeurs_courantes' avec choix */ \
/* {CAL1,Prer1,Prer2}, {CAL2,Prin1,Prin2} ou {CAL3,Prme1,Prme2} des fonctions d'impression. */ \
/* Ceci fut introduit pour 'v $xrv/optimise.02$K gEDITION_DANS_gOPERATION_SUR_LES_FICHIERS' */ \
/* le 20080305103001... */
#define EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(operation_sur_les_valeurs_courantes) \
Bblock \
gEDITION_DANS_gOPERATION_SUR_LES_FICHIERS(operation_sur_les_valeurs_courantes,CAL2,Prin1,Prin2); \
Eblock \
/* Edition formatee ou non du resultat de l'operation sur 'valeurs_courantes'... */
#define EDITION_DANS_gOPERATION_SUR_LES_FICHIERS_AVEC_SAUT_DE_LIGNE(valeur) \
Bblock \
EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(valeur); \
CAL2(Prin0("\n")); \
Eblock \
/* Procedure d'edition avec saut de ligne introduite le 20160804092928 car, en effet, */ \
/* a cette date le code correspondant etait utilise dans cinq '$K's... */
#define gOPERATION_SUR_LES_FICHIERS(valeurs_courantes,operation_sur_les_valeurs_courantes,editer_la_valeur_resultante,exemplaires) \
Bblock \
DEFV(Logical,INIT(introduire_un_K_NL,FAUX)); \
/* Afin de ne pas introduire un saut de ligne devant la premiere ligne. Cet indicateur a */ \
/* deplace de '$xrv/ARITHMET.22.I' a '$xrv/ARITHMET.21$I' le 20011008144608. */ \
DEFV(Logical,INIT(une_valeur_courante_au_moins_a_ete_editee,FAUX)); \
/* Cet indicateur a ete ajoute le 19990813092149 car, en effet, l'indicateur argument */ \
/* 'editer_la_valeur_resultante' peut contenir des tests sur les donnees definies dans */ \
/* l'argument 'valeurs_courantes' et ne peut donc etre utilise en dehors du bloc dans */ \
/* lequel il est utilise (c'est-a-dire a l'interieur du 'DoIn(...)'). */ \
\
DEFV(Float,INIT(cumul_des_valeurs_resultantes,FZERO)); \
DEFV(Positive,INIT(compteur_des_valeurs_resultantes,ZERO)); \
/* Le 20211003102324 a ete introduite la possibilite d'editer non plus la valeur courante, */ \
/* mais son cumul avec les valeurs courantes qui l'ont precedee, eventuellement */ \
/* "renormalise" avec le nombre de valeurs courantes deja rencontrees... */ \
\
DoIn(index \
,premier_element_d_un_fichier \
,DERNIER_ELEMENT_D_UN_FICHIER \
,pas_de_parcours_d_un_fichier \
) \
/* ATTENTION : bien noter la difference ci-dessus entre 'premier_element_d_un_fichier' */ \
/* et 'PREMIER_ELEMENT_D_UN_FICHIER', ce dernier permettant le "vrai" premier element */ \
/* du vecteur correspondant et non pas le premier "utile"... */ \
Bblock \
BLOC(valeurs_courantes;); \
/* Recuperation de la valeur courante dans les fichiers. */ \
\
begin_nouveau_block \
Bblock \
DEFV(Float,INIT(valeur_resultante,operation_sur_les_valeurs_courantes)); \
INCR(cumul_des_valeurs_resultantes,valeur_resultante); \
INCR(compteur_des_valeurs_resultantes,I); \
/* Le cumul introduit le 20211003102324 est fait meme s'il est inutile... */ \
\
Repe(exemplaires) \
Bblock \
Test(IL_FAUT(editer_la_valeur_resultante)) \
Bblock \
Test(IL_FAUT(introduire_un_K_NL)) \
Bblock \
CAL2(Prin0("\n")); \
/* Pas de saut de ligne devant la premiere ligne, mais uniquement sur les lignes suivantes. */ \
Eblock \
ATes \
Bblock \
EGAL(introduire_un_K_NL,VRAI); \
Eblock \
ETes \
\
EDITION_DANS_gOPERATION_SUR_LES_FICHIERS \
(COND(IL_NE_FAUT_PAS(cumuler_les_valeurs_resultantes) \
,valeur_resultante \
,COND(IL_NE_FAUT_PAS(moyenner_le_cumul_des_valeurs_resultantes) \
,NEUT(cumul_des_valeurs_resultantes) \
,DIVI(cumul_des_valeurs_resultantes \
,FLOT(compteur_des_valeurs_resultantes) \
) \
) \
) \
); \
\
EGAL(une_valeur_courante_au_moins_a_ete_editee,VRAI); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ERep \
Eblock \
end_nouveau_block \
Eblock \
EDoI \
\
Test(EST_VRAI(une_valeur_courante_au_moins_a_ete_editee)) \
/* ATTENTION, ce test a ete ajoute le 19990526085437 car il manquait, semble-t-il. Puis, il */ \
/* a ete encore modifie le 19990813092149 ne pouvant utiliser 'editer_la_valeur_resultante' */ \
/* en toute generalite (voir le commentaire de 'une_valeur_courante_au_moins_a_ete_editee'). */ \
Bblock \
CAL2(Prin0("\n")); \
/* "Fermeture" du fichier resultat (c'est-a-dire la sortie standard...). */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Operations quelconques sur les elements des fichiers... */