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

Valider ou corriger des instructions : compatibilité des types (nouveaux types et objets) et primitives de fichiers mal employées

Idée directrice

L'exercice d'ouverture donne des déclarations (nouveaux types et objets) puis des instructions ou un algorithme présenté comme erroné. Chaque ligne se juge par une seule question : ce qui est produit a-t-il le type de ce qui le reçoit ? Une fonction booléenne ne remplit pas un Octet, un fichier d'enregistrements ne reçoit pas un champ, un fichier texte ne se lit pas comme un fichier typé, et le mode d'ouverture doit convenir à l'usage : "wb" efface ce qu'on voulait lire. La correction se donne ligne par ligne, avec sa justification.

Ce qui aide à reconnaître la démarche

« valider chacune des instructions en mettant dans la case correspondante … la lettre V … ou la lettre F » ; « Justifier la réponse si l'instruction est invalide » ; « contenant trois erreurs dans le choix des fonctions et des procédures prédéfinies utilisées » ; « cinq lignes de cet algorithme comportent des erreurs de logique ou de syntaxe »

Besoin d’un point de départ ? Voir la méthode
  • Avant de juger une instruction, écrire à côté de chaque objet son type exact, en remontant au tableau des nouveaux types (T[3] : Produit ; P.Qte : Octet).
  • Affectation, lecture ou écriture : valide seulement si les deux côtés ont le même type ; un fichier typé n'accepte que des valeurs de son type.
  • Primitive ↔ nature du fichier : Lire_ligne lit une ligne d'un fichier texte et Ecrire_nl y écrit une ligne ; sur un fichier typé, Lire et Ecrire lisent ou écrivent une valeur de son type.
  • Mode ↔ usage : "r"/"rb" pour lire un fichier existant, "w"/"wb" pour créer (et effacer), "a"/"ab" pour ajouter en fin.
  • Justifier en nommant les deux types en conflit ; dans le tableau des corrections, recopier la ligne entière telle qu'elle apparaît.
Les pièges à vérifier dans ta démarche

Oublier le domaine d'un Octet (0 à 255). Déclarer valide T[3] ← P.Prix parce que T est « un tableau de réels » : c'est un tableau d'enregistrements. Corriger le mode d'ouverture sans voir que "wb" vide le fichier. Écrire une justification générale (« erreur de syntaxe ») au lieu de nommer les types. Recopier seulement un fragment de la ligne erronée. Utiliser Fin_fichier comme un nombre d'enregistrements.

Sujet principal

Exercice — types, instructions et primitives de fichiers (6 points), dans l'esprit des sessions 2016–2026

4 questionsCorrigé masqué

Soient le tableau de déclaration des nouveaux types et le tableau de déclaration des objets suivants :

Nouveaux types
Produit = Enregistrement
Ref : Chaîne
Qte : Octet
Prix : Réel
Dispo : Booléen
Fin
FProduits = Fichier de Produit
FReels = Fichier de Réel
TabP = Tableau de 100 Produit
ObjetType / Nature
FFichier texte
PProduit
TTabP
FpFProduits
FrFReels
nOctet
okBooléen

On considère les instructions du tableau suivant :

InstructionV/FJustification
n ← Fin_fichier (Fp)
Ecrire (Fr, P.Prix)
Ecrire (Fp, P.Ref)
ok ← P.Qte > 0
T[3] ← P
T[3] ← P.Prix
Lire (Fr, n)
P.Qte ← 300

Le fichier d'enregistrements "Stock.dat", de type FProduits, est déjà rempli. On veut écrire, dans le fichier texte "Rupture.txt", la référence de chaque produit dont la quantité est nulle, à raison d'une référence par ligne. On donne ci-après l'algorithme d'une fonction Ruptures censée réaliser ce traitement et retourner le nombre de produits en rupture. Cependant, cinq lignes de cet algorithme comportent des erreurs dans l'emploi des primitives de fichiers ou dans les types.

Fonction Ruptures (ch1, ch2 : Chaîne) : Entier
DEBUT
    Ouvrir (ch1, Fp, "wb")
    Ouvrir (ch2, F, "w")
    nb ← 0
    Tant que Non (Fin_fichier (Fp)) Faire
        Lire_ligne (Fp, P)
        Si P.Qte = "0" Alors
            Ecrire_nl (F, P)
            nb ← nb + 1
        Fin Si
    Fin Tant que
    Fermer (Fp)
    Fermer (F)
    Retourner nb > 0
