Aller au contenu

Un mot pour Fahmio

Tu écris. Tu continues.

Un problème, une idée — assez pour qu’on comprenne, puis tu retournes à ta copie.

On lit. Tu n’as rien d’autre à faire.

Où veux-tu aller ?

↑ ↓ pour parcourir · Entrée pour ouvrir · Échap pour fermer

Fahmio
Fahmio
Bac Tunisie
FE-CFichiers, enregistrements et matrices

Problème « pipeline de fichiers » : fichier texte → fichier d’enregistrements → fichier texte résultat

Idée directrice

Le problème de fin d'épreuve de la section Sciences de l'informatique enchaîne souvent trois fichiers. Un fichier texte source, lu ligne par ligne, alimente un fichier d'enregistrements qui garde chaque valeur avec ce qu'on a calculé sur elle (score, clé, catégorie). Ce fichier d'enregistrements est relu pour écrire un fichier texte résultat au format imposé, souvent deux listes dans un ordre fixé, d'où deux parcours. Le barème récompense à part la décomposition en modules, les tableaux de déclaration (TDNT, TDOG, TDOL), la gestion des fichiers et le traitement central.

Ce qui aide à reconnaître la démarche

« En disposant d'un fichier texte … dont chaque ligne contient … » ; « Générer un fichier d'enregistrements … où chaque enregistrement comporte … » ; « Générer un fichier texte … par la liste des … suivis de la liste des … » ; « séparant les deux listes par une ligne vide » ; « Analyser le problème en le décomposant en modules »

Besoin d’un point de départ ? Voir la méthode
  • Lire l'énoncé comme un flux de données : quel fichier produit quel fichier ? Chaque flèche du flux devient un module, et le programme principal enchaîne ces modules dans l'ordre.
  • Déclarer dans le TDNT l'enregistrement puis le type fichier ; le TDOG contient les noms logiques des fichiers et les procédures appelées par le programme principal, avec leur rôle.
  • Traitement central (score, clé, propriété) : une fonction par calcul, testée à la main sur l'exemple de l'énoncé avant d'écrire le module de fichiers.
  • Deux listes dans un ordre imposé à partir d'un même fichier : deux parcours séparés par une fermeture et une réouverture, et la ligne vide écrite entre les deux.
  • La NB « le candidat n'est pas appelé à remplir le fichier … » dispense de toute saisie : le fichier source existe, on l'ouvre en lecture.
Les pièges à vérifier dans ta démarche

Écrire les modules sans analyse ni tableaux de déclaration : c'est une partie du barème à part entière. Tester la validité après le calcul du score, ce qui calcule un score sur une chaîne interdite. Initialiser la plus longue suite à 0 au lieu de 1 alors que la chaîne n'est pas vide. Oublier la pénalité de fin de chaîne, ou lire la dernière lettre à l'indice Long(ch) au lieu de Long(ch) − 1. Écrire les deux listes en un seul parcours. Oublier la ligne vide, ou l'écrire dans la boucle. Enfin, relire "Scores.dat" sans l'avoir fermé puis rouvert en "rb".

Sujet principal

Problème — pipeline de fichiers (9 points), dans l'esprit des sessions 2015–2022

11 questionsCorrigé masqué

Un laboratoire d'analyses conçoit des amorces pour ses tests : une amorce est une chaîne formée uniquement des lettres A, C, G et T, de longueur comprise entre 16 et 24. Sa qualité est mesurée par un score, calculé en additionnant des bonus et en retranchant des pénalités.

Les bonus attribués sont :

  • 3 points pour chaque lettre G ou C ;
  • 1 point pour chaque lettre A ou T.

Les pénalités imposées sont :

  • 4 fois la longueur de la plus longue suite de lettres identiques consécutives ;
  • 5 points si l'amorce ne se termine ni par G ni par C.

La qualité est "Excellente" si le score est supérieur ou égal à 36, "Correcte" si le score est compris entre 28 (inclus) et 36 (exclu), et "Rejetée" sinon.

