home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* KREUZ.PAS *)
- (* Kreuzvergleich zweier Dateien *)
- (* Turbo Pascal ab 5.0 *)
- (* (c) 1991 Lothar Wenzel & TOOLBOX *)
- (* ------------------------------------------------------ *)
- {$A+,B-,D-,E-,F-,I-,L-,N-,O-,R-,S-,V-} { Speed! }
- {$M 1024,132000,132000} { Heap reservieren }
-
- PROGRAM Kreuz;
-
- USES Crt;
- CONST
- MaxPuffer = 65534; { Puffergröße }
- TYPE
- Datei = FILE;
- PufferType = ARRAY[0..MaxPuffer] OF BYTE;
- VAR
- Resultat : WORD; { Resultat für BlockRead }
- Summe : REAL;
- Portion, Faktor,
- Laenge1, Laenge2 : LONGINT; { Länge der Quelldateien }
- Quelltext,
- Zieltext : Datei; { 1. und 2. Datei }
- Index, Index1,
- Index2, Index3,
- Treffer : LONGINT;
- Name1, Name2 : STRING[12]; { Dateinamen }
- Kommando : CHAR;
- Innerhalb : BOOLEAN;
- Puffer1, Puffer2 : ^PufferType;
-
- PROCEDURE DoppelFenster(x1, y1, x2, y2 : INTEGER);
- CONST { zeichnet den doppelten Menürahmen }
- M1 = $C9; M2 = $CD; M3= $BB; M4 = $BA; M5 = $BC; M6 = $C8;
- VAR
- I, J : INTEGER;
- BEGIN
- GotoXY(x1, y1); Write(Chr(M1));
- GotoXY(x2, y1); Write(Chr(M3));
- GotoXY(x2, y2); Write(Chr(M5));
- GotoXY(x1, y2); Write(Chr(M6));
- FOR I := y1 + 1 TO y2 - 1 DO BEGIN
- GotoXY(x1, I); Write(Chr(M4));
- GotoXY(x2, I); Write(Chr(M4));
- END;
- FOR J := x1 + 1 TO x2 - 1 DO BEGIN
- GotoXY(J, y1); Write(Chr(M2));
- GotoXY(J, y2); Write(Chr(M2));
- END;
- END;
-
- PROCEDURE Fehler(Nummer : INTEGER); { Fehlerauswertung }
- BEGIN
- ClrScr;
- CASE Nummer OF
- 1 : WriteLn('1. Quelldatei ', Name1,
- ' ist nicht vorhanden!');
- 2 : WriteLn('2. Quelldatei ', Name2,
- ' ist nicht vorhanden!');
- 3 : WriteLn('Faktor ist zu groß!');
- 4 : WriteLn('Datei(en) zu groß für Vergleich!');
- END;
- ReadLn;
- END;
-
- PROCEDURE Dialog; { Eingabe Dateinamen }
- BEGIN
- ClrScr;
- Write('Geben Sie den Dateinamen Nr. 1 ein --> ');
- ReadLn(Name1);
- Write('Geben Sie den Dateinamen Nr. 2 ein --> ');
- ReadLn(Name2);
- END;
-
- PROCEDURE Parameter; { Eingabe Parameter }
- BEGIN
- ClrScr;
- GotoXY(10, 5); Write('Alter Parameter: ', Faktor);
- GotoXY(10, 6); Write('Neuer Parameter: ');
- ReadLn(Faktor);
- END;
-
- PROCEDURE Auswertung; { Kreuzvergleich }
- VAR
- Stand, J : INTEGER;
- BEGIN
- ClrScr;
- GotoXY(19, 1);
- Write('K R E U Z K O R R E L A T I O N');
- GotoXY(60, 2); Write('Stand: ');
- GotoXY(60, 7); Write('Dateien:');
- GotoXY(60, 9); Write('1. ', Name1);
- GotoXY(60, 10); Write('2. ', Name2);
- GotoXY(60, 12); Write('Länge:');
- GotoXY(60, 16); Write('Abstand:');
- FOR J := 0 TO 10 DO BEGIN
- FOR Index:=0 TO 4 DO BEGIN
- GotoXY(9 + 10 * Index, 23 - 2 * J); Write(10 * J:3);
- END;
- END;
- FOR Index := 0 TO 4 DO
- DoppelFenster(13 + 10 * Index, 2, 15 + 10 * Index, 23);
- GotoXY(2, 3);
- Write('%');
- Summe := 0;
- Assign(Quelltext, Name1);
- {$I-}
- Reset(Quelltext, 1);
- IF (IOResult <> 0) OR (Name1 = '') THEN BEGIN
- Fehler(1); Exit;
- END;
- {$I+}
- Laenge1 := FileSize(Quelltext);
- Assign(Zieltext, Name2);
- {$I-}
- Reset(Zieltext, 1);
- IF (IOResult <> 0) OR (Name2 = '') THEN BEGIN
- Fehler(2); Exit;
- END;
- {$I+}
- Laenge2 := FileSize(Zieltext);
- IF ((Laenge1 <= 5 * Faktor) OR
- (Laenge2 <= 5 * Faktor)) THEN BEGIN
- Fehler(3); Exit;
- END;
- IF (Laenge1 > MaxPuffer) OR
- (Laenge2 > MaxPuffer) THEN BEGIN
- Fehler(4); Exit;
- END;
- REPEAT
- BlockRead(Quelltext, Puffer1^, MaxPuffer+1, Resultat);
- UNTIL Resultat = 0;
- REPEAT
- BlockRead(Zieltext, Puffer2^, MaxPuffer+1, Resultat);
- UNTIL Resultat = 0;
- Close(Quelltext);
- Close(Zieltext);
-
- FOR Index := 0 TO 4 DO
- BEGIN
- GotoXY(60, 14); Write(Index+1:1, ' x ', Faktor);
- Portion := Faktor * (Index + 1);
- Treffer := 0; Index1 := 0;
- REPEAT
- FOR Index2 := 0 TO Laenge2 - Portion DO BEGIN
- IF KeyPressed THEN
- IF ReadKey = #27 THEN BEGIN { Abbruch mit <ESC> }
- GotoXY(36, 25);
- Write('Analyse abgebrochen - ' +
- 'weiter mit <ENTER>...');
- ReadLn; Exit;
- END;
- GotoXY(60, 4); Write(Index2:6);
- Innerhalb := TRUE; Index3 := 0;
- REPEAT
- IF Innerhalb THEN
- IF Puffer1^[Index1 + Index3] <>
- Puffer2^[Index2 + Index3] THEN
- Innerhalb := FALSE;
- Inc(Index3);
- UNTIL NOT Innerhalb OR (Index3 = Portion);
- IF Innerhalb AND (Index3 = Portion) THEN BEGIN
- Inc(Treffer);
- Index2 := Laenge2 - Portion;
- END;
- END;
- Index1 := Index1 + Portion;
- GotoXY(60, 5); Write(Index1:6);
- UNTIL (Index1 > Laenge1 - Portion);
- Stand := Round(20 * Treffer / Int(Laenge1 / Portion));
- FOR J := 1 TO Stand DO BEGIN
- GotoXY(14 + 10 * Index, 23 - J); Write(Chr(219));
- END;
- GotoXY(12 + 10 * Index, 24);
- Write(100 * Treffer / Int(Laenge1 / Portion):4:1, '%');
- Summe := Summe + Treffer / (Int(Laenge1 / Portion));
- END;
- GotoXY(60, 18);
- Write(1 - Summe / 5:4:3);
- GotoXY(40, 25);
- Write('Analyse beendet - weiter mit <ENTER>...');
- ReadLn;
- END;
-
- BEGIN { Hauptprogramm }
- New(Puffer1); New(Puffer2);
- TextColor(Blue); TextBackground(White);
- ClrScr; Faktor := 10;
- Name1 := ''; Name2 := '';
- REPEAT
- ClrScr;
- DoppelFenster(8, 4, 62, 6);
- DoppelFenster(12, 6, 58, 14);
- TextColor(Red);
- GotoXY(5, 2); Write('1. Datei = ', Name1);
- GotoXY(5, 3); Write('2. Datei = ', Name2);
- GotoXY(60, 2); Write('Faktor = ', Faktor);
- TextColor(Blue);
- GotoXY(20, 5); Write('K R E U Z K O R R E L A T I O N');
- GotoXY(19, 8); Write(' <1> --> Auswahl der Dateien');
- GotoXY(19, 9); Write(' <2> --> Faktor setzen');
- GotoXY(19, 10); Write(' <3> --> Analyse & Auswertg.');
- GotoXY(19, 11); Write('<ESC> --> ENDE');
- REPEAT
- GotoXY(28, 15); Write('Welches Kommando?');
- Kommando := ReadKey;
- UNTIL Kommando IN ['1', '2', '3', #27];
- CASE Kommando OF
- '1' : Dialog;
- '2' : Parameter;
- '3' : Auswertung;
- #27 : BEGIN
- TextMode(LastMode); ClrScr; Halt;
- END;
- END;
- UNTIL FALSE;
- END.
- (* ------------------------------------------------------ *)
- (* Ende von KREUZ.PAS *)
-