diff --git a/banque.c b/banque.c index 6180c2f..68b57e4 100644 --- a/banque.c +++ b/banque.c @@ -213,38 +213,45 @@ long nb_facons_rendre(int somme, int nb_pieces) return resultat; } -/* F9 : catégorie d'une transaction (pour les statistiques) */ +/* F9 : catégorie d'une transaction (pour les statistiques), découpée par + * sens de l'opération pour que chaque fonction reste simple (M <= 5). */ +int est_week_end(int jour) +{ + return jour % 7 >= 5; /* jours 5 et 6 de la semaine (jour >= 0) */ +} + +int categorie_debit(const Transaction *t) /* montant < 0 */ +{ + if (t->montant < -20000) + return est_week_end(t->jour) ? 1 : 2; + if (t->montant < -5000) + return 3; + return t->client % 10 == 0 ? 4 : 5; +} + +int categorie_gros_credit(const Transaction *t) /* montant > 30000 */ +{ + return t->client % 10 == 0 && !est_week_end(t->jour) ? 6 : 7; +} + +int categorie_credit(const Transaction *t) /* montant > 0 */ +{ + if (t->montant > 30000) + return categorie_gros_credit(t); + if (t->montant > 10000) + return 8; + if (t->montant > 1000) + return t->jour % 30 == 0 ? 9 : 10; + return 11; +} + int categorie(const Transaction *t) { - if (t->montant < 0) { - if (t->montant < -20000) { - if (t->jour % 7 == 5 || t->jour % 7 == 6) - return 1; - else - return 2; - } else if (t->montant < -5000) { - return 3; - } else { - if (t->client % 10 == 0) - return 4; - return 5; - } - } else if (t->montant == 0) { + if (t->montant < 0) + return categorie_debit(t); + if (t->montant == 0) return 0; - } else { - if (t->montant > 30000) { - if (t->client % 10 == 0 && t->jour % 7 < 5) - return 6; - return 7; - } else if (t->montant > 10000) { - return 8; - } else if (t->montant > 1000) { - if (t->jour % 30 == 0) - return 9; - return 10; - } - return 11; - } + return categorie_credit(t); } /* F10 : ajoute une ligne à la fin du rapport. On passe la position du '\0'