Exemple : pour l'amorce GACCTTTTAGGCATCGAC, de longueur 18, il y a 9 lettres G ou C et 9 lettres A ou T. La plus longue suite de lettres identiques est TTTT, de longueur 4, et l'amorce se termine par C. Le score vaut 3 × 9 + 9 − 4 × 4 = 20 : l'amorce est "Rejetée".

En disposant d'un fichier texte "Amorces.txt", situé dans le dossier D:\Labo, dont chaque ligne contient une chaîne proposée comme amorce, on se propose de :

  • générer, dans le même dossier, un fichier d'enregistrements "Scores.dat" dont chaque enregistrement comporte la chaîne, son score et sa qualité. Une chaîne qui n'est pas une amorce (longueur hors de [16, 24] ou lettre autre que A, C, G, T) reçoit le score 0 et la qualité "Invalide" ;
  • générer, dans le même dossier, un fichier texte "Retenues.txt" contenant la liste des amorces de qualité "Excellente", suivie de la liste des amorces de qualité "Correcte", à raison d'une amorce par ligne, sous la forme amorce score, les deux listes étant séparées par une ligne vide.

Exemple de contenu du fichier "Amorces.txt" :

ATGCCGTAGCCTGACGGTAC
TTAGCAAAAATGCTAGTA
GGCTAGCCGATCGGACTCAGGC
CGTACCGATGTTCAGACG
AGCTTGCAXTGCCAGTCG
GCCGCTTAGGACCTGCAG

Le fichier "Retenues.txt" correspondant est :

ATGCCGTAGCCTGACGGTAC 36
GGCTAGCCGATCGGACTCAGGC 44

CGTACCGATGTTCAGACG 30
GCCGCTTAGGACCTGCAG 34

Travail demandé :

  1. Écrire un algorithme du programme principal, solution à ce problème, en le décomposant en modules. Dresser le tableau de déclaration des nouveaux types et celui des objets globaux.
  2. Écrire l'algorithme du module qui crée le fichier "Scores.dat" à partir du fichier "Amorces.txt".
  3. Écrire les algorithmes des fonctions nécessaires au test de validité et au calcul du score.
  4. Écrire l'algorithme du module qui crée le fichier "Retenues.txt".
  5. Dresser le tableau de déclaration des objets locaux de chacun des modules.

NB : le candidat n'est pas appelé à remplir le fichier "Amorces.txt".

Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : le problème enchaîne deux transformations de fichiers. Le programme principal se réduit donc à deux appels, dans l'ordre des données : la source texte produit le fichier d'enregistrements, qui produit à son tour le fichier texte final. Chaque module ouvre et ferme lui-même les fichiers qu'il manipule.

Analyse du programme principal :

Algorithme Laboratoire
DEBUT
    Creer_Scores (Fa, Fs)
    Creer_Retenues (Fs, Fr)
FIN

TDNT :

Nouveaux types
Amorce = Enregistrement
Seq : Chaîne
Score : Entier
Qualite : Chaîne
Fin
FScores = Fichier de Amorce

TDOG :

ObjetType / NatureRôle
FaFichier texteFichier "Amorces.txt"
FsFScoresFichier "Scores.dat"
FrFichier texteFichier "Retenues.txt"
Creer_ScoresProcédureGénérer "Scores.dat"
Creer_RetenuesProcédureGénérer "Retenues.txt"

2. Idée : pour chaque ligne lue, on remplit les trois champs d'un enregistrement, puis on l'écrit. La validité est testée d'abord, car le score n'a de sens que pour une vraie amorce.

Procédure Creer_Scores (@ Fa : Fichier texte ; @ Fs : FScores)
DEBUT
    Ouvrir ("D:\Labo\Amorces.txt", Fa, "r")
    Ouvrir ("D:\Labo\Scores.dat", Fs, "wb")
    Tant que Non (Fin_fichier (Fa)) Faire
        Lire_ligne (Fa, ch)
        e.Seq ← ch
        Si Valide (ch) Alors
            e.Score ← Calcul_Score (ch)
            Si e.Score ≥ 36 Alors
                e.Qualite ← "Excellente"
            Sinon Si e.Score ≥ 28 Alors
                e.Qualite ← "Correcte"
            Sinon
                e.Qualite ← "Rejetée"
            Fin Si
        Sinon
            e.Score ← 0
            e.Qualite ← "Invalide"
        Fin Si
        Ecrire (Fs, e)
    Fin Tant que
    Fermer (Fa)
    Fermer (Fs)