FIN

NB : ch1 et ch2 contiennent les chemins d'accès et les noms physiques des fichiers "Stock.dat" et "Rupture.txt".

Travail demandé :

  1. Reproduire le tableau des instructions et valider chacune d'elles en mettant la lettre V si l'instruction est valide ou la lettre F dans le cas contraire. Justifier la réponse si l'instruction est invalide.
  2. Questions sur la fonction Ruptures.
    1. Reproduire le tableau ci-dessous et y inscrire, pour chaque ligne erronée, la ligne telle qu'elle apparaît dans l'algorithme, puis sa correction.
    2. Dresser le tableau de déclaration des objets locaux de la fonction Ruptures corrigée.
  3. Un élève propose de remplacer la ligne Tant que Non (Fin_fichier (Fp)) Faire par Pour i de 1 à Fin_fichier (Fp) Faire.
    1. Expliquer pourquoi cette proposition est invalide.
    2. Écrire l'algorithme d'une fonction Existe(ch1, r) qui retourne Vrai si la référence r figure dans "Stock.dat", en utilisant la structure itérative adéquate pour arrêter la lecture dès que la référence est trouvée.
  4. "Stock.dat" contient, dans cet ordre, les produits ("R-101" ; 12 ; 4.5 ; Vrai), ("R-207" ; 0 ; 12.75 ; Faux), ("R-315" ; 3 ; 7.2 ; Vrai) et ("R-422" ; 0 ; 30 ; Faux). Donner le contenu de "Rupture.txt" et la valeur retournée par la fonction Ruptures corrigée, puis le nombre d'enregistrements lus par l'appel Existe(ch1, "R-315").
Ligne erronéeCorrection
Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : pour chaque instruction, comparer le type de ce qui est produit (valeur retournée, champ, enregistrement) au type de ce qui le reçoit (variable, case, fichier typé), sans oublier le domaine de valeurs d'un Octet.

InstructionV/FJustification
n ← Fin_fichier (Fp)FFin_fichier retourne un booléen, alors que n est de type Octet.
Ecrire (Fr, P.Prix)V
Ecrire (Fp, P.Ref)FFp est un fichier d'enregistrements de type Produit ; P.Ref est un champ de type Chaîne.
ok ← P.Qte > 0V
T[3] ← PV
T[3] ← P.PrixFT[3] est un enregistrement de type Produit ; P.Prix est un réel.
Lire (Fr, n)FFr est un fichier de réels : la valeur lue est un réel, et n est de type Octet.
P.Qte ← 300FLe champ Qte est de type Octet, dont les valeurs vont de 0 à 255.

Ecrire (Fr, P.Prix) est valide : un fichier de réels reçoit un réel. ok ← P.Qte > 0 affecte à un booléen le résultat d'une comparaison. T[3] ← P copie un enregistrement entier dans une case de même type.

2.a Idée : relire l'algorithme ligne par ligne en se demandant : le mode convient-il à l'usage du fichier ? la primitive convient-elle à la nature du fichier ? le type de la valeur convient-il à ce qui la reçoit ?

Ligne erronéeCorrection
Ouvrir (ch1, Fp, "wb")Ouvrir (ch1, Fp, "rb")
Lire_ligne (Fp, P)Lire (Fp, P)
Si P.Qte = "0" AlorsSi P.Qte = 0 Alors
Ecrire_nl (F, P)Ecrire_nl (F, P.Ref)
Retourner nb > 0Retourner nb

"Stock.dat" est déjà rempli : le mode "wb" le recrée vide, il faut le lire en "rb". Lire_ligne ne s'applique qu'à un fichier texte ; un fichier d'enregistrements se lit enregistrement par enregistrement avec Lire. Qte est un Octet, comparé à l'entier 0 et non à la chaîne "0". "Rupture.txt" est un fichier texte : on y écrit la chaîne P.Ref, pas l'enregistrement. Enfin, la fonction est de type Entier : elle retourne nb, et non le booléen nb > 0.

2.b

ObjetType / NatureRôle
FpFProduitsFichier "Stock.dat"
FFichier texteFichier "Rupture.txt"
PProduitEnregistrement lu
nbEntierNombre de produits en rupture

