PROGRAM MERGE (INPUT,OUTPUT); (* NATUERLICHES MISCHSORTIEREN. (KAPITEL 2.16) *) (* IM PROGRAMM SIND DIE OPERATIONEN RESET UND REWRITE *) (* DURCH OPEN- UND CLOSE-SEQUENZEN ERSETZT WORDEN. *) (* 1.5.1986 FLORIAN MATTHES *) (* QUELLE: WIRTH; ALGORITHMEN & DATENSTRUKTUREN KAP.2.3.2 *) CONST NAMEA ='0:FILE.A';(* FILENAMEN FUER DIE FLOPPY *) NAMEB ='0:FILE.B'; NAMEC ='0:FILE.C'; RD =',SEQ,READ'; WR =',SEQ,WRITE'; TYPE ITEM = RECORD KEY: INTEGER (* HIER KOENNEN WEITERE FELDER STEHEN *) END; TAPE = FILE OF ITEM; VAR C : TAPE; PROCEDURE ERASE(N: STRING); (* LOESCHE FILE N AUF DER DISKETTE. (NUR PASCAL 2.0) *) VAR KOMMANDO: TEXT; BEGIN OPEN(KOMMANDO,8,15,'S' + N); CLOSE(KOMMANDO) END; (* ERASE *) PROCEDURE LIST(VAR F: TAPE; N: STRING); (* ZEIGE DEN INHALT VON FILE F AN *) BEGIN WRITELN('INHALT DES FILES ', N, ':'); OPEN(F,8,3, N + RD); GET(F); (* NUR PASCAL 2.0 *) WHILE NOT EOF(F) DO BEGIN WRITE(F^.KEY:4); GET(F) END; WRITELN; CLOSE(F); (* NUR PASCAL 2.0 *) END; (* LIST *) PROCEDURE NATURALMERGE; (* SORTIERE FILE C. BENUTZT ZWEI HILFSFILES A UND B *) VAR L : INTEGER; (* ANZAHL DER LAEUFE AUF C *) EOR: BOOLEAN; (* END OF RUN, ENDE DES LAUFS *) A,B: TAPE; (* HILFSFILES *) PROCEDURE COPY (VAR X,Y: TAPE); (* KOPIERE KOMPONENTE VON X NACH Y, AKTUALISIERE EOR *) VAR BUF: ITEM; BEGIN BUF.KEY:=X^.KEY; GET(X); Y^.KEY:=BUF.KEY; PUT(Y); IF EOF(X) THEN EOR:= TRUE ELSE EOR:= BUF.KEY>X^.KEY END;(* COPY *) PROCEDURE COPYRUN(VAR X,Y: TAPE); (* KOPIERE LAUF VON X NACH Y *) BEGIN REPEAT COPY(X,Y) UNTIL EOR END;(* COPYRUN *) PROCEDURE DISTRIBUTE; (* KOPIERE LAUEFE VON C ABWECHSELND AUF A UND B *) BEGIN REPEAT COPYRUN(C,A); IF NOT EOF(C) THEN COPYRUN(C,B) UNTIL EOF(C) END; (* DISTRIBUTE *) PROCEDURE MERGE; (* MISCHE FILE A UND B ZU FILE C *) PROCEDURE MERGERUN; (* MISCHE LAEUFE VON A UND B ZU LAEUFEN AUF C *) BEGIN REPEAT IF A^.KEY