FIN

3. Idée : la validité combine un test de longueur et un parcours qui s'arrête au premier caractère interdit. Le score utilise deux compteurs et une fonction qui mesure la plus longue suite de lettres identiques.

Fonction Valide (ch : Chaîne) : Booléen
DEBUT
    ok ← (Long (ch) ≥ 16) Et (Long (ch) ≤ 24)
    i ← 0
    Tant que ok Et (i < Long (ch)) Faire
        ok ← (Pos (ch[i], "ACGT") ≠ -1)
        i ← i + 1
    Fin Tant que
    Retourner ok
FIN
Fonction Suite_Max (ch : Chaîne) : Entier
DEBUT
    lmax ← 1
    l ← 1
    Pour i de 1 à Long (ch) - 1 Faire
        Si ch[i] = ch[i - 1] Alors
            l ← l + 1
            Si l > lmax Alors
                lmax ← l
            Fin Si
        Sinon
            l ← 1
        Fin Si
    Fin Pour
    Retourner lmax
FIN
Fonction Calcul_Score (ch : Chaîne) : Entier
DEBUT
    gc ← 0
    Pour i de 0 à Long (ch) - 1 Faire
        Si (ch[i] = "G") Ou (ch[i] = "C") Alors
            gc ← gc + 1
        Fin Si
    Fin Pour
    at ← Long (ch) - gc
    s ← 3 * gc + at - 4 * Suite_Max (ch)
    der ← ch[Long (ch) - 1]
    Si (der ≠ "G") Et (der ≠ "C") Alors
        s ← s - 5
    Fin Si
    Retourner s
FIN

Contrôle sur l'exemple de l'énoncé : gc = 9, at = 9, Suite_Max = 4, et la dernière lettre est C, d'où s = 27 + 9 − 16 = 20. Dans "Amorces.txt", la cinquième chaîne contient un X : elle est "Invalide". La première atteint exactement 36 : le test ≥ la classe "Excellente".

4. Idée : la liste "Excellente" doit précéder la liste "Correcte", alors que les deux qualités sont mêlées dans "Scores.dat". On parcourt donc le fichier deux fois, en le rouvrant entre les deux parcours ; la ligne vide s'écrit entre ces deux parcours.

Procédure Creer_Retenues (@ Fs : FScores ; @ Fr : Fichier texte)
DEBUT
    Ouvrir ("D:\Labo\Retenues.txt", Fr, "w")
    Ouvrir ("D:\Labo\Scores.dat", Fs, "rb")
    Tant que Non (Fin_fichier (Fs)) Faire
        Lire (Fs, e)
        Si e.Qualite = "Excellente" Alors
            Ecrire_nl (Fr, e.Seq + " " + Convch (e.Score))
        Fin Si
    Fin Tant que
    Fermer (Fs)
    Ecrire_nl (Fr, "")
    Ouvrir ("D:\Labo\Scores.dat", Fs, "rb")
    Tant que Non (Fin_fichier (Fs)) Faire
        Lire (Fs, e)
        Si e.Qualite = "Correcte" Alors
            Ecrire_nl (Fr, e.Seq + " " + Convch (e.Score))
        Fin Si
    Fin Tant que
    Fermer (Fs)
    Fermer (Fr)
FIN

5. Tableaux de déclaration des objets locaux.

ModuleObjetType / Nature
Creer_ScoreschChaîne
Creer_ScoreseAmorce
Creer_ScoresValide, Calcul_ScoreFonction
ValideokBooléen
ValideiEntier
Suite_Maxi, l, lmaxEntier
Calcul_Scorei, gc, at, sEntier
Calcul_ScorederCaractère
Calcul_ScoreSuite_MaxFonction
Creer_RetenueseAmorce

Cohérence des appels : Creer_Scores et Creer_Retenues reçoivent les fichiers par adresse (@), dans l'ordre de leur définition. Les trois fonctions reçoivent la chaîne par valeur et retournent un booléen ou un entier ; elles sont déclarées comme objets locaux du module qui les appelle.

Changer d’énoncé, garder le raisonnement

Choisis un seul transfert après le sujet principal. Qu’est-ce qui change ? Quel résultat ou quelle méthode peux-tu réutiliser ? Les autres exercices restent disponibles pour une prochaine séance.

Variantes rencontrées : mots de passe notés par classes de caractères et plus longues séquences, puis fichier des « Très fort » suivi des « Fort » séparés par une ligne vide (principale 2015) ; file de processus réordonnée dans un second fichier d'enregistrements (contrôle 2015) ; RIB validés par leur clé puis triés (principale 2016) ; texte caché dans une matrice de codes (contrôle 2017) ; moteur de recherche lisant les fichiers listés dans Chemin.txt (principale 2017) ; nombres brésiliens de Nombres.txt vers F_Brésilien.dat (principale 2022).

Exercices d'entraînement — une nuance à la fois

1 Drill FE-C.1 — le programme principal seul : modules, nouveaux types et objets globaux d’un pipeline de fichiers
Entraînement 01 / 03

Drill FE-C.1 — le programme principal seul : modules, nouveaux types et objets globaux d’un pipeline de fichiers

7 questionsCorrigé masqué

Un entier n ≥ 10 est un nombre de Harshad s'il est divisible par la somme de ses chiffres. Par exemple, 21 est un nombre de Harshad, car 21 = 3 × 7 et 2 + 1 = 3, alors que 19 n'en est pas un (1 + 9 = 10).

Le fichier texte "Nombres.txt" (racine du disque D) contient un entier n ≥ 10 par ligne. On veut écrire un programme qui permet :

  • de créer le fichier d'enregistrements "Harshad.dat" (racine du disque D), dont chaque enregistrement comporte trois champs : N, un nombre de Harshad de "Nombres.txt", S, la somme de ses chiffres, et Q, le quotient N Div S ;
  • de créer le fichier texte "Rapport.txt" (racine du disque D) : une ligne N = S × Q par enregistrement de "Harshad.dat", suivie d'une dernière ligne indiquant le nombre de nombres de Harshad trouvés ;
  • d'afficher le contenu de "Rapport.txt".

Exemple : "Nombres.txt" contient 18, 19, 21, 100, 201, 247, 1729, à raison d'un nombre par ligne.

Travail demandé : sans écrire les algorithmes des modules,

  1. écrire un algorithme du programme principal, en le décomposant en modules ;
  2. dresser le tableau de déclaration des nouveaux types et celui des objets globaux ;
  3. donner l'en-tête de chaque module, avec le mode de passage de chaque paramètre ;
  4. donner le contenu de "Rapport.txt" pour l'exemple.

NB : le candidat n'est pas appelé à remplir le fichier "Nombres.txt".

Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : trois tâches, donc trois modules, appelés dans l'ordre des données. Le fichier texte source produit le fichier d'enregistrements, qui produit le fichier texte du rapport, que l'on affiche enfin.

Analyse du programme principal :

Algorithme Harshad
DEBUT
    Generer_Harshad (Fn, Fh)
    Generer_Rapport (Fh, Fr)
    Afficher (Fr)
FIN

2. Tableau de déclaration des nouveaux types (TDNT), puis tableau de déclaration des objets globaux (TDOG).

Nouveaux types
Nombre = Enregistrement
N, S, Q : Entier
Fin
FNombres = Fichier de Nombre
ObjetType / NatureRôle
FnFichier texteFichier "Nombres.txt"
FhFNombresFichier "Harshad.dat"
FrFichier texteFichier "Rapport.txt"
Generer_HarshadProcédureCréer "Harshad.dat" à partir de "Nombres.txt"
Generer_RapportProcédureCréer "Rapport.txt" à partir de "Harshad.dat"
AfficherProcédureAfficher le contenu de "Rapport.txt"

La fonction qui calcule la somme des chiffres n'est pas un objet global : elle n'est appelée que par Generer_Harshad, donc elle figure dans le tableau des objets locaux de ce module.

3. Idée : un fichier transmis à un module qui l'ouvre, le remplit ou le lit est passé par adresse.

Procédure Generer_Harshad (@ Fn : Fichier texte ; @ Fh : FNombres)
Procédure Generer_Rapport (@ Fh : FNombres ; @ Fr : Fichier texte)
Procédure Afficher (@ Fr : Fichier texte)
Fonction Somme_Chiffres (n : Entier) : Entier

4. 19 (somme 10) n'est pas retenu. Pour les autres nombres, la somme des chiffres divise le nombre, par exemple 247 = 13 × 19 et 1729 = 19 × 91.

18 = 9 × 2
21 = 3 × 7
100 = 1 × 100
201 = 3 × 67
247 = 13 × 19
1729 = 19 × 91
Nombres de Harshad : 6
2 Drill FE-C.2 — la fonction de score seule : compteur, plus longue suite, trace sur des lignes d’un fichier
Entraînement 02 / 03

Drill FE-C.2 — la fonction de score seule : compteur, plus longue suite, trace sur des lignes d’un fichier

4 questionsCorrigé masqué

Chaque ligne du fichier texte "Journal.txt" (racine du disque D) décrit une journée de production d'une machine, à raison d'une journée par ligne et pièce par pièce : la lettre O pour une pièce conforme et la lettre D pour une pièce défectueuse (par exemple OODODDDOOO).

Le score de fiabilité d'une journée vaut 100, diminué de 3 points par pièce défectueuse et de 5 fois la longueur de la plus longue suite de D consécutifs.

Travail demandé :

  1. Écrire l'algorithme d'une fonction Fiabilite(ch) qui retourne le score de fiabilité de la journée décrite par la chaîne ch, en un seul parcours de ch.
  2. Compléter le tableau d'exécution de Fiabilite pour ch = OODODDDOOO : pour chaque indice i, donner ch[i], puis les valeurs du nombre de D, de la longueur de la suite de D en cours et de la plus longue suite après le traitement de ch[i]. En déduire le score retourné.
  3. Donner le score des journées OOOOOOOOOO et DDODDDDODO.
  4. Écrire l'algorithme d'une procédure Bilan qui crée le fichier texte "Bilan.txt" (racine du disque D) : pour la k-ième ligne de "Journal.txt", elle y écrit la ligne Jour k : score, à raison d'une ligne par journée.

NB : le candidat n'est pas appelé à remplir le fichier "Journal.txt".

Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : un seul parcours suffit. Le compteur de D avance à chaque D ; la suite en cours s'allonge sur un D et retombe à 0 sur un O ; la plus longue suite est mise à jour dès que la suite en cours la dépasse.

Fonction Fiabilite (ch : Chaîne) : Entier
DEBUT
    nd ← 0
    l ← 0
    lmax ← 0
    Pour i de 0 à Long (ch) - 1 Faire
        Si ch[i] = "D" Alors
            nd ← nd + 1
            l ← l + 1
            Si l > lmax Alors
                lmax ← l
            Fin Si
        Sinon
            l ← 0
        Fin Si
    Fin Pour
    Retourner 100 - 3 * nd - 5 * lmax
FIN

TDOL : i, nd, l, lmax, entiers.

2. Trace pour OODODDDOOO :

ich[i]ndllmax
0O000
1O000
2D111
3O101
4D211
5D322
6D433
7O403
8O403
9O403

On obtient 4 défauts et une plus longue suite de 3, d'où un score de 100 − 12 − 15 = 73.

3. OOOOOOOOOO n'a aucun défaut : score 100. DDODDDDODO a 7 défauts, et sa plus longue suite est DDDD, de longueur 4 : score 100 − 21 − 20 = 59.

4. Idée : le numéro du jour est un compteur de lignes lues ; score et numéro sont convertis par Convch avant d'être concaténés.

Procédure Bilan ()
DEBUT
    Ouvrir ("D:\Journal.txt", Fj, "r")
    Ouvrir ("D:\Bilan.txt", Fb, "w")
    k ← 0
    Tant que Non (Fin_fichier (Fj)) Faire
        Lire_ligne (Fj, ch)
        k ← k + 1
        Ecrire_nl (Fb, "Jour " + Convch (k) + " : " + Convch (Fiabilite (ch)))
    Fin Tant que
    Fermer (Fj)
    Fermer (Fb)
FIN

TDOL de Bilan : Fj et Fb, fichiers texte ; ch, chaîne ; k, entier ; Fiabilite, fonction.

3 Drill FE-C.3 — deux listes dans l’ordre imposé : parcourir deux fois le fichier d’enregistrements
Entraînement 03 / 03

Drill FE-C.3 — deux listes dans l’ordre imposé : parcourir deux fois le fichier d’enregistrements

3 questionsCorrigé masqué

Le fichier d'enregistrements "Inscrits.dat" (racine du disque D) contient les inscriptions à deux clubs du lycée. Chaque enregistrement comporte les champs Nom (chaîne) et Club ("Info" ou "Math"), dans l'ordre d'arrivée des inscriptions.

On veut créer le fichier texte "Listes.txt" (racine du disque D), qui contient d'abord la ligne Liste Info suivie des noms des inscrits au club Info, puis une ligne vide, puis la ligne Liste Math suivie des noms des inscrits au club Math. Chaque nom occupe une ligne, et l'ordre d'arrivée est conservé dans chaque liste.

Exemple : "Inscrits.dat" contient (Yosr, Math), (Aziz, Info), (Maha, Info), (Bilel, Math), (Rania, Info).

Travail demandé :

  1. Donner le contenu de "Listes.txt" pour l'exemple.
  2. Expliquer pourquoi un seul parcours de "Inscrits.dat", écrivant directement dans "Listes.txt", ne permet pas d'obtenir cet ordre.
  3. Écrire l'algorithme d'une procédure Creer_Listes qui crée "Listes.txt", avec son tableau de déclaration des objets locaux (les types Inscrit et FInscrits sont supposés déclarés).
Voir la correction commentéeAprès avoir posé votre démarche

1.

Liste Info
Aziz
Maha
Rania

Liste Math
Yosr
Bilel

2. Un fichier texte s'écrit séquentiellement : une ligne écrite ne peut plus être déplacée. Or le premier inscrit, Yosr, est au club Math ; en un seul parcours, son nom serait écrit avant la liste Info. Il faut donc avoir écrit toute la liste Info avant le premier nom de la liste Math.

3. Idée : un parcours par liste. Le fichier d'enregistrements est fermé puis rouvert pour repartir du premier enregistrement. Les lignes fixes (titres et ligne vide) sont écrites hors des boucles, à leur place.

Procédure Creer_Listes ()
DEBUT
    Ouvrir ("D:\Listes.txt", G, "w")
    Ecrire_nl (G, "Liste Info")
    Ouvrir ("D:\Inscrits.dat", F, "rb")
    Tant que Non (Fin_fichier (F)) Faire
        Lire (F, e)
        Si e.Club = "Info" Alors
            Ecrire_nl (G, e.Nom)
        Fin Si
    Fin Tant que
    Fermer (F)
    Ecrire_nl (G, "")
    Ecrire_nl (G, "Liste Math")
    Ouvrir ("D:\Inscrits.dat", F, "rb")
    Tant que Non (Fin_fichier (F)) Faire
        Lire (F, e)
        Si e.Club = "Math" Alors
            Ecrire_nl (G, e.Nom)
        Fin Si
    Fin Tant que
    Fermer (F)
    Fermer (G)
FIN
ObjetType / NatureRôle
FFInscritsFichier "Inscrits.dat"
GFichier texteFichier "Listes.txt"
eInscritEnregistrement lu

Autre solution acceptable : un seul parcours qui répartit les noms dans deux tableaux, puis l'écriture des deux tableaux l'un après l'autre. Elle demande de fixer une taille maximale, que l'énoncé ne donne pas ; le double parcours n'en a pas besoin.

Relier ce raisonnement au bac

Choisis une filière pour voir les sujets qui étayent ce scénario.