From 4babca1f2ec2a8a47d9412ee2a985278bd550684 Mon Sep 17 00:00:00 2001 From: Ryad MEHIRI Date: Wed, 21 Oct 2026 10:54:13 +0200 Subject: [PATCH] F10 : construire le rapport en O(L) au total MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ajouter_ligne recalculait la longueur du rapport à chaque ligne : 6 017 parcours d'un texte qui grandit jusqu'à la taille finale L, soit O(L × nombre de lignes). ajouter_ligne reçoit désormais la position de fin et renvoie la nouvelle : chaque caractère n'est écrit qu'une fois. La fonction longueur n'est plus utilisée et disparaît. Profil -O0 : longueur (1,74 s) disparaît. En -O2, le gain reste dans le bruit de mesure. Empreinte inchangée (ff68d260a7a58441). Co-Authored-By: Claude Opus 5.5 --- banque.c | 43 +++++++++++++++++-------------------------- 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/banque.c b/banque.c index da5a186..d51afdc 100644 --- a/banque.c +++ b/banque.c @@ -219,24 +219,14 @@ int categorie(const Transaction *t) } } -/* F10 : ajoute une ligne à la fin du rapport */ -int longueur(const char *s) +/* F10 : ajoute une ligne à la fin du rapport. On passe la position du '\0' + * final et on renvoie la nouvelle : plus besoin de recalculer la longueur. */ +char *ajouter_ligne(char *fin, const char *ligne) { - int n = 0; - while (s[n] != '\0') - n++; - return n; -} - -void ajouter_ligne(char *rapport, const char *ligne) -{ - int fin = longueur(rapport); - int i = 0; - while (ligne[i] != '\0') { - rapport[fin + i] = ligne[i]; - i++; - } - rapport[fin + i] = '\0'; + while (*ligne != '\0') + *fin++ = *ligne++; + *fin = '\0'; + return fin; } /* ------------------------------------------------------------------ */ @@ -259,6 +249,7 @@ int main(void) char *rapport = malloc(1 << 20); char ligne[128]; rapport[0] = '\0'; + char *fin_rapport = rapport; /* position du '\0' final du rapport */ /* recherches par id, dans l'ordre d'origine */ long somme_requetes = 0; @@ -292,30 +283,30 @@ int main(void) /* rapport */ snprintf(ligne, sizeof(ligne), "clients distincts;%d\n", nb_clients); - ajouter_ligne(rapport, ligne); + fin_rapport = ajouter_ligne(fin_rapport, ligne); snprintf(ligne, sizeof(ligne), "somme des requetes;%ld\n", somme_requetes); - ajouter_ligne(rapport, ligne); + fin_rapport = ajouter_ligne(fin_rapport, ligne); snprintf(ligne, sizeof(ligne), "meilleure periode;%d;%d;%ld\n", debut, fin, meilleure); - ajouter_ligne(rapport, ligne); + fin_rapport = ajouter_ligne(fin_rapport, ligne); snprintf(ligne, sizeof(ligne), "paires opposees;%ld\n", nb_paires); - ajouter_ligne(rapport, ligne); + fin_rapport = ajouter_ligne(fin_rapport, ligne); snprintf(ligne, sizeof(ligne), "facons de rendre %d;%ld\n", MONTANT_MONNAIE, nb_facons); - ajouter_ligne(rapport, ligne); + fin_rapport = ajouter_ligne(fin_rapport, ligne); for (int c = 0; c < 12; c++) { snprintf(ligne, sizeof(ligne), "categorie;%d;%d\n", c, categories[c]); - ajouter_ligne(rapport, ligne); + fin_rapport = ajouter_ligne(fin_rapport, ligne); } for (int c = 0; c < NB_CLIENTS; c++) { snprintf(ligne, sizeof(ligne), "client;%d;%ld\n", c, totaux_clients[c]); - ajouter_ligne(rapport, ligne); + fin_rapport = ajouter_ligne(fin_rapport, ligne); } for (int j = 0; j < NB_JOURS; j++) { snprintf(ligne, sizeof(ligne), "jour;%d;%ld\n", j, totaux_jours[j]); - ajouter_ligne(rapport, ligne); + fin_rapport = ajouter_ligne(fin_rapport, ligne); } for (int i = 0; i < NB_TRANSACTIONS; i += 10) { snprintf(ligne, sizeof(ligne), "rang;%d;%d;%ld\n", i, t[i].id, t[i].montant); - ajouter_ligne(rapport, ligne); + fin_rapport = ajouter_ligne(fin_rapport, ligne); } FILE *f = fopen("rapport.txt", "w");