Exercice — fichier d'enregistrements (6 points), dans l'esprit des sessions 2018–2026
Pour vérifier la loi de refroidissement d'une boisson chaude, un élève relève la température T (en °C) de la boisson à différents instants t (en minutes). La loi à vérifier s'écrit :
Les mesures sont stockées dans un fichier d'enregistrements "Mesures.dat", situé dans le dossier D:\TP. Chaque enregistrement est formé de deux champs réels : Temps (l'instant t) et Temp (la température mesurée).
L'expérience est dite réussie si l'écart entre la température mesurée et la température théorique ne dépasse pas 0,5 °C pour au moins 80 % des mesures.
Travail demandé :
- Écrire l'instruction d'ouverture du fichier "Mesures.dat" en vue de sa création, en l'associant au nom logique F.
- Donner le tableau de déclaration des nouveaux types : le type enregistrement Mesure et le type fichier FMesures.
- Écrire l'algorithme d'une procédure Remplir(F) qui remplit le fichier "Mesures.dat" par saisie, F ayant été ouvert par l'instruction de la question 1 dans le programme appelant. L'instant saisi doit être positif ou nul. La saisie s'arrête lorsque l'utilisateur répond "N" à la question « Voulez-vous saisir une autre mesure (O/N) ? », la réponse ne pouvant être que "O" ou "N".
- Écrire l'algorithme d'une fonction Reussie(chemin) qui retourne Vrai si l'expérience enregistrée dans le fichier dont le chemin est chemin est réussie, et Faux sinon.
- Écrire l'algorithme d'une procédure Retenir(ch1, ch2) qui crée le fichier d'enregistrements "Retenues.dat" (chemin ch2), de même structure que "Mesures.dat" (chemin ch1), contenant uniquement les mesures dont l'écart ne dépasse pas 0,5 °C, puis l'affiche, à raison d'une mesure par ligne sous la forme
t = … min : … °C. - Questions de cours.
- Quel est le type de la valeur retournée par Fin_fichier(F) ?
- Pourquoi ne peut-on pas lire le fichier "Mesures.dat" avec Lire_ligne ?
- Quel mode d'ouverture faut-il utiliser pour ajouter de nouvelles mesures à la fin de "Mesures.dat" sans effacer les anciennes ?
- Le fichier "Mesures.dat" contient les six mesures du tableau ci-dessous, où les températures théoriques sont arrondies au centième. L'expérience est-elle réussie ? Donner le nombre d'enregistrements de "Retenues.dat".
| t (min) | T mesurée (°C) | T théorique (°C) |
|---|---|---|
| 0 | 80,2 | 80,00 |
| 5 | 56,6 | 56,39 |
| 10 | 41,8 | 42,07 |
| 15 | 33,5 | 33,39 |
| 20 | 28,9 | 28,12 |
| 30 | 23,1 | 22,99 |
NB : on dispose des fonctions prédéfinies Exp(x), qui retourne eˣ, et Abs(x), qui retourne la valeur absolue de x.
Voir la correction commentéeAprès avoir posé votre démarche
1. Idée : pour créer un fichier d'enregistrements, on l'ouvre en écriture binaire.
Ouvrir ("D:\TP\Mesures.dat", F, "wb")2. Idée : on déclare d'abord l'enregistrement, puis le fichier dont les éléments sont de ce type.
| Nouveaux types |
|---|
| Mesure = Enregistrement Temps : Réel Temp : Réel Fin |
| FMesures = Fichier de Mesure |
3. Idée : une boucle Répéter extérieure, une mesure par tour. Deux contrôles de saisie imbriqués : l'instant (≥ 0) et la réponse (O ou N). On écrit l'enregistrement avant de poser la question.
Procédure Remplir (@ F : FMesures)
DEBUT
Répéter
Répéter
Ecrire ("Instant t (min) : ")
Lire (e.Temps)
Jusqu'à e.Temps ≥ 0
Ecrire ("Température (°C) : ")
Lire (e.Temp)
Ecrire (F, e)
Répéter
Ecrire ("Voulez-vous saisir une autre mesure (O/N) ? ")
Lire (rep)
Jusqu'à (rep = "O") Ou (rep = "N")
Jusqu'à rep = "N"
Fermer (F)
FIN| Objet | Type / Nature | Rôle |
|---|---|---|
| e | Mesure | Mesure en cours de saisie |
| rep | Caractère | Réponse de l'utilisateur |
4. Idée : un seul parcours séquentiel suffit, en comptant à la fois toutes les mesures et les mesures conformes. On compare ensuite des entiers (100·nb ≥ 80·total), ce qui évite une division.
Fonction Reussie (chemin : Chaîne) : Booléen
DEBUT
Ouvrir (chemin, F, "rb")
nb ← 0
total ← 0
Tant que Non (Fin_fichier (F)) Faire
Lire (F, e)
total ← total + 1
th ← 20 + 60 * Exp (-e.Temps / 10)
Si Abs (e.Temp - th) ≤ 0.5 Alors
nb ← nb + 1
Fin Si
Fin Tant que
Fermer (F)
Retourner (total > 0) Et (100 * nb ≥ 80 * total)
FIN| Objet | Type / Nature | Rôle |
|---|---|---|
| F | FMesures | Fichier des mesures |
| e | Mesure | Enregistrement lu |
| nb, total | Entier | Mesures conformes, toutes les mesures |
| th | Réel | Température théorique à l'instant e.Temps |
« Ne dépasse pas 0,5 » se traduit par ≤, et « au moins 80 % » par ≥. Le test total > 0 empêche de déclarer réussie une expérience sans mesure.
5. Idée : on lit Mesures.dat et on écrit dans Retenues.dat un enregistrement du même type. Pour afficher, on ferme Retenues.dat puis on le rouvre en lecture binaire.
Procédure Retenir (ch1, ch2 : Chaîne)
DEBUT
Ouvrir (ch1, F, "rb")
Ouvrir (ch2, G, "wb")
Tant que Non (Fin_fichier (F)) Faire
Lire (F, e)
th ← 20 + 60 * Exp (-e.Temps / 10)
Si Abs (e.Temp - th) ≤ 0.5 Alors
Ecrire (G, e)
Fin Si
Fin Tant que
Fermer (F)
Fermer (G)
Ouvrir (ch2, G, "rb")
Tant que Non (Fin_fichier (G)) Faire
Lire (G, e)
Ecrire ("t = ", e.Temps, " min : ", e.Temp, " °C")
Fin Tant que
Fermer (G)
FIN| Objet | Type / Nature | Rôle |
|---|---|---|
| F, G | FMesures | "Mesures.dat" et "Retenues.dat" |
| e | Mesure | Enregistrement lu puis écrit |
| th | Réel | Température théorique |
6.a Fin_fichier retourne un booléen : Vrai lorsque le dernier enregistrement a été lu.
6.b Lire_ligne lit une ligne de caractères et ne s'applique qu'à un fichier texte. "Mesures.dat" est un fichier d'enregistrements : on y lit un enregistrement entier, avec Lire(F, e).
6.c Le mode "ab" (ajout en binaire) : l'écriture se fait après le dernier enregistrement. Le mode "wb" effacerait le fichier.
7. Seule la mesure de l'instant 20 min s'écarte de plus de 0,5 °C (|28,9 − 28,12| = 0,78). On a donc 5 mesures conformes sur 6, soit environ 83 % ≥ 80 % : l'expérience est réussie, et "Retenues.dat" contient 5 enregistrements.