{ Le programme PASCAL qui suit réalisent les opérations suivantes : - Création d'un fichier - Insertion de clés générées aléatoirement - Parcours séquentiel et listage - Recherche séquentielle d'articles Les résultats de ce programme sont également fournis. } PROGRAM Fichiers; CONST B = 10; TYPE Typecle = INTEGER ; Typeqq = STRING[20] ; Nature = (Inf, Table); Typearticle = RECORD Cle : Typecle; Info : Typeqq END; Typebloc = RECORD CASE Diff : Nature OF 1 : ( Nombre : INTEGER; Tab : ARRAY[1..B] OF Typearticle ); 2 : ( Nombre_elements, Efface, Dernierblocseq, Dernierseq: INTEGER ) END; VAR Fs : TEXT; I : INTEGER; Efface, Nombre_elements : INTEGER; F : File OF Typebloc; Dernierseq,Dernierblocseq : INTEGER; Bloc : Typebloc; { Création du fichier } PROCEDURE Creation; BEGIN Bloc.Diff := Inf; Bloc.Nombre_elements := 0; Bloc.Efface := 0; Bloc.Dernierblocseq := 1; Bloc.Dernierseq := 0; REWRITE(F); SEEK(F, 0); WRITE(F, Bloc); CLOSE(F) END; { Ouverture du fichier } PROCEDURE Ouvrir; BEGIN Bloc.Diff := Inf; RESET(F); SEEK(F, 0); READ(F, Bloc); Efface := Bloc.Efface; Nombre_elements := Bloc.Nombre_elements; Dernierblocseq := Bloc.Dernierblocseq; Dernierseq := Bloc.Dernierseq; END; { Fermeture du fichier } PROCEDURE Fermer; BEGIN Bloc.Diff := Inf; Bloc.Nombre_elements := Nombre_elements; Bloc.Efface := Efface; Bloc.Dernierblocseq := Dernierblocseq; Bloc.Dernierseq := Dernierseq; RESET(F); SEEK(F, 0); WRITE(F, Bloc); END; { Parcours séquentiel du fichier et listage de ses éléments sur un fichier TEXT } PROCEDURE Impseq; VAR I, J : INTEGER; BEGIN RESET(F); { Les caractéristiques } WRITELN(Fs, 'Caractéristiques du fichier : '); WRITELN(Fs); WRITELN(Fs, '- Nombre d''articles : ', Nombre_elements ); WRITELN(Fs, '- Nombre d''articles effacés :', Efface); WRITELN(Fs, '- Dernier bloc :', Dernierblocseq); WRITELN(Fs, '- Dernier indice dans le dernier bloc :', Dernierseq); WRITELN(Fs); WRITELN(Fs); WRITELN(Fs, 'Contenu du fichier : '); FOR I:=2 TO Dernierblocseq DO BEGIN SEEK(F, I-1); READ(F, Bloc); WRITELN(Fs); WRITELN(Fs, 'Bloc ',I, ' :'); FOR J:=1 TO Bloc.Nombre DO WRITE(Fs, Bloc.Tab[J].Cle, ' ' ); WRITELN(Fs); END; END; { Insertion en fin de fichier } PROCEDURE Add (Cle : INTEGER); BEGIN Nombre_elements := Nombre_elements + 1 ; Inc(Dernierseq); IF Dernierseq <= B THEN BEGIN Bloc.Tab[Dernierseq].Cle:= Cle; Inc(Bloc.Nombre) END ELSE BEGIN Inc(Dernierblocseq); SEEK(F, Dernierblocseq - 1); WRITE(F, Bloc); Bloc.Tab[1].Cle := Cle; Bloc.Nombre := 1; Dernierseq := 1; END; END; { Recherche séquentielle d'un article de clé donnée } FUNCTION Recherche (Clef : INTEGER) : BOOLEAN; VAR I, J : INTEGER; Trouv : BOOLEAN; BEGIN WRITELN(Fs, ' Recherche de ', Clef, ' ...'); RESET(F); I:= 2; Trouv := FALSE; WHILE (I <= Dernierblocseq ) AND NOT Trouv DO BEGIN SEEK(F, I-1); READ(F, Bloc); J:= 1; WHILE (J <=Bloc.Nombre) AND NOT Trouv DO IF Bloc.Tab[J].Cle = Clef THEN Trouv := TRUE ELSE J := J + 1; I := I + 1 END; Recherche := Trouv; END; BEGIN ASSIGN(Fs, 'R_F1.Pas'); REWRITE(Fs); ASSIGN(F, 'Fichier'); WRITELN(Fs, 'Création du fichier...'); WRITELN(Fs); Creation; WRITELN(Fs, 'Ouverture du fichier...'); WRITELN(Fs); Ouvrir; WRITELN(Fs, 'Insertion de 55 articles de clés générées aléatoirement...'); WRITELN(Fs); Bloc.Diff := Table; Bloc.Nombre := 0; FOR I:=1 TO 55 DO Add( Random(1000) ); { Ecriture Dernier Bloc } IF Dernierseq > 0 THEN BEGIN Inc(Dernierblocseq); SEEK(F, Dernierblocseq - 1); WRITE(F, Bloc); END; CLOSE(F); { Parcours séquentiel du fichier et listage de ses éléments } Impseq; WRITELN(Fs); WRITELN(Fs, 'Recherche d''articles...'); WRITELN(Fs); IF Recherche(993) THEN WRITELN(Fs, 'Article existe') ELSE WRITELN(Fs, 'Article n''existe pas'); IF Recherche(374) THEN WRITELN(Fs, 'Article existe') ELSE WRITELN(Fs, 'Article n''existe pas'); IF Recherche(164) THEN WRITELN(Fs, 'Article existe') ELSE WRITELN(Fs, 'Article n''existe pas'); IF Recherche(858) THEN WRITELN(Fs, 'Article existe') ELSE WRITELN(Fs, 'Article n''existe pas'); IF Recherche(402) THEN WRITELN(Fs, 'Article existe') ELSE WRITELN(Fs, 'Article n''existe pas'); IF Recherche(616) THEN WRITELN(Fs, 'Article existe') ELSE WRITELN(Fs, 'Article n''existe pas'); WRITELN(Fs); WRITELN(Fs, 'Fermeture du fichier...'); Fermer; CLOSE(Fs); END. Contenu du fichier R_F1.PAS : Création du fichier... Ouverture du fichier... Insertion de 55 articles de clés générées aléatoirement... Caractéristiques du fichier : - Nombre d'articles : 55 - Nombre d'articles effacés :0 - Dernier bloc :7 - Dernier indice dans le dernier bloc :5 Contenu du fichier : Bloc 2 : 0 56 429 276 886 17 885 603 395 896 Bloc 3 : 374 116 624 106 914 221 115 111 768 490 Bloc 4 : 722 323 53 96 657 593 541 164 111 286 Bloc 5 : 573 776 300 828 643 993 278 191 216 330 Bloc 6 : 244 404 820 420 858 632 756 641 494 406 Bloc 7 : 536 502 635 853 616 Recherche d'articles... Recherche de 993 ... Article existe Recherche de 374 ... Article existe Recherche de 164 ... Article existe Recherche de 858 ... Article existe Recherche de 402 ... Article n'existe pas Recherche de 616 ... Article existe Fermeture du fichier...