home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 06 / praxis / kreuz.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-05-03  |  6.7 KB  |  221 lines

  1. (* ------------------------------------------------------ *)
  2. (*                      KREUZ.PAS                         *)
  3. (*              Kreuzvergleich zweier Dateien             *)
  4. (*                 Turbo Pascal ab 5.0                    *)
  5. (*          (c) 1991 Lothar Wenzel & TOOLBOX              *)
  6. (* ------------------------------------------------------ *)
  7. {$A+,B-,D-,E-,F-,I-,L-,N-,O-,R-,S-,V-}            { Speed! }
  8. {$M 1024,132000,132000}                 { Heap reservieren }
  9.  
  10. PROGRAM Kreuz;
  11.  
  12. USES Crt;
  13. CONST
  14.   MaxPuffer  = 65534;                        { Puffergröße }
  15. TYPE
  16.   Datei      = FILE;
  17.   PufferType = ARRAY[0..MaxPuffer] OF BYTE;
  18. VAR
  19.   Resultat          : WORD;       { Resultat für BlockRead }
  20.   Summe             : REAL;
  21.   Portion, Faktor,
  22.   Laenge1, Laenge2  : LONGINT;    { Länge der Quelldateien }
  23.   Quelltext,
  24.   Zieltext          : Datei;             { 1. und 2. Datei }
  25.   Index, Index1,
  26.   Index2, Index3,
  27.   Treffer           : LONGINT;
  28.   Name1, Name2      : STRING[12];             { Dateinamen }
  29.   Kommando          : CHAR;
  30.   Innerhalb         : BOOLEAN;
  31.   Puffer1, Puffer2  : ^PufferType;
  32.  
  33. PROCEDURE DoppelFenster(x1, y1, x2, y2 : INTEGER);
  34. CONST                  { zeichnet den doppelten Menürahmen }
  35.   M1 = $C9; M2 = $CD; M3= $BB; M4 = $BA; M5 = $BC; M6 = $C8;
  36. VAR
  37.   I, J : INTEGER;
  38. BEGIN
  39.   GotoXY(x1, y1); Write(Chr(M1));
  40.   GotoXY(x2, y1); Write(Chr(M3));
  41.   GotoXY(x2, y2); Write(Chr(M5));
  42.   GotoXY(x1, y2); Write(Chr(M6));
  43.   FOR I := y1 + 1 TO y2 - 1 DO BEGIN
  44.     GotoXY(x1, I); Write(Chr(M4));
  45.     GotoXY(x2, I); Write(Chr(M4));
  46.   END;
  47.   FOR J := x1 + 1 TO x2 - 1 DO BEGIN
  48.     GotoXY(J, y1); Write(Chr(M2));
  49.     GotoXY(J, y2); Write(Chr(M2));
  50.   END;
  51. END;
  52.  
  53. PROCEDURE Fehler(Nummer : INTEGER);     { Fehlerauswertung }
  54. BEGIN
  55.   ClrScr;
  56.   CASE Nummer OF
  57.     1 : WriteLn('1. Quelldatei ', Name1,
  58.                 ' ist nicht vorhanden!');
  59.     2 : WriteLn('2. Quelldatei ', Name2,
  60.                 ' ist nicht vorhanden!');
  61.     3 : WriteLn('Faktor ist zu groß!');
  62.     4 : WriteLn('Datei(en) zu groß für Vergleich!');
  63.   END;
  64.   ReadLn;
  65. END;
  66.  
  67. PROCEDURE Dialog;                     { Eingabe Dateinamen }
  68. BEGIN
  69.    ClrScr;
  70.    Write('Geben Sie den Dateinamen Nr. 1 ein   --> ');
  71.    ReadLn(Name1);
  72.    Write('Geben Sie den Dateinamen Nr. 2 ein   --> ');
  73.    ReadLn(Name2);
  74. END;
  75.  
  76. PROCEDURE Parameter;                   { Eingabe Parameter }
  77. BEGIN
  78.   ClrScr;
  79.   GotoXY(10, 5); Write('Alter Parameter: ', Faktor);
  80.   GotoXY(10, 6); Write('Neuer Parameter: ');
  81.   ReadLn(Faktor);
  82. END;
  83.  
  84. PROCEDURE Auswertung;                     { Kreuzvergleich }
  85. VAR
  86.   Stand, J :  INTEGER;
  87. BEGIN
  88.   ClrScr;
  89.   GotoXY(19, 1);
  90.   Write('K R E U Z K O R R E L A T I O N');
  91.   GotoXY(60, 2);  Write('Stand: ');
  92.   GotoXY(60, 7);  Write('Dateien:');
  93.   GotoXY(60, 9);  Write('1. ', Name1);
  94.   GotoXY(60, 10); Write('2. ', Name2);
  95.   GotoXY(60, 12); Write('Länge:');
  96.   GotoXY(60, 16); Write('Abstand:');
  97.   FOR J := 0 TO 10 DO BEGIN
  98.     FOR Index:=0 TO 4 DO BEGIN
  99.       GotoXY(9 + 10 * Index, 23 - 2 * J); Write(10 * J:3);
  100.     END;
  101.   END;
  102.   FOR Index := 0 TO 4 DO
  103.     DoppelFenster(13 + 10 * Index, 2, 15 + 10 * Index, 23);
  104.   GotoXY(2, 3);
  105.   Write('%');
  106.   Summe := 0;
  107.   Assign(Quelltext, Name1);
  108.   {$I-}
  109.   Reset(Quelltext, 1);
  110.   IF (IOResult <> 0) OR (Name1 = '') THEN BEGIN
  111.     Fehler(1); Exit;
  112.   END;
  113.   {$I+}
  114.   Laenge1 := FileSize(Quelltext);
  115.   Assign(Zieltext, Name2);
  116.   {$I-}
  117.   Reset(Zieltext, 1);
  118.   IF (IOResult <> 0) OR (Name2 = '') THEN BEGIN
  119.     Fehler(2); Exit;
  120.   END;
  121.   {$I+}
  122.   Laenge2 := FileSize(Zieltext);
  123.   IF ((Laenge1 <= 5 * Faktor) OR
  124.       (Laenge2 <= 5 * Faktor)) THEN BEGIN
  125.     Fehler(3); Exit;
  126.   END;
  127.   IF (Laenge1 > MaxPuffer) OR
  128.      (Laenge2 > MaxPuffer) THEN BEGIN
  129.     Fehler(4); Exit;
  130.   END;
  131.   REPEAT
  132.     BlockRead(Quelltext, Puffer1^, MaxPuffer+1, Resultat);
  133.   UNTIL Resultat = 0;
  134.   REPEAT
  135.     BlockRead(Zieltext, Puffer2^, MaxPuffer+1, Resultat);
  136.   UNTIL Resultat = 0;
  137.   Close(Quelltext);
  138.   Close(Zieltext);
  139.  
  140.   FOR Index := 0 TO 4 DO
  141.   BEGIN
  142.     GotoXY(60, 14); Write(Index+1:1, ' x ', Faktor);
  143.     Portion := Faktor * (Index + 1);
  144.     Treffer := 0; Index1 := 0;
  145.     REPEAT
  146.       FOR Index2 := 0 TO Laenge2 - Portion DO BEGIN
  147.         IF KeyPressed THEN
  148.           IF ReadKey = #27 THEN BEGIN  { Abbruch mit <ESC> }
  149.             GotoXY(36, 25);
  150.             Write('Analyse abgebrochen - ' +
  151.                   'weiter mit <ENTER>...');
  152.             ReadLn; Exit;
  153.           END;
  154.         GotoXY(60, 4); Write(Index2:6);
  155.         Innerhalb := TRUE; Index3 := 0;
  156.         REPEAT
  157.           IF Innerhalb THEN
  158.             IF Puffer1^[Index1 + Index3] <>
  159.                Puffer2^[Index2 + Index3] THEN
  160.               Innerhalb := FALSE;
  161.           Inc(Index3);
  162.         UNTIL NOT Innerhalb OR (Index3 = Portion);
  163.         IF Innerhalb AND (Index3 = Portion) THEN BEGIN
  164.           Inc(Treffer);
  165.           Index2 := Laenge2 - Portion;
  166.         END;
  167.       END;
  168.       Index1 := Index1 + Portion;
  169.       GotoXY(60, 5); Write(Index1:6);
  170.     UNTIL (Index1 > Laenge1 - Portion);
  171.     Stand := Round(20 * Treffer / Int(Laenge1 / Portion));
  172.     FOR J := 1 TO Stand DO BEGIN
  173.       GotoXY(14 + 10 * Index, 23 - J); Write(Chr(219));
  174.     END;
  175.     GotoXY(12 + 10 * Index, 24);
  176.     Write(100 * Treffer / Int(Laenge1 / Portion):4:1, '%');
  177.     Summe := Summe + Treffer / (Int(Laenge1 / Portion));
  178.   END;
  179.   GotoXY(60, 18);
  180.   Write(1 - Summe / 5:4:3);
  181.   GotoXY(40, 25);
  182.   Write('Analyse beendet - weiter mit <ENTER>...');
  183.   ReadLn;
  184. END;
  185.  
  186. BEGIN                                      { Hauptprogramm }
  187.   New(Puffer1); New(Puffer2);
  188.   TextColor(Blue); TextBackground(White);
  189.   ClrScr; Faktor := 10;
  190.   Name1 := ''; Name2 := '';
  191.   REPEAT
  192.     ClrScr;
  193.     DoppelFenster(8, 4, 62, 6);
  194.     DoppelFenster(12, 6, 58, 14);
  195.     TextColor(Red);
  196.     GotoXY(5, 2); Write('1. Datei = ', Name1);
  197.     GotoXY(5, 3); Write('2. Datei = ', Name2);
  198.     GotoXY(60, 2); Write('Faktor = ', Faktor);
  199.     TextColor(Blue);
  200.     GotoXY(20, 5); Write('K R E U Z K O R R E L A T I O N');
  201.     GotoXY(19, 8); Write('  <1> -->  Auswahl der Dateien');
  202.     GotoXY(19, 9); Write('  <2> -->  Faktor setzen');
  203.     GotoXY(19, 10); Write('  <3> -->  Analyse & Auswertg.');
  204.     GotoXY(19, 11); Write('<ESC> -->  ENDE');
  205.     REPEAT
  206.       GotoXY(28, 15); Write('Welches Kommando?');
  207.       Kommando := ReadKey;
  208.     UNTIL Kommando IN ['1', '2', '3', #27];
  209.     CASE Kommando OF
  210.       '1' : Dialog;
  211.       '2' : Parameter;
  212.       '3' : Auswertung;
  213.       #27 : BEGIN
  214.               TextMode(LastMode); ClrScr; Halt;
  215.             END;
  216.     END;
  217.   UNTIL FALSE;
  218. END.
  219. (* ------------------------------------------------------ *)
  220. (*                  Ende von KREUZ.PAS                    *)
  221.