{ Construction de n fichiers triés à partir d'un fichier non trié } PROGRAM Fichier3; 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; Typefichier = File OF Typebloc; VAR Fs : TEXT; I, J : INTEGER; Efface, Nombre_elements : INTEGER; F : File OF Typebloc; Dernierseq,Dernierblocseq : INTEGER; Bloc : Typebloc; F1 : Typefichier; Dernierseq1,Dernierblocseq1 : INTEGER; Bloc1 : Typebloc; Depl, Numbloc : INTEGER; Temp, S : Typearticle; Tab : ARRAY[1..20] OF Typearticle; K : INTEGER; Num : INTEGER; { 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; { Parcours séquentiel du fichier et listage de ses éléments sur un fichier TEXT } PROCEDURE Impseq; VAR I, J : INTEGER; BEGIN RESET(F1); { 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 :', Dernierblocseq1); WRITELN(Fs, ' >> Dernier indice dans le dernier bloc :', Dernierseq1); WRITELN(Fs); WRITELN(Fs); WRITELN(Fs, ' + Contenu du fichier : '); FOR I:=2 TO Dernierblocseq1 DO BEGIN SEEK(F1, I-1); READ(F1, Bloc1); WRITELN(Fs); WRITELN(Fs, 'Bloc ',I, ' :'); FOR J:=1 TO Bloc1.Nombre DO WRITE(Fs, Bloc1.Tab[J].Cle, ' ' ); WRITELN(Fs); END; END; { Insertions répétées en fin de fichier } PROCEDURE Add (Article : Typearticle); BEGIN Nombre_elements := Nombre_elements + 1 ; Inc(Dernierseq1); IF Dernierseq1 <= B THEN BEGIN Bloc1.Tab[Dernierseq1]:= Article; Inc(Bloc1.Nombre) END ELSE BEGIN Inc(Dernierblocseq1); SEEK(F1, Dernierblocseq1 - 1); WRITE(F1, Bloc1); Bloc1.Tab[1] := Article; Bloc1.Nombre := 1; Dernierseq1 := 1; END; END; PROCEDURE Suivant ( VAR S: Typearticle); BEGIN IF (Numbloc= Dernierblocseq) AND (Depl >= Dernierseq) THEN S.Cle := -1 ELSE BEGIN Depl := Depl + 1; IF Depl <= B THEN S := Bloc.Tab(.Depl.) ELSE IF Numbloc = Dernierblocseq THEN S.Cle := - 1 ELSE BEGIN Numbloc := Numbloc + 1; SEEK(F, Numbloc-1); READ(F, Bloc); Depl := 1; S := Bloc.Tab(.Depl.) END; END; END; BEGIN ASSIGN(Fs, 'R_f3.Pas'); REWRITE(Fs); ASSIGN(F, 'Fichier'); WRITELN(Fs, 'Ouverture du fichier...'); WRITELN(Fs); Ouvrir; WRITELN(Fs, 'Construction des fichiers...'); Depl := 0; Numbloc := 2; SEEK(F, 1); READ(F, Bloc); Num:= 0; Suivant(S); WHILE S.Cle <> -1 DO BEGIN WRITELN(Fs); WRITELN(Fs, '* * * Chargement d''une partie du fichier dans un tableau...'); WRITELN(Fs); K:=1; WHILE (K <= 20) AND (S.Cle <> -1) DO BEGIN Tab(.K.) := S; Suivant(S); K:= K + 1 END; K:= K-1; WRITELN(Fs, '* * * Tri en mémoire...'); WRITELN(Fs); FOR I:= 1 TO K-1 DO FOR J:=K DOWNTO I+1 DO IF Tab(.J-1.).Cle > Tab(.J.).Cle THEN BEGIN Temp := Tab(.J-1.); Tab(.J-1.) := Tab(.J.); Tab(.J.) := Temp END; WRITELN(Fs, 'Résultat du tri :'); WRITELN(Fs); FOR I:=1 TO K DO WRITELN(Fs, Tab(.I.).Cle ); WRITELN(Fs); WRITELN(Fs, '* * * Recopier le tableau sur un fichier...'); WRITELN(Fs); Num := Num + 1; ASSIGN(F1, 'Fichier'+CHR( 48+Num) ); REWRITE(F1); Bloc1.Diff := Table; Bloc1.Nombre := 0; Dernierblocseq1 := 1; Dernierseq1 := 0; Nombre_elements := 0; Efface := 0; FOR I:=1 TO K DO Add( Tab(.I.) ); { Ecriture Dernier Bloc } IF Dernierseq1 > 0 THEN BEGIN Inc(Dernierblocseq1); SEEK(F1, Dernierblocseq1 - 1); WRITE(F1, Bloc1); END; Bloc1.Diff := Inf; Bloc1.Nombre_elements := Nombre_elements; Bloc1.Efface := Efface; Bloc1.Dernierblocseq := Dernierblocseq1; Bloc1.Dernierseq := Dernierseq1; RESET(F1); SEEK(F1, 0); WRITE(F1, Bloc1); WRITELN(Fs, 'Parcours séquentiel du fichier et listage de ses éléments'); WRITELN(Fs); Impseq; END; CLOSE(Fs); END. Contenu du fichier R_F3.PAS : Ouverture du fichier... Construction des fichiers... * * * Chargement d'une partie du fichier dans un tableau... * * * Tri en mémoire... Résultat du tri : 0 17 56 106 111 115 116 221 276 374 395 429 490 603 624 768 885 886 896 914 * * * Recopier le tableau sur un fichier... Parcours séquentiel du fichier et listage de ses éléments + Caractéristiques du fichier : >> Nombre d'articles : 20 >> Nombre d'articles effacés :0 >> Dernier bloc :3 >> Dernier indice dans le dernier bloc :10 + Contenu du fichier : Bloc 2 : 0 17 56 106 111 115 116 221 276 374 Bloc 3 : 395 429 490 603 624 768 885 886 896 914 * * * Chargement d'une partie du fichier dans un tableau... * * * Tri en mémoire... Résultat du tri : 53 96 111 164 191 216 278 286 300 323 330 541 573 593 643 657 722 776 828 993 * * * Recopier le tableau sur un fichier... Parcours séquentiel du fichier et listage de ses éléments + Caractéristiques du fichier : >> Nombre d'articles : 20 >> Nombre d'articles effacés :0 >> Dernier bloc :3 >> Dernier indice dans le dernier bloc :10 + Contenu du fichier : Bloc 2 : 53 96 111 164 191 216 278 286 300 323 Bloc 3 : 330 541 573 593 643 657 722 776 828 993 * * * Chargement d'une partie du fichier dans un tableau... * * * Tri en mémoire... Résultat du tri : 244 404 406 420 494 502 536 616 632 635 641 756 820 853 858 * * * Recopier le tableau sur un fichier... Parcours séquentiel du fichier et listage de ses éléments + Caractéristiques du fichier : >> Nombre d'articles : 15 >> Nombre d'articles effacés :0 >> Dernier bloc :3 >> Dernier indice dans le dernier bloc :5 + Contenu du fichier : Bloc 2 : 244 404 406 420 494 502 536 616 632 635 Bloc 3 : 641 756 820 853 858