diff --git a/COMPTE_RENDU.md b/COMPTE_RENDU.md index 7064bf4..ca01450 100644 --- a/COMPTE_RENDU.md +++ b/COMPTE_RENDU.md @@ -273,3 +273,12 @@ successives : **`O(n + C)`** au lieu de `O(n × C)`, avec `O(1)` de mémoire auxiliaire en dehors du tableau de sortie. La complexité cyclomatique passe de **4 à 3**. Les tests vérifient les clients sans transaction, les débits, les crédits, les annulations et la réinitialisation entre deux appels. + +### F4 — Accumulation directe par jour + +Le même principe s'applique aux jours : initialisation des `J` soldes, +puis ajout de chaque montant dans `totaux[t[i].jour]`. Le coût passe de +`O(n × J)` à **`O(n + J)`**, avec `O(1)` de mémoire auxiliaire hors sortie. +La complexité cyclomatique passe de **4 à 3**. Les tests comparent chaque +solde à un calcul de référence, y compris aux bornes du tableau, puis +vérifient qu'un appel sans transaction remet tous les soldes à zéro. diff --git a/banque.c b/banque.c index 3d44128..3722e6d 100644 --- a/banque.c +++ b/banque.c @@ -139,12 +139,10 @@ void total_par_client(const Transaction *t, int n, long *totaux) /* F4 : solde total de chaque jour */ void total_par_jour(const Transaction *t, int n, long *totaux) { - for (int j = 0; j < NB_JOURS; j++) { + for (int j = 0; j < NB_JOURS; j++) totaux[j] = 0; - for (int i = 0; i < n; i++) - if (t[i].jour == j) - totaux[j] += t[i].montant; - } + for (int i = 0; i < n; i++) + totaux[t[i].jour] += t[i].montant; } /* F5 : période de jours consécutifs dont la somme des soldes est maximale */ diff --git a/tests/test_banque.c b/tests/test_banque.c index 8a7b46c..4320a73 100644 --- a/tests/test_banque.c +++ b/tests/test_banque.c @@ -91,11 +91,34 @@ static void tester_totaux_clients(void) assert(totaux[c] == 0); } +static void tester_totaux_jours(void) +{ + Transaction t[] = { + {0, 0, NB_JOURS - 1, 100}, {1, 1, 0, -50}, + {2, 2, NB_JOURS - 1, -40}, {3, 3, 0, 50}, {4, 4, 7, 0} + }; + long totaux[NB_JOURS]; + for (int i = 0; i < NB_JOURS; i++) + totaux[i] = 123; + total_par_jour(t, 5, totaux); + for (int j = 0; j < NB_JOURS; j++) { + long attendu = 0; + for (int i = 0; i < 5; i++) + if (t[i].jour == j) + attendu += t[i].montant; + assert(totaux[j] == attendu); + } + total_par_jour(NULL, 0, totaux); + for (int j = 0; j < NB_JOURS; j++) + assert(totaux[j] == 0); +} + int main(void) { tester_tri(); tester_clients_distincts(); tester_totaux_clients(); + tester_totaux_jours(); puts("Tests banque : OK"); return 0; }