forked from menault/2026_TD3_DEV51_Qualite_Algo
Optimiser F4 par accumulation directe des soldes journaliers
This commit is contained in:
@@ -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
|
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,
|
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.
|
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.
|
||||||
|
|||||||
@@ -139,12 +139,10 @@ void total_par_client(const Transaction *t, int n, long *totaux)
|
|||||||
/* F4 : solde total de chaque jour */
|
/* F4 : solde total de chaque jour */
|
||||||
void total_par_jour(const Transaction *t, int n, long *totaux)
|
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;
|
totaux[j] = 0;
|
||||||
for (int i = 0; i < n; i++)
|
for (int i = 0; i < n; i++)
|
||||||
if (t[i].jour == j)
|
totaux[t[i].jour] += t[i].montant;
|
||||||
totaux[j] += t[i].montant;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* F5 : période de jours consécutifs dont la somme des soldes est maximale */
|
/* F5 : période de jours consécutifs dont la somme des soldes est maximale */
|
||||||
|
|||||||
@@ -91,11 +91,34 @@ static void tester_totaux_clients(void)
|
|||||||
assert(totaux[c] == 0);
|
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)
|
int main(void)
|
||||||
{
|
{
|
||||||
tester_tri();
|
tester_tri();
|
||||||
tester_clients_distincts();
|
tester_clients_distincts();
|
||||||
tester_totaux_clients();
|
tester_totaux_clients();
|
||||||
|
tester_totaux_jours();
|
||||||
puts("Tests banque : OK");
|
puts("Tests banque : OK");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user