PARTIE 10
Corrigés des Exercices
Exercice 10.1
Cet algorithme écrit l'intégralité du fichier quot;Exemple.txt" à l'écran
Variable Truc en Caractère
Variable i en Entier
Debut
Ouvrir "Exemple.txt" sur 5 en Lecture
Tantque Non EOF(5)
LireFichier 5, Truc
Pour i ← 1 à Len(Truc)
Si Mid(Truc, i, 1) = "/" Alors
Ecrire " "
Sinon
Ecrire Mid(Truc, i, 1)
FinSi
i Suivant
FinTantQue
Fermer 5
Variables Nom * 20, Prénom * 17, Tel * 10, Mail * 20, Lig en Caractère
Debut
Ecrire "Entrez le nom : "
Lire Nom
Ecrire "Entrez le prénom : "
Lire Prénom
Ecrire "Entrez le téléphone : "
Lire Tel
Ecrire "Entrez le nom : "
Lire Mail
Lig ← Nom & Prénom & Tel & Mail
Ouvrir "Adresse.txt" sur 1 pour Ajout
EcrireFichier 1, Lig
Fermer 1
Fin
Là, comme indiqué dans le cours, on passe par un tableau de
strutures en mémoire vive, ce qui est la technique la plus fréquemment
employée. Le tri - qui est en fait un simple test - sera effectué sur le
premier champ (nom).
Structure Bottin
Nom en Caractère * 20
Prénom en Caractère * 15
Tel en Caractère * 10
Mail en Caractère * 20
Fin Structure
Tableau Mespotes[] en Bottin
Variables MonPote, Nouveau en Bottin
Variables i, j en Numérique
Debut
Ecrire "Entrez le nom : "
Lire Nouveau.Nom
Ecrire "Entrez le prénom : "
Lire Nouveau.Prénom
Ecrire "Entrez le téléphone : "
Lire Nouveau.Tel
Ecrire "Entrez le mail :
Lire Nouveau.Mail
On recopie l'intégralité de "Adresses" dans
MesPotes[]. Et après tout, c'est l'occasion : quand on tombe au bon endroit,
on insère subrepticement notre nouveau copain dans le tableau.
Ouvrir "Adresse.txt" sur 1 pour Lecture
i ← -1
inséré ← Faux
Tantque Non EOF(1)
i ← i + 1
Redim MesPotes[i]
LireFichier 1, MonPote
Si MonPote.Nom > Nouveau.Nom et Non Inséré Alors
MesPotes[i] ← Nouveau
Inséré ← Vrai
i ← i + 1
Redim MesPotes[i]
FinSi
MesPotes[i] ← MonPote
FinTantQue
Fermer 1
Si Non Inséré Alors
i ← i + 1
Redim MesPotes[i]
MesPotes[i] ← Nouveau
Inséré ← Vrai
FinSi
Et le tour est quasiment joué. Il ne reste plus qu'à
rebalancer tel quel l'intégralité du tableau MesPotes dans le fichier, en
écrasant l'ancienne version.
Ouvrir quot;Adresse.txt" sur 1 pour Ecriture
Pour j ← 0 à i
EcrireFichier 1, MesPotes[j]
j suivant
Fermer 1
Fin
C'est un peu du même tonneau que ce qu'on vient de faire, à
quelques variantes près. Il y a essentiellement une petite gestion de flag
pour faire bonne mesure.
Structure Bottin
Nom en Caractère * 20
Prénom en Caractère * 15
Tel en caractère * 10
Mail en Caractère * 20
Fin Structure
Tableau Mespotes[] en Bottin
Variables MonPote en Bottin
Variables Ancien, Nouveau en Caractère*20
Variables i, j en Numérique
Variable Trouvé en Booléen
Debut
Ecrire "Entrez le nom à modifier : "
Lire Ancien
Ecrire "Entrez le nouveau nom : "
Lire Nouveau
On recopie l'intégralité de "Adresses" dans Fic,
tout en recherchant le clampin. Si on le trouve, on procède à la
modification.
Ouvrir “Adresse.txt” sur 1 pour Lecture
i ← -1
Trouvé ← Faux
Tantque Non EOF(1)
i ← i + 1
Redim MesPotes[i]
LireFichier 1, MonPote
Si MonPote.Nom = Ancien.Nom Alors
Trouvé ← Vrai
MonPote.Nom ← Nouveau
FinSi
MesPotes[i] ← MonPote
FinTantQue
Fermer 1
On recopie ensuite l'intégralité de Fic dans "Adresse"
Ouvrir "Adresse.txt" sur 1 pour Ecriture
Pour j ← 0 à i
EcrireFichier 1, MesPotes[j]
j Suivant
Fermer 1
Et un petit message pour finir !
Si Trouvé Alors
Ecrire "Modification effectuée"
Sinon
Ecrire "Nom inconnu. Aucune modification effectuée"
FinSi
Fin
Là, c'est un tri sur un tableau de structures, rien de plus
facile. Et on est bien content de disposer des structures, autrement dit de
ne se coltiner qu'un seul tableau...
Structure Bottin
Nom en Caractère * 20
Prénom en Caractère * 15
Tel en caractère * 10
Mail en Caractère * 20
Fin Structure
Tableau Mespotes[] en Bottin
Variables Mini en Bottin
Variables i, j en Numérique
Debut
On recopie l'intégralité de "Adresses" dans MesPotes...
Ouvrir
"Adresse.txt" sur 1 pour Lecture
i ← -1
Tantque Non EOF(1)
i ← i + 1
Redim MesPotes[i]
LireFichier 1, MesPotes[i]
FinTantQue
Fermer 1
On trie le tableau selon l'algorithme de tri par insertion
déjà étudié, en utilisant le champ Nom de la structure :
Pour j ← 0 à i - 1
Mini ← MesPotes[j]
posmini ← j
Pour k ← j + 1 à i
Si MesPotes[k].Nom < Mini.Nom Alors
mini ← MesPotes[k]
posmini ← k
Finsi
k suivant
MesPotes[posmini] ← MesPotes[j]
MesPotes[j] ← Mini
j suivant
On recopie ensuite l'intégralité du tableau dans "Adresse"
Ouvrir "Adresse.txt" sur 1 pour Ecriture
Pour j ← 0 à i
EcrireFichier 1, MesPotes[j]
j suivant
Fermer 1
Fin
Bon, celui-là est tellement idiot qu'on n'a même pas besoin de
passer par des tableaux en mémoire vive.
Variable Lig en Caractère
Début
Ouvrir "Tutu.txt" sur 1 pour Ajout
Ouvrir “Toto.txt” sur 2 pour Lecture
Tantque Non EOF(2)
LireFichier 2, Lig
EcrireFichier 1, Lig
FinTantQue
Fermer 2
Ouvrir “Tata.txt” sur 3 pour Lecture
Tantque Non EOF(3)
LireFichier 3, Lig
EcrireFichier 1, Lig
FinTantQue
Fermer 3
Fermer 1
Fin
On va éliminer les mauvaises entrées dès la recopie : si
l'enregistrement ne présente pas un mail valide, on l'ignore, sinon on le
copie dans le tableau.
Structure Bottin
Nom en Caractère * 20
Prénom en Caractère * 15
Tel en caractère * 10
Mail en Caractère * 20
Fin Structure
Tableau Mespotes[] en Bottin
Variable MonPote en Bottin
Variables i, j en Numérique
Debut
On recopie "Adresses" dans MesPotes en testant le mail...
Ouvrir "Adresse.txt" sur 1 pour Lecture
i ← -1
Tantque Non EOF(1)
LireFichier 1, MonPote
nb ← 0
Pour i ← 1 à Len(MonPote.Mail)
Si Mid(MonPote.Mail, i, 1) = "@" Alors
nb ← nb + 1
FinSi
i suivant
Si nb = 1 Alors
i ← i + 1
Redim MesPotes[i]
MesPotes[i] ← MonPote
FinSi
FinTantQue
Fermer 1
On recopie ensuite l'intégralité de Fic dans "Adresse"
Ouvrir "Adresse.txt" sur 1 pour Ecriture
Pour j ← 0 à i
EcrireFichier 1, MesPotes[j]
j Suivant
Fermer 1
Fin
Une fois de plus, le passage par un tableau de structures est
une stratégie commode. Attention toutefois, comme il s'agit d'un fichier
texte, tout est stocké en caractère. Il faudra donc convertir en numérique
les caractères représentant les ventes, pour pouvoir effectuer les calculs
demandés. Pour le traitement, il y a deux possibilités. Soit on recopie le
fichier à l'identique dans un premier tableau, et on traite ensuite ce
tableau pour faire la somme par vendeur. Soit on fait le traitement
directement, dès la lecture du fichier. C'est cette option qui est choisie dans
ce corrigé.
Structure Vendeur
Nom en Caractère * 20
Montant en Numérique
Fin Structure
Tableau MesVendeurs[] en Vendeur
Variables NomPrec * 20, Lig, Nom en caractère
Variables Somme, Vente en Numérique
On balaye le fichier en faisant nos additions.
Dès que le nom a changé (on est passé au vendeur suivant), on range le
résultat et on remet tout à zéro
Debut
Ouvrir "Ventes.txt” sur 1 pour Lecture
i ← -1
Somme ← 0
NomPréc ← ""
Tantque Non EOF(1)
LireFichier 1, Lig
Nom ← Mid(Lig, 1, 20)
Vente ← CNum(Mid(Lig, 21, 10)
Si Nom = NomPrec Alors
Somme ← Somme + Vente
Sinon
i ← i + 1
Redim MesVendeurs(i)
MesVendeurs[i].Nom ← NomPrec
MesVendeurs[i].Montant ← Somme
Somme ← 0
NomPrec ← Nom
FinSi
FinTantQue
Et n'oublions pas un petit tour de plus pour le dernier de ces messieurs-dames…
i ← i + 1
Redim MesVendeurs[i]
MesVendeurs[i].Nom ← NomPrec
MesVendeurs[i].Montant ← Somme
Fermer 1
Pour terminer, on affiche le tableau à l'écran
Pour j ←
0 à i
Ecrire MesVendeurs[j]
j suivant
Fin
|