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-AFichiers, enregistrements et matrices

Chaîne de fichiers texte : lire ligne par ligne, transformer, écrire un fichier résultat au format imposé

Idée directrice

Un fichier texte source, qui contient un élément par ligne, est lu ligne par ligne jusqu'à Fin_fichier. Chaque ligne est découpée (Pos du séparateur, Sous_chaine, Valeur), testée ou transformée, puis la ligne obtenue est écrite dans un fichier texte résultat, au format imposé par l'énoncé. Tout le reste est méthode : ouvrir la source en lecture et le résultat en création, confier la transformation d'une ligne à une fonction qui retourne une chaîne, fermer chaque fichier, et rouvrir le résultat en lecture pour l'afficher.

Ce qui aide à reconnaître la démarche

« En disposant d'un fichier texte nommé … » ; « contenant dans chaque ligne … » ; « générer un nouveau fichier texte … » ; « Donner une instruction d'association (d'ouverture) pour chacun des deux fichiers » ; « Le candidat n'est pas appelé à remplir le fichier … »

Besoin d’un point de départ ? Voir la méthode
  • Lire la NB : « le candidat n'est pas appelé à remplir le fichier … ». Le fichier source existe déjà ; on l'ouvre en lecture, on ne le crée jamais et on ne le saisit pas.
  • Boucle type : Tant que Non (Fin_fichier (F)) → Lire_ligne → traitement → Ecrire_nl dans le fichier résultat ; puis Fermer chacun des fichiers ouverts.
  • Découper une ligne : p ← Pos(séparateur, ch), puis Sous_chaine(ch, 0, p) et Sous_chaine(ch, p + 1, Long(ch)) ; enfin Valeur quand le champ est numérique.
  • Mettre la transformation d'une ligne dans une fonction qui retourne la chaîne à écrire : la procédure de parcours reste courte et lisible.
  • Pour afficher un fichier que l'on vient de créer, le fermer, le rouvrir en mode "r" et le parcourir avec la même boucle.
Les pièges à vérifier dans ta démarche

Ouvrir le fichier résultat en "r" (il n'existe pas encore) ou le fichier source en "w" (on l'efface). Utiliser Lire au lieu de Lire_ligne sur un fichier texte. Oublier de fermer un fichier, ou afficher le fichier résultat sans l'avoir rouvert en lecture. Décider sur la longueur du champ saisi au lieu du nombre de chiffres : +216 55 123 456 ne donne pas 8 chiffres. Enfin, oublier que la borne finale de Sous_chaine est exclue.

Sujet principal

Exercice — fichiers texte (6 points), dans l'esprit des sessions 2016–2022

9 questionsCorrigé masqué

Une association sportive conserve les contacts de ses adhérents dans un fichier texte nommé "Contacts.txt", enregistré à la racine du disque D. Chaque ligne contient le prénom d'un adhérent, le caractère #, puis son numéro de téléphone tel qu'il a été saisi, sans contrôle : les chiffres peuvent être séparés par des espaces, des points ou des tirets, et d'autres caractères ont pu s'y glisser.

On se propose de générer, à la racine du disque D, un fichier texte "Annuaire.txt" contenant une ligne par adhérent, dans le même ordre, au format imposé suivant :

  • le prénom écrit en majuscules, suivi de " : " (un espace, deux-points, un espace) ;
  • puis, si le numéro comporte exactement 8 chiffres, ces chiffres groupés par 2, 3 et 3 et séparés par un espace ;
  • sinon, le texte numéro invalide.

Par exemple, la ligne Salma#98.12-34 56 devient SALMA : 98 123 456.

On donne le contenu suivant du fichier "Contacts.txt" :

Karim#71-845-230
yassine#2 2.4 5 6.78 1
Nour#5512 34
Ines#+216 55 123 456

Travail demandé :

  1. Fichiers.
    1. Déclarer, dans le tableau de déclaration des objets globaux, les objets Fc et Fa associés respectivement aux fichiers "Contacts.txt" et "Annuaire.txt".
    2. Écrire les instructions d'ouverture du fichier "Contacts.txt" en lecture et de création du fichier "Annuaire.txt".
  2. Donner le contenu du fichier "Annuaire.txt" obtenu à partir du fichier "Contacts.txt" donné ci-dessus.
  3. Écrire l'algorithme d'une fonction Formater(ligne) qui retourne la ligne du fichier "Annuaire.txt" correspondant à une ligne du fichier "Contacts.txt".
  4. Écrire l'algorithme d'une procédure Generer(Fc, Fa) qui parcourt le fichier "Contacts.txt" ligne par ligne jusqu'à sa fin, écrit dans "Annuaire.txt" la ligne formatée correspondant à chaque ligne lue, puis ferme les deux fichiers.
  5. Écrire l'algorithme d'une procédure Afficher(Fa) qui affiche le contenu du fichier "Annuaire.txt".
  6. Dresser le tableau de déclaration des objets locaux de chacun des trois modules.

NB : le candidat n'est pas appelé à remplir le fichier "Contacts.txt". Les deux fichiers sont ouverts dans le programme appelant avant l'appel de Generer.

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

1.a Idée : un fichier texte a un type prédéfini ; il n'y a donc aucun nouveau type à déclarer, seulement les deux objets.

ObjetType / NatureRôle
FcFichier texteNom logique du fichier "Contacts.txt"
FaFichier texteNom logique du fichier "Annuaire.txt"

1.b Idée : le mode "r" ouvre un fichier qui existe déjà ; le mode "w" crée le fichier résultat (il serait écrasé s'il existait).

Ouvrir ("D:\Contacts.txt", Fc, "r")
Ouvrir ("D:\Annuaire.txt", Fa, "w")

2. On ne garde que les chiffres placés après le caractère #, puis on compte : 71845230 et 22456781 ont 8 chiffres ; 551234 n'en a que 6 et +216 55 123 456 en donne 11, car l'indicatif compte.

KARIM : 71 845 230
YASSINE : 22 456 781
NOUR : numéro invalide
INES : numéro invalide

3. Idée : le caractère # sépare les deux champs. On extrait le prénom avant lui, puis on construit la chaîne des seuls chiffres qui le suivent ; la décision porte sur la longueur de cette chaîne, pas sur celle du champ saisi.

Fonction Formater (ligne : Chaîne) : Chaîne
DEBUT
    p ← Pos ("#", ligne)
    nom ← Majus (Sous_chaine (ligne, 0, p))
    num ← ""
    Pour i de p + 1 à Long (ligne) - 1 Faire
        Si ("0" ≤ ligne[i]) Et (ligne[i] ≤ "9") Alors
            num ← num + ligne[i]
        Fin Si
    Fin Pour
    Si Long (num) = 8 Alors
        g1 ← Sous_chaine (num, 0, 2)
        g2 ← Sous_chaine (num, 2, 5)
        g3 ← Sous_chaine (num, 5, 8)
        res ← nom + " : " + g1 + " " + g2 + " " + g3
    Sinon
        res ← nom + " : numéro invalide"
    Fin Si
    Retourner res
FIN

La borne finale de Sous_chaine est exclue : Sous_chaine(num, 2, 5) rend les caractères d'indices 2, 3 et 4, c'est-à-dire le deuxième groupe de trois chiffres.

4. Idée : c'est le parcours standard d'un fichier texte, tant que la fin n'est pas atteinte ; la transformation est déléguée à Formater, et la procédure ne fait que lire, écrire et fermer.

Procédure Generer (@ Fc, Fa : Fichier texte)
DEBUT
    Tant que Non (Fin_fichier (Fc)) Faire
        Lire_ligne (Fc, ligne)
        Ecrire_nl (Fa, Formater (ligne))
    Fin Tant que
    Fermer (Fc)
    Fermer (Fa)
FIN

Les fichiers sont passés par adresse (@) : la procédure modifie l'état des fichiers ouverts par le programme appelant.

5. Idée : Fa a été fermé à la fin de Generer, et il avait été ouvert en écriture. Pour le lire, il faut le rouvrir en mode "r" avec son chemin.

Procédure Afficher (@ Fa : Fichier texte)
DEBUT
    Ouvrir ("D:\Annuaire.txt", Fa, "r")
    Tant que Non (Fin_fichier (Fa)) Faire
        Lire_ligne (Fa, ligne)
        Ecrire (ligne)
    Fin Tant que
    Fermer (Fa)
FIN

6. Tableaux de déclaration des objets locaux.

Formater :

ObjetType / NatureRôle
pEntierPosition du caractère #
iEntierCompteur de parcours de la ligne
nomChaînePrénom en majuscules
numChaîneChiffres du numéro, sans séparateur
g1, g2, g3ChaîneLes trois groupes de chiffres
resChaîneLigne formatée à retourner

Generer :

ObjetType / NatureRôle
ligneChaîneLigne lue dans "Contacts.txt"
FormaterFonctionConstruire la ligne de "Annuaire.txt"

Afficher :

ObjetType / NatureRôle
ligneChaîneLigne lue dans "Annuaire.txt"

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 : couples « A B » d'entiers décodés par Pos et Valeur, puis réécrits sous la forme "A+i*B" et affichés (principale 2017) ; nettoyage des espaces et de la ponctuation ligne par ligne (contrôle 2020) ; RIB filtrés par leur clé puis triés en passant par un tableau (principale 2016) ; fichier texte rempli depuis une matrice (principales 2021 et 2022) ; lignes « login#mot de passe crypté » décodées dans un tableau (contrôle 2026). Dans les sujets de 2015 à 2020, l'ouverture s'écrit Associer + Ouvrir/Recréer et la lecture Lire_nl ; depuis 2022, elle s'écrit Ouvrir(chemin, F, mode) et Lire_ligne.

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

1 Drill FE-A.1 — décoder une ligne « a b » avec Pos, Sous_chaine et Valeur
Entraînement 01 / 06

Drill FE-A.1 — décoder une ligne « a b » avec Pos, Sous_chaine et Valeur

3 questionsCorrigé masqué

Un fichier texte "Couples.txt", enregistré à la racine du disque D, contient dans chaque ligne deux entiers strictement positifs a et b séparés par un seul espace. On se propose de générer un fichier texte "Triplets.txt" (racine du disque D) contenant, pour chaque couple tel que a² + b² est le carré d'un entier c, la ligne "a b c" formée des trois entiers séparés par un espace, puis d'afficher le contenu de "Triplets.txt".

Exemple de contenu du fichier "Couples.txt" :

3 4
5 7
8 15
6 9
20 21
12 35

Travail demandé :

  1. Donner le contenu du fichier "Triplets.txt" pour cet exemple.
  2. Écrire l'algorithme d'une fonction Racine(n) qui retourne l'entier c tel que c² = n si n est un carré parfait, et −1 sinon.
  3. Écrire l'algorithme d'une procédure Triplets qui crée et remplit "Triplets.txt" à partir de "Couples.txt", puis affiche son contenu. Dresser son tableau de déclaration des objets locaux.

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

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

1. 3² + 4² = 25 = 5² ; 8² + 15² = 289 = 17² ; 20² + 21² = 841 = 29² ; 12² + 35² = 1369 = 37². En revanche 5² + 7² = 74 et 6² + 9² = 117 ne sont pas des carrés.

3 4 5
8 15 17
20 21 29
12 35 37

2. Idée : on fait croître c tant que c² < n ; à la sortie, soit c² = n (carré parfait), soit c² a dépassé n.

Fonction Racine (n : Entier) : Entier
DEBUT
    c ← 1
    Tant que c * c < n Faire
        c ← c + 1
    Fin Tant que
    Si c * c = n Alors
        Retourner c
    Sinon
        Retourner -1
    Fin Si
FIN

3. Idée : Pos rend l'indice p de l'espace. Le premier entier occupe les indices 0 à p − 1, le second va de p + 1 à la fin ; Valeur convertit chaque morceau avant le calcul.

Procédure Triplets ()
DEBUT
    Ouvrir ("D:\Couples.txt", Fs, "r")
    Ouvrir ("D:\Triplets.txt", Fr, "w")
    Tant que Non (Fin_fichier (Fs)) Faire
        Lire_ligne (Fs, ch)
        p ← Pos (" ", ch)
        a ← Valeur (Sous_chaine (ch, 0, p))
        b ← Valeur (Sous_chaine (ch, p + 1, Long (ch)))
        c ← Racine (a * a + b * b)
        Si c ≠ -1 Alors
            Ecrire_nl (Fr, ch + " " + Convch (c))
        Fin Si
    Fin Tant que
    Fermer (Fs)
    Fermer (Fr)
    Ouvrir ("D:\Triplets.txt", Fr, "r")
    Tant que Non (Fin_fichier (Fr)) Faire
        Lire_ligne (Fr, ch)
        Ecrire (ch)
    Fin Tant que
    Fermer (Fr)
FIN

La ligne lue est réécrite telle quelle, suivie de c : l'énoncé garantit un seul espace entre a et b. Pour afficher, on ferme "Triplets.txt" puis on le rouvre en lecture.

ObjetType / NatureRôle
Fs, FrFichier texteFichiers "Couples.txt" et "Triplets.txt"
chChaîneLigne lue
pEntierPosition de l'espace
a, b, cEntierLes deux valeurs et la racine
RacineFonctionTester le carré parfait
2 Drill FE-A.2 — générer un fichier texte depuis une matrice : en-tête, séparateurs, ligne de bilan
Entraînement 02 / 06

Drill FE-A.2 — générer un fichier texte depuis une matrice : en-tête, séparateurs, ligne de bilan

6 questionsCorrigé masqué

Un magasin enregistre ses ventes d'une semaine dans une matrice M de N lignes et 7 colonnes (5 ≤ N ≤ 50), de type Mat, déjà remplie par le programme appelant : M[i, j] est le nombre d'articles du produit numéro i vendus le jour j. Les lignes et les colonnes sont numérotées à partir de 0 ; le jour 0 est le lundi.

On se propose de créer, à la racine du disque D, un fichier texte "Bilan.txt" au format suivant :

  • la première ligne est l'en-tête Produit;Total;Meilleur jour ;
  • puis, pour chaque produit i, une ligne Pi;total;j où total est le nombre d'articles vendus dans la semaine et j le numéro du jour des plus fortes ventes (le premier de ces jours en cas d'égalité), les champs étant séparés par un point-virgule ;
  • la dernière ligne est Produits sans vente un jour au moins : k, où k est le nombre de produits dont la ligne contient au moins un 0.

Exemple pour N = 3 (les 7 valeurs de chaque ligne de M, du lundi au dimanche) :

ligne 0 : 4 0 7 7 2 5 1
ligne 1 : 3 6 2 8 8 1 4
ligne 2 : 0 0 5 3 9 2 6

Travail demandé :

  1. Donner le contenu du fichier "Bilan.txt" pour cet exemple.
  2. Écrire l'algorithme d'une procédure Generer_Bilan(M, N) qui crée et remplit le fichier "Bilan.txt".
  3. Dresser le tableau de déclaration des objets locaux de cette procédure.
Voir la correction commentéeAprès avoir posé votre démarche

1. Ligne 0 : total 26, maximum 7 atteint d'abord le jour 2 ; ligne 1 : total 32, maximum 8 d'abord le jour 3 ; ligne 2 : total 25, maximum 9 le jour 4. Les lignes 0 et 2 contiennent un 0, donc k = 2.

Produit;Total;Meilleur jour
P0;26;2
P1;32;3
P2;25;4
Produits sans vente un jour au moins : 2

2. Idée : l'en-tête s'écrit une seule fois avant la boucle et le bilan une seule fois après ; chaque ligne intermédiaire se construit comme une chaîne (Convch pour les nombres) avant un unique Ecrire_nl.

Procédure Generer_Bilan (M : Mat ; N : Entier)
DEBUT
    Ouvrir ("D:\Bilan.txt", F, "w")
    Ecrire_nl (F, "Produit;Total;Meilleur jour")
    k ← 0
    Pour i de 0 à N - 1 Faire
        total ← 0
        jmax ← 0
        zero ← Faux
        Pour j de 0 à 6 Faire
            total ← total + M[i, j]
            Si M[i, j] > M[i, jmax] Alors
                jmax ← j
            Fin Si
            Si M[i, j] = 0 Alors
                zero ← Vrai
            Fin Si
        Fin Pour
        Si zero Alors
            k ← k + 1
        Fin Si
        l ← "P" + Convch (i) + ";" + Convch (total)
        Ecrire_nl (F, l + ";" + Convch (jmax))
    Fin Pour
    Ecrire_nl (F, "Produits sans vente un jour au moins : " + Convch (k))
    Fermer (F)
FIN

La comparaison stricte M[i, j] > M[i, jmax] garde le premier jour du maximum : à la ligne 0, le 7 du jour 3 ne remplace pas celui du jour 2. Les trois variables total, jmax et zero sont réinitialisées pour chaque produit.

3.

ObjetType / NatureRôle
FFichier texteFichier "Bilan.txt"
i, jEntierCompteurs (produit, jour)
totalEntierVentes de la semaine du produit i
jmaxEntierJour des plus fortes ventes
zeroBooléenVrai si le produit a un jour sans vente
kEntierNombre de produits concernés
lChaîneDébut de la ligne à écrire
3 Drill FE-A.3 — répartir les lignes d’un fichier texte dans deux fichiers selon une catégorie
Entraînement 03 / 06

Drill FE-A.3 — répartir les lignes d’un fichier texte dans deux fichiers selon une catégorie

4 questionsCorrigé masqué

Le fichier texte "Moyennes.txt", enregistré à la racine du disque D, contient dans chaque ligne le numéro d'inscription d'un candidat (6 chiffres), un espace, puis sa moyenne (un réel écrit avec un point, par exemple 11.25).

On se propose de créer, en un seul parcours de "Moyennes.txt", deux fichiers texte à la racine du disque D :

  • "Admis.txt" : les lignes des candidats dont la moyenne est supérieure ou égale à 10 ;
  • "Controle.txt" : les lignes des candidats dont la moyenne est dans l'intervalle [7, 10[.

Les lignes sont recopiées telles qu'elles figurent dans "Moyennes.txt". Les autres candidats ne sont écrits dans aucun fichier. À la fin, on affiche le nombre de candidats de chacune des trois catégories (admis, contrôle, refusés).

Exemple de contenu du fichier "Moyennes.txt" :

120451 12.5
120452 9.75
120453 6.5
120454 10
120455 7
120456 15.25
120457 8.5

Travail demandé :

  1. Donner le contenu des fichiers "Admis.txt" et "Controle.txt" et les trois nombres affichés pour cet exemple.
  2. Écrire l'algorithme d'une procédure Repartir qui réalise ce traitement, avec son tableau de déclaration des objets locaux.

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

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

1. Les moyennes 12.5, 10 et 15.25 donnent l'admission ; 9.75, 7 et 8.5 sont dans [7, 10[ ; 6.5 est refusée. Les bornes comptent : 10 est admis et 7 va au contrôle.

"Admis.txt" :

120451 12.5
120454 10
120456 15.25

"Controle.txt" :

120452 9.75
120455 7
120457 8.5

Affichage : Admis : 3, Contrôle : 3, Refusés : 1.

2. Idée : un seul parcours suffit, car chaque ligne va dans un fichier déterminé par elle seule ; les trois fichiers sont ouverts avant la boucle, et une structure Si … Sinon Si teste les bornes du haut vers le bas.

Procédure Repartir ()
DEBUT
    Ouvrir ("D:\Moyennes.txt", Fm, "r")
    Ouvrir ("D:\Admis.txt", Fa, "w")
    Ouvrir ("D:\Controle.txt", Fc, "w")
    na ← 0
    nc ← 0
    nr ← 0
    Tant que Non (Fin_fichier (Fm)) Faire
        Lire_ligne (Fm, ch)
        p ← Pos (" ", ch)
        moy ← Valeur (Sous_chaine (ch, p + 1, Long (ch)))
        Si moy ≥ 10 Alors
            Ecrire_nl (Fa, ch)
            na ← na + 1
        Sinon Si moy ≥ 7 Alors
            Ecrire_nl (Fc, ch)
            nc ← nc + 1
        Sinon
            nr ← nr + 1
        Fin Si
    Fin Tant que
    Fermer (Fm)
    Fermer (Fa)
    Fermer (Fc)
    Ecrire ("Admis : ", na)
    Ecrire ("Contrôle : ", nc)
    Ecrire ("Refusés : ", nr)
FIN
ObjetType / NatureRôle
Fm, Fa, FcFichier texteFichier source et les deux fichiers créés
chChaîneLigne lue
pEntierPosition de l'espace
moyRéelMoyenne du candidat
na, nc, nrEntierEffectifs des trois catégories
4 Drill FE-A.4 — ouvrir chacun des fichiers dont le chemin est lu dans un fichier
Entraînement 04 / 06

Drill FE-A.4 — ouvrir chacun des fichiers dont le chemin est lu dans un fichier

4 questionsCorrigé masqué

Le fichier texte "Chemins.txt", situé dans le dossier D:\Cours, contient au moins une ligne. Chaque ligne contient le chemin d'accès complet d'un fichier texte existant, par exemple D:\Cours\algo.txt.

On se propose de créer, dans le même dossier, le fichier texte "Stat.txt". Chaque ligne de ce fichier contient le chemin d'un fichier listé, suivi de " : " et de son nombre de lignes. Une dernière ligne contient Plus long : suivi du chemin du fichier qui a le plus de lignes (le premier rencontré en cas d'égalité).

Exemple : "Chemins.txt" contient les trois lignes ci-dessous, et les fichiers algo.txt, bd.txt et web.txt comportent respectivement 12, 7 et 12 lignes.

D:\Cours\algo.txt
D:\Cours\bd.txt
D:\Cours\web.txt

Travail demandé :

  1. Donner le contenu du fichier "Stat.txt" pour cet exemple.
  2. Écrire l'algorithme d'une fonction NbLignes(chemin) qui retourne le nombre de lignes du fichier texte dont le chemin d'accès est chemin.
  3. Écrire l'algorithme d'une procédure Statistiques qui crée et remplit le fichier "Stat.txt".
  4. Si la boucle de comptage était écrite directement dans Statistiques, expliquer pourquoi on ne pourrait pas ouvrir chaque fichier listé avec le nom logique Fc déjà associé à "Chemins.txt".
Voir la correction commentéeAprès avoir posé votre démarche

1. web.txt a autant de lignes que algo.txt, mais il est rencontré après : c'est algo.txt qui reste le plus long.

D:\Cours\algo.txt : 12
D:\Cours\bd.txt : 7
D:\Cours\web.txt : 12
Plus long : D:\Cours\algo.txt

2. Idée : le chemin lu dans une ligne est une chaîne ; il sert directement de premier paramètre à Ouvrir. On compte les Lire_ligne jusqu'à la fin, puis on ferme avant de retourner.

Fonction NbLignes (chemin : Chaîne) : Entier
DEBUT
    Ouvrir (chemin, G, "r")
    n ← 0
    Tant que Non (Fin_fichier (G)) Faire
        Lire_ligne (G, ch)
        n ← n + 1
    Fin Tant que
    Fermer (G)
    Retourner n
FIN

TDOL de NbLignes : G, fichier texte (le fichier à compter) ; ch, chaîne (ligne lue, non utilisée) ; n, entier (compteur de lignes).

3. Idée : deux fichiers restent ouverts pendant toute la boucle (la liste et le résultat) ; chaque fichier listé n'est ouvert que le temps de l'appel à NbLignes.

Procédure Statistiques ()
DEBUT
    Ouvrir ("D:\Cours\Chemins.txt", Fc, "r")
    Ouvrir ("D:\Cours\Stat.txt", Fs, "w")
    max ← -1
    Tant que Non (Fin_fichier (Fc)) Faire
        Lire_ligne (Fc, chemin)
        n ← NbLignes (chemin)
        Ecrire_nl (Fs, chemin + " : " + Convch (n))
        Si n > max Alors
            max ← n
            plong ← chemin
        Fin Si
    Fin Tant que
    Ecrire_nl (Fs, "Plus long : " + plong)
    Fermer (Fc)
    Fermer (Fs)
FIN

TDOL de Statistiques : Fc, Fs, fichiers texte ; chemin, plong, chaînes ; n, max, entiers ; NbLignes, fonction. L'initialisation max ← −1 garantit que le premier fichier est retenu, même s'il est vide.

4. Un nom logique désigne un seul fichier ouvert à la fois. Ouvrir un fichier listé sous le nom Fc remplacerait l'association de Fc à "Chemins.txt" : la position atteinte dans la liste serait perdue, et la ligne suivante ne pourrait plus être lue. Il faut donc un second nom logique ; ici c'est G, objet local de NbLignes, ce qui laisse Fc intact dans Statistiques.

5 Drill FE-A.5 — charger un fichier texte dans des tableaux, trier, réécrire le même fichier
Entraînement 05 / 06

Drill FE-A.5 — charger un fichier texte dans des tableaux, trier, réécrire le même fichier

5 questionsCorrigé masqué

Le fichier texte "Stock.txt", enregistré à la racine du disque D, contient au plus 100 lignes, à raison d'un article par ligne. Chaque ligne est formée du code de l'article (4 chiffres), d'un point-virgule, puis de la quantité en stock (un entier positif ou nul).

On se propose de réécrire ce même fichier en supprimant les articles dont la quantité est nulle, et en rangeant les lignes restantes par quantité décroissante.

Exemple de contenu initial du fichier "Stock.txt" :

4510;12
3302;0
7781;45
1209;7
5566;45
2014;0
6630;19

Travail demandé :

  1. Déclarer les types TabCh et TabEnt, tableaux de 100 chaînes et de 100 entiers.
  2. Écrire l'algorithme d'une procédure Charger(T, Q, n) qui range dans T les lignes de "Stock.txt" dont la quantité est non nulle, dans Q les quantités correspondantes, et dans n leur nombre.
  3. Écrire l'algorithme d'une procédure Trier(T, Q, n) qui trie T et Q par quantité décroissante (tri par sélection).
  4. Écrire l'algorithme d'une procédure Reecrire(T, n) qui réécrit le fichier "Stock.txt" ligne par ligne à partir de T.
  5. Donner le contenu du fichier "Stock.txt" après traitement de l'exemple, puis expliquer pourquoi Charger doit fermer le fichier avant que Reecrire ne l'ouvre.
Voir la correction commentéeAprès avoir posé votre démarche

1.

Nouveau type
TabCh = Tableau de 100 Chaîne
TabEnt = Tableau de 100 Entier

2. Idée : un fichier texte ne se trie pas sur place ; on le transfère d'abord en mémoire. La quantité est extraite après le point-virgule, et on ne garde que les lignes utiles.

Procédure Charger (@ T : TabCh ; @ Q : TabEnt ; @ n : Entier)
DEBUT
    Ouvrir ("D:\Stock.txt", F, "r")
    n ← 0
    Tant que Non (Fin_fichier (F)) Faire
        Lire_ligne (F, ch)
        p ← Pos (";", ch)
        q ← Valeur (Sous_chaine (ch, p + 1, Long (ch)))
        Si q > 0 Alors
            T[n] ← ch
            Q[n] ← q
            n ← n + 1
        Fin Si
    Fin Tant que
    Fermer (F)
FIN

TDOL de Charger : F, fichier texte ; ch, chaîne ; p et q, entiers.

3. Idée : chaque échange doit déplacer la ligne et sa quantité ensemble, sinon les deux tableaux cessent de se correspondre.

Procédure Trier (@ T : TabCh ; @ Q : TabEnt ; n : Entier)
DEBUT
    Pour i de 0 à n - 2 Faire
        im ← i
        Pour j de i + 1 à n - 1 Faire
            Si Q[j] > Q[im] Alors
                im ← j
            Fin Si
        Fin Pour
        Si im ≠ i Alors
            aux ← T[i]
            T[i] ← T[im]
            T[im] ← aux
            x ← Q[i]
            Q[i] ← Q[im]
            Q[im] ← x
        Fin Si
    Fin Pour
FIN

TDOL de Trier : i, j, im, x, entiers ; aux, chaîne.

4. Idée : le mode "w" vide le fichier avant l'écriture ; tout son contenu utile est déjà dans T.

Procédure Reecrire (T : TabCh ; n : Entier)
DEBUT
    Ouvrir ("D:\Stock.txt", F, "w")
    Pour i de 0 à n - 1 Faire
        Ecrire_nl (F, T[i])
    Fin Pour
    Fermer (F)
FIN

TDOL de Reecrire : F, fichier texte ; i, entier.

5. Les articles 3302 et 2014 disparaissent ; le tri place d'abord les deux quantités 45, puis 19, 12 et 7.

7781;45
5566;45
6630;19
4510;12
1209;7

Il faut fermer avant de rouvrir, car un même fichier ne peut pas être ouvert deux fois à la fois, en lecture et en écriture. De plus, ouvrir "Stock.txt" en "w" avant la fin du chargement effacerait des lignes non encore lues.

6 Drill FE-A.6 — passer de l’ancienne notation (Associer, Lire_nl) à la notation en vigueur
Entraînement 06 / 06

Drill FE-A.6 — passer de l’ancienne notation (Associer, Lire_nl) à la notation en vigueur

4 questionsCorrigé masqué

Dans les sujets des sessions 2015 à 2020, les fichiers texte étaient manipulés avec les primitives Associer, Ouvrir(F), Recréer, Lire_nl et Ecrire_nl. Voici un module écrit dans cette notation :

0) DEF PROC Copier (Var F1, F2 : Texte)
1) Associer (F1, "C:\Notes.txt")
   Associer (F2, "C:\Copie.txt")
   Ouvrir (F1)
   Recréer (F2)
2) Tant que Non (Fin_fichier (F1)) Faire
       Lire_nl (F1, ch)
       Si Long (ch) > 0 Alors
           Ecrire_nl (F2, ch)
       Fin Si
   Fin Tant que
3) Fermer (F1), Fermer (F2)
4) Fin Copier

Travail demandé :

  1. Donner le rôle du module Copier.
  2. Recopier et compléter le tableau de correspondance suivant.
  3. Réécrire le module Copier dans la notation en vigueur, sous la forme d'une procédure Copier(ch1, ch2) dont les paramètres ch1 et ch2 contiennent les chemins d'accès des deux fichiers.
  4. Le fichier "Notes.txt" contient les cinq lignes Algo 15, une ligne vide, BD 12, une ligne vide, Web 17. Donner le contenu du fichier "Copie.txt" après l'appel du module.
Ancienne notationNotation en vigueur
Associer (F, chemin) puis Ouvrir (F)…
Associer (F, chemin) puis Recréer (F)…
Lire_nl (F, ch)…
Ecrire_nl (F, ch)…
paramètre Var…
Voir la correction commentéeAprès avoir posé votre démarche

1. Copier recopie dans "Copie.txt" toutes les lignes non vides de "Notes.txt", dans le même ordre : les lignes vides sont supprimées.

2. Idée : la notation en vigueur réunit l'association et le mode d'ouverture en une seule instruction Ouvrir(chemin, nom logique, mode).

Ancienne notationNotation en vigueur
Associer (F, chemin) puis Ouvrir (F)Ouvrir (chemin, F, "r")
Associer (F, chemin) puis Recréer (F)Ouvrir (chemin, F, "w")
Lire_nl (F, ch)Lire_ligne (F, ch)
Ecrire_nl (F, ch)Ecrire_nl (F, ch)
paramètre Varparamètre @ (par adresse)

3. Idée : les chemins deviennent des paramètres de type chaîne, et les noms logiques deviennent des objets locaux ; le corps de la boucle ne change pas.

Procédure Copier (ch1, ch2 : Chaîne)
DEBUT
    Ouvrir (ch1, F1, "r")
    Ouvrir (ch2, F2, "w")
    Tant que Non (Fin_fichier (F1)) Faire
        Lire_ligne (F1, ch)
        Si Long (ch) > 0 Alors
            Ecrire_nl (F2, ch)
        Fin Si
    Fin Tant que
    Fermer (F1)
    Fermer (F2)
FIN

TDOL : F1 et F2, fichiers texte ; ch, chaîne. L'appel devient Copier ("C:\Notes.txt", "C:\Copie.txt").

4. Les deux lignes vides ont une longueur nulle et ne sont pas recopiées :

Algo 15
BD 12
Web 17

Relier ce raisonnement au bac

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