Exercice — fichiers texte (6 points), dans l'esprit des sessions 2016–2022
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 456Travail demandé :
- Fichiers.
- 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".
- Écrire les instructions d'ouverture du fichier "Contacts.txt" en lecture et de création du fichier "Annuaire.txt".
- Donner le contenu du fichier "Annuaire.txt" obtenu à partir du fichier "Contacts.txt" donné ci-dessus.
- Écrire l'algorithme d'une fonction Formater(ligne) qui retourne la ligne du fichier "Annuaire.txt" correspondant à une ligne du fichier "Contacts.txt".
- É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.
- Écrire l'algorithme d'une procédure Afficher(Fa) qui affiche le contenu du fichier "Annuaire.txt".
- 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.
| Objet | Type / Nature | Rôle |
|---|---|---|
| Fc | Fichier texte | Nom logique du fichier "Contacts.txt" |
| Fa | Fichier texte | Nom 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 invalide3. 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
FINLa 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)
FINLes 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)
FIN6. Tableaux de déclaration des objets locaux.
Formater :
| Objet | Type / Nature | Rôle |
|---|---|---|
| p | Entier | Position du caractère # |
| i | Entier | Compteur de parcours de la ligne |
| nom | Chaîne | Prénom en majuscules |
| num | Chaîne | Chiffres du numéro, sans séparateur |
| g1, g2, g3 | Chaîne | Les trois groupes de chiffres |
| res | Chaîne | Ligne formatée à retourner |
Generer :
| Objet | Type / Nature | Rôle |
|---|---|---|
| ligne | Chaîne | Ligne lue dans "Contacts.txt" |
| Formater | Fonction | Construire la ligne de "Annuaire.txt" |
Afficher :
| Objet | Type / Nature | Rôle |
|---|---|---|
| ligne | Chaîne | Ligne lue dans "Annuaire.txt" |