Problème — pipeline de fichiers (9 points), dans l'esprit des sessions 2015–2022
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
GCCGCTTAGGACCTGCAGLe fichier "Retenues.txt" correspondant est :
ATGCCGTAGCCTGACGGTAC 36
GGCTAGCCGATCGGACTCAGGC 44
CGTACCGATGTTCAGACG 30
GCCGCTTAGGACCTGCAG 34Travail demandé :
- É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.
- Écrire l'algorithme du module qui crée le fichier "Scores.dat" à partir du fichier "Amorces.txt".
- Écrire les algorithmes des fonctions nécessaires au test de validité et au calcul du score.
- Écrire l'algorithme du module qui crée le fichier "Retenues.txt".
- 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)
FINTDNT :
| Nouveaux types |
|---|
| Amorce = Enregistrement Seq : Chaîne Score : Entier Qualite : Chaîne Fin |
| FScores = Fichier de Amorce |
TDOG :
| Objet | Type / Nature | Rôle |
|---|---|---|
| Fa | Fichier texte | Fichier "Amorces.txt" |
| Fs | FScores | Fichier "Scores.dat" |
| Fr | Fichier texte | Fichier "Retenues.txt" |
| Creer_Scores | Procédure | Générer "Scores.dat" |
| Creer_Retenues | Procédure | Gé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)
FIN3. 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
FINFonction 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
FINFonction 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
FINContrô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)
FIN5. Tableaux de déclaration des objets locaux.
| Module | Objet | Type / Nature |
|---|---|---|
| Creer_Scores | ch | Chaîne |
| Creer_Scores | e | Amorce |
| Creer_Scores | Valide, Calcul_Score | Fonction |
| Valide | ok | Booléen |
| Valide | i | Entier |
| Suite_Max | i, l, lmax | Entier |
| Calcul_Score | i, gc, at, s | Entier |
| Calcul_Score | der | Caractère |
| Calcul_Score | Suite_Max | Fonction |
| Creer_Retenues | e | Amorce |
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.