3.a Fin_fichier(Fp) retourne un booléen (Vrai lorsque la fin est atteinte), et non le nombre d'enregistrements : il ne peut pas servir de borne à une boucle Pour. De plus, le nombre d'enregistrements d'un fichier n'est pas connu d'avance ; on le parcourt donc avec une boucle à condition d'arrêt.

3.b Idée : deux raisons de s'arrêter, la fin du fichier ou la référence trouvée ; on les réunit dans la condition d'un Tant que.

Fonction Existe (ch1, r : Chaîne) : Booléen
DEBUT
    Ouvrir (ch1, Fp, "rb")
    trouve ← Faux
    Tant que Non (trouve) Et Non (Fin_fichier (Fp)) Faire
        Lire (Fp, P)
        trouve ← (P.Ref = r)
    Fin Tant que
    Fermer (Fp)
    Retourner trouve
FIN
ObjetType / NatureRôle
FpFProduitsFichier "Stock.dat"
PProduitEnregistrement lu
trouveBooléenVrai dès que la référence r est lue

4. Seuls "R-207" et "R-422" ont une quantité nulle. "Rupture.txt" contient les deux lignes :

R-207
R-422

La fonction Ruptures retourne 2\boxed{2}. L'appel Existe(ch1, "R-315") lit 3 enregistrements : la boucle s'arrête dès la lecture de "R-315", sans lire "R-422".

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 : six instructions à valider d'après un tableau de nouveaux types et un tableau d'objets (fichier d'enregistrements, fichier d'entiers, tableau d'enregistrements), avec justification des invalides (contrôle 2022) ; fonction Symetrie sur un fichier d'entiers contenant trois primitives mal choisies (Recréer, fin_fichier, Lire_nl), puis réécriture avec la structure itérative adéquate (contrôle 2016) ; procédure Remplir dont cinq lignes sont erronées, puis déclarations tenant compte des corrections (principale 2026) ; déclarations à reconstituer à partir d'une fonction sur un fichier (contrôle 2020) ; nature d'un objet et type le plus économique (contrôle 2021).

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

1 Drill FE-H.1 — reconstituer les déclarations d'une fonction sur un fichier à partir des instructions qui emploient ses objets
Entraînement 01 / 03

Drill FE-H.1 — reconstituer les déclarations d'une fonction sur un fichier à partir des instructions qui emploient ses objets

5 questionsCorrigé masqué

Soit l'algorithme de la fonction Meilleure suivant, où ch contient le chemin d'accès et le nom physique d'un fichier d'enregistrements non vide :

Fonction Meilleure (ch : Chaîne) : Chaîne
DEBUT
    Ouvrir (ch, Fe, "rb")
    Lire (Fe, e)
    best ← e
    Tant que Non (Fin_fichier (Fe)) Faire
        Lire (Fe, e)
        Si e.Moy > best.Moy Alors
            best ← e
        Fin Si
    Fin Tant que
    Fermer (Fe)
    Retourner best.Nom
FIN

Chaque enregistrement du fichier représente un élève, par son nom et sa moyenne.

Travail demandé :

  1. Dresser le tableau de déclaration des nouveaux types nécessaires : le type enregistrement Eleve et le type fichier FEleves.
  2. Dresser le tableau de déclaration des objets locaux de la fonction Meilleure.
  3. Le fichier contient, dans cet ordre, les élèves ("Aziz" ; 13.5), ("Hela" ; 16.25), ("Omar" ; 11), ("Rania" ; 16.25) et ("Sami" ; 15). Donner la valeur retournée par la fonction.
  4. Donner le rôle de la fonction Meilleure.
  5. Modifier la fonction pour qu'elle retourne le numéro d'ordre dans le fichier (1 pour le premier enregistrement) de l'élève trouvé.
Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : les types se lisent dans les instructions. e.Moy est comparé par >, et best.Nom est retourné par une fonction de type Chaîne : l'enregistrement a un champ Nom (chaîne) et un champ Moy (réel). Fe est ouvert en "rb" et lu avec Lire : c'est un fichier de cet enregistrement.

Nouveaux types
Eleve = Enregistrement
Nom : Chaîne
Moy : Réel
Fin
FEleves = Fichier de Eleve

2.

ObjetType / NatureRôle
FeFElevesFichier des élèves
eEleveEnregistrement lu
bestEleveMeilleur élève rencontré

best reçoit e par best ← e : il a forcément le même type, Eleve. ch est un paramètre formel et ne figure pas parmi les objets locaux.

3. Le premier enregistrement (Aziz, 13.5) initialise best. Hela (16.25) le remplace ; Omar (11) non ; Rania (16.25) non plus, car la comparaison est stricte ; Sami (15) non. La fonction retourne "Hela"\boxed{\text{"Hela"}}.

4. La fonction retourne le nom du premier élève ayant la plus forte moyenne du fichier.

5. Idée : un compteur k donne le numéro de l'enregistrement qui vient d'être lu ; on le mémorise en même temps que best.

Fonction Meilleure (ch : Chaîne) : Entier
DEBUT
    Ouvrir (ch, Fe, "rb")
    Lire (Fe, e)
    best ← e
    k ← 1
    num ← 1
    Tant que Non (Fin_fichier (Fe)) Faire
        Lire (Fe, e)
        k ← k + 1
        Si e.Moy > best.Moy Alors
            best ← e
            num ← k
        Fin Si
    Fin Tant que
    Fermer (Fe)
    Retourner num
FIN

Le type de la fonction devient Entier ; k et num sont deux nouveaux objets locaux de type Entier. Pour le fichier de la question 3, la fonction retourne 2.

2 Drill FE-H.2 — trois versions d'un même traitement de fichier : une seule est correcte
Entraînement 02 / 03

Drill FE-H.2 — trois versions d'un même traitement de fichier : une seule est correcte

1 questionCorrigé masqué

Pour chacun des traitements suivants, trois versions sont proposées. Mettre la lettre V devant chaque version correcte et la lettre F devant chaque version fausse, puis justifier chaque F. Dans chaque cas, ch contient le chemin d'accès et le nom physique d'un fichier qui existe déjà.

1. La fonction NbLignes(ch) retourne le nombre de lignes d'un fichier texte, éventuellement vide. Voici le corps de ses trois versions.

Version 1

Ouvrir (ch, F, "r")
n ← 0
Tant que Non (Fin_fichier (F)) Faire
    Lire_ligne (F, lig)
    n ← n + 1
Fin Tant que
Fermer (F)
Retourner n

Version 2

Ouvrir (ch, F, "w")
n ← 0
Tant que Non (Fin_fichier (F)) Faire
    Lire_ligne (F, lig)
    n ← n + 1
Fin Tant que
Fermer (F)
Retourner n

Version 3

Ouvrir (ch, F, "r")
n ← 0
Répéter
    Lire_ligne (F, lig)
    n ← n + 1
Jusqu'à Fin_fichier (F)
Fermer (F)
Retourner n

2. La séquence ajoute l'enregistrement e à la fin du fichier d'enregistrements "Notes.dat", sans effacer son contenu.

Version 1

Ouvrir (ch, F, "ab")
Ecrire (F, e)
Fermer (F)

Version 2

Ouvrir (ch, F, "wb")
Ecrire (F, e)
Fermer (F)

Version 3

Ouvrir (ch, F, "ab")
Ecrire (e, F)
Fermer (F)

3. La séquence recopie un fichier texte (nom logique F, ouvert en "r") dans un fichier texte (nom logique G, ouvert en "w"), en écrivant chaque ligne en majuscules.

Version 1

Tant que Non (Fin_fichier (F)) Faire
    Lire_ligne (F, lig)
    Ecrire_nl (G, Majus (lig))
Fin Tant que

Version 2

Tant que Non (Fin_fichier (G)) Faire
    Lire_ligne (F, lig)
    Ecrire_nl (G, Majus (lig))
Fin Tant que

Version 3

Tant que Non (Fin_fichier (F)) Faire
    Lire_ligne (F, lig)
    Ecrire (G, Majus (lig))
Fin Tant que
Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : vérifier le mode, puis le comportement sur le cas limite du fichier vide.

Version 1 : V. Version 2 : F, le mode "w" recrée le fichier vide : la fonction retourne toujours 0 et le contenu est perdu. Version 3 : F, la boucle Répéter lit au moins une ligne : pour un fichier vide, elle lit au-delà de la fin au lieu de retourner 0.

2. Idée : le mode doit ajouter, et Ecrire reçoit d'abord le fichier, puis la valeur.

Version 1 : V. Version 2 : F, le mode "wb" efface les notes déjà enregistrées ; le fichier ne contient plus que e. Version 3 : F, l'ordre des paramètres est inversé : la syntaxe est Ecrire (F, e).

3. Idée : la boucle s'arrête sur la fin du fichier qu'on lit, et chaque ligne recopiée doit rester une ligne de G.

Version 1 : V. Version 2 : F, elle teste la fin de G, le fichier qu'on écrit, et non celle de F : l'arrêt ne dépend pas des lignes restant à lire. Version 3 : F, Ecrire n'ajoute pas de retour à la ligne : toutes les lignes recopiées se collent en une seule ligne de G ; il faut Ecrire_nl (G, Majus (lig)).

3 Drill FE-H.3 — trois primitives mal choisies dans la notation des sessions 2015–2020 (Recréer, Lire_nl, Fin_fichier), puis la boucle adéquate
Entraînement 03 / 03

Drill FE-H.3 — trois primitives mal choisies dans la notation des sessions 2015–2020 (Recréer, Lire_nl, Fin_fichier), puis la boucle adéquate

3 questionsCorrigé masqué

Cet exercice utilise la notation des sujets des sessions 2015 à 2020 : fichier associé par Associer puis ouvert par Ouvrir(F) ou Recréer(F), Taille_fichier(F) pour le nombre d'éléments, DEF FN pour une fonction.

Soit une fonction Croissant qui vérifie si les entiers d'un fichier F, déjà rempli et contenant au moins un entier, sont rangés dans l'ordre croissant (au sens large). Fent désigne le type Fichier d'entiers.

On propose ci-dessous un algorithme de cette fonction, contenant trois erreurs dans le choix des fonctions et des procédures prédéfinies utilisées :

0) DEF FN Croissant (Var F : Fent) : Booléen
1) Recréer (F) ; C ← Vrai
   Lire_nl (F, a)
   Pour i de 1 à Fin_fichier (F) - 1 Faire
       Lire (F, b)
       C ← C Et (a ≤ b)
       a ← b
   Fin Pour
   Fermer (F)
2) Croissant ← C
3) Fin Croissant

Travail demandé :

  1. Reproduire et compléter le tableau ci-dessous par les fonctions ou procédures prédéfinies dont l'utilisation est erronée, et par les fonctions ou procédures prédéfinies adéquates.
  2. Pour améliorer cet algorithme, réécrire la séquence n°1 en utilisant la structure itérative adéquate, qui arrête la lecture dès que deux entiers consécutifs ne sont pas dans l'ordre, en tenant compte des corrections de la question 1.
  3. Le fichier F contient 4, 7, 2, 9, 12. Donner la valeur retournée et le nombre d'entiers lus par la version réécrite. Même question pour le fichier 3, 5, 5, 9.
Fonction ou procédure prédéfinie erronéeFonction ou procédure prédéfinie adéquate
Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : F est déjà rempli et c'est un fichier d'entiers ; la borne d'une boucle Pour est un nombre.

Fonction ou procédure prédéfinie erronéeFonction ou procédure prédéfinie adéquate
Recréer (F)Ouvrir (F)
Lire_nl (F, a)Lire (F, a)
Fin_fichier (F)Taille_fichier (F)

Recréer efface le fichier, qu'il faut au contraire lire : on l'ouvre avec Ouvrir. Lire_nl est réservée aux fichiers texte ; F est un fichier d'entiers. Fin_fichier retourne un booléen, alors que la borne de la boucle est le nombre d'entiers, donné par Taille_fichier.

2. Idée : deux conditions d'arrêt, un couple mal rangé ou la fin du fichier ; une boucle Tant que les réunit.

1) Ouvrir (F) ; C ← Vrai
   Lire (F, a)
   Tant que C Et Non (Fin_fichier (F)) Faire
       Lire (F, b)
       C ← (a ≤ b)
       a ← b
   Fin Tant que
   Fermer (F)

Chaque Lire fait avancer le pointeur : il n'est pas nécessaire d'appeler Pointer.

3. Pour 4, 7, 2, 9, 12 : après la lecture de 4, 7 puis 2, le couple (7, 2) donne C = Faux et la boucle s'arrête. La fonction retourne Faux après 3 lectures, au lieu des 5 de la version avec Pour. Pour 3, 5, 5, 9 : tous les couples vérifient a ≤ b (5 ≤ 5 compris) ; la fonction retourne Vrai après avoir lu les 4 entiers.

Relier ce raisonnement au bac

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