forked from menault/2026_TD3_DEV51_Qualite_Algo
Optimiser F3 par accumulation directe des soldes clients
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user