From 14c18a39752edae746cbb52dad01baec83608646 Mon Sep 17 00:00:00 2001 From: rabot Date: Wed, 21 Oct 2026 11:12:21 +0200 Subject: [PATCH] Optimiser F3 par accumulation directe des soldes clients --- COMPTE_RENDU.md | 9 +++++++++ banque.c | 8 +++----- tests/test_banque.c | 23 +++++++++++++++++++++++ 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/COMPTE_RENDU.md b/COMPTE_RENDU.md index 8d92e84..7064bf4 100644 --- a/COMPTE_RENDU.md +++ b/COMPTE_RENDU.md @@ -264,3 +264,12 @@ au lieu de `O(n²)`, avec `O(C)` de mémoire. Les identifiants de clients sont densement compris entre 0 et `C - 1`, comme le garantit le générateur. La complexité cyclomatique passe de **5 à 3**. Les tests couvrent l'absence de transactions, les doublons, les identifiants extrêmes et tous les clients. + +### F3 — Accumulation directe par client + +Après la remise à zéro des `C` soldes, un seul parcours des transactions +ajoute chaque montant dans `totaux[t[i].client]`. Les deux boucles sont +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. diff --git a/banque.c b/banque.c index bac48e3..3d44128 100644 --- a/banque.c +++ b/banque.c @@ -130,12 +130,10 @@ int nb_clients_distincts(const Transaction *t, int n) /* F3 : solde total de chaque client */ void total_par_client(const Transaction *t, int n, long *totaux) { - for (int c = 0; c < NB_CLIENTS; c++) { + for (int c = 0; c < NB_CLIENTS; c++) totaux[c] = 0; - for (int i = 0; i < n; i++) - if (t[i].client == c) - totaux[c] += t[i].montant; - } + for (int i = 0; i < n; i++) + totaux[t[i].client] += t[i].montant; } /* F4 : solde total de chaque jour */ diff --git a/tests/test_banque.c b/tests/test_banque.c index d11d0ac..8a7b46c 100644 --- a/tests/test_banque.c +++ b/tests/test_banque.c @@ -69,10 +69,33 @@ static void tester_clients_distincts(void) assert(nb_clients_distincts(t, 1) == 1); } +static void tester_totaux_clients(void) +{ + Transaction t[] = { + {0, 0, 0, 100}, {1, NB_CLIENTS - 1, 1, -50}, + {2, 0, 2, -40}, {3, NB_CLIENTS - 1, 3, 50}, {4, 7, 4, 0} + }; + long totaux[NB_CLIENTS]; + for (int i = 0; i < NB_CLIENTS; i++) + totaux[i] = 123; + total_par_client(t, 5, totaux); + for (int c = 0; c < NB_CLIENTS; c++) { + long attendu = 0; + for (int i = 0; i < 5; i++) + if (t[i].client == c) + attendu += t[i].montant; + assert(totaux[c] == attendu); + } + total_par_client(NULL, 0, totaux); + for (int c = 0; c < NB_CLIENTS; c++) + assert(totaux[c] == 0); +} + int main(void) { tester_tri(); tester_clients_distincts(); + tester_totaux_clients(); puts("Tests banque : OK"); return 0; }