Delphi - объектно-ориентированный язык программирования, разработанный компанией Borland в 1995 году. Он основан на языке программирования Pascal, но имеет более расширенные возможности и добавлены новые функции.
Delphi является интегрированной средой разработки (IDE), которая позволяет разрабатывать программное обеспечение для различных платформ, включая Windows, macOS, Android и iOS. Delphi достигает многоплатформенности с помощью...
unitUnit1; interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons; type
TForm1 = class
(TForm) Button1: TButton; Memo1: TMemo; Edit1: TEdit; SpeedButton1: TSpeedButton; procedure
SpeedButton1Click(Sender: TObject); private
{ Private-Deklarationen } public
{ Public-Deklarationen } end
; var
Form1: TForm1; // Aus einem alten c't-Heft von C nach Delphi ubersetzt // Deklarationsteil procedure
Ts_init(P: PChar; m: Integer); function
Ts_Search(Text, p: PChar; m: Integer; Start: Longint): Longint; // Globale Variablen // ***************** var
shift: array
[0..255] of
Byte; // Shifttabelle fur Turbosearch Look_At: Integer; // Look_At-Position fur Turbosearch implementation
{$R *.DFM} procedure
Ts_init(P: PChar; m: Integer); var
i: Integer; begin
// *** Suchmuster analysieren **** {1.} for
i := 0 to
255 do
shift[i] := m + 1; {2.} for
i := 0 to
m - 1 do
Shift[Ord(p[i])] := m - i; Look_at := 0; {3.} while
(look_At < m - 1) do
begin
if
(p[m - 1] = p[m - (look_at + 2)]) then
Exit else
Inc(Look_at, 1); end
; // *** Beschreibung **** // 1. Sprungtabelle Shift[0..255] wird mit der max. Sprungweite (Musterlange+1) // initialisiert. // 2. Fur jedes Zeichen im Muster wird seine Position (von hinten gezahlt) in // der Shift-Tabelle eingetragen. // Fur das Muster "Hans" wurden folgende Shiftpositionen ermittelt werde: // Fur H = ASCII-Wert = 72d ,dass von hinten gezahlt an der 4. Stelle ist, // wird Shift[72] := 4 eingetragen. // Fur a = 97d = Shift[97] := 3; // Fur n = 110d = Shift[110] := 2; // Fur s = 115d = Shift[115] := 1; // Da das Muster von Vorn nach Hinten durchsucht wird, sind doppelt auf- // tretende Zeichen kein Problem. Die Shift-Werte werden uberschrieben und // mit der kleinsten Sprungweite automatisch aktualisiert. // 3. Untersucht wo (position von hinten) das Letzte Zeichen im Muster // nochmals vorkommt und Speichert diese in der Variable Look_AT. // Die Maximale Srungweite beim Suchen kann also 2*Musterlange sein wenn // das letzte Zeichen nur einmal im Muster vorhanden ist. end
; function
Ts_Search(Text, p: PChar; m: Integer; Start: Longint): Longint; var
I: Longint; T: PChar; begin
T := Text + Start; // Zeiger auf Startposition im Text setzen Result := -1; repeat
i := m - 1; // Letztes Zeichen des Suchmusters im Text suchen. while
(t[i] <> p[i]) do
t := t + shift[Ord(t[m])]; i := i - 1; // Vergleichszeiger auf vorletztes Zeichen setzen if
i < 0 then
i := 0; // wenn nach nur einem Zeichen gesucht wird, // kann i = -1 werden. // restliche Zeichen des Musters vergleichen while
(t[i] = p[i]) do
begin
if
i = 0 then
Result := t - Text; i := i - 1; end
; // Muster nicht gefunden -> Sprung um max. 2*m if
Result = -1 then
t := t + Look_AT + shift[Ord(t[m + look_at])]; until
Result <> -1; // Repeat end
; // Such-Procedure auslosen (hier beim drucken eines Speedbuttons auf FORM1) procedure
TForm1.SpeedButton1Click(Sender: TObject); var
tt: string
; L: Integer; L2, sp, a: Longint; F: file
; // File-Alias Size: Integer; // Textlange Buffer: PChar; // Text-Memory-Buffer begin
tt := Edit1.Text; // Suchmuster L := Length(TT); // Suchmusterlange ts_init(PChar(TT), L); // Sprungtabelle fur Suchmuster initialisieren try
AssignFile(F, 'test.txt'); Reset(F, 1); // File offnen Size := FileSize(F); // Filegrosse ermitteln GetMem(Buffer, Size + L + 1); // Memory reservieren in der Grosse von // TextFilelange+Musterlange+1 try
BlockRead(F, Buffer^, Size); // Filedaten in den Buffer fullen StrCat(Buffer, PChar(TT)); // Suchmuster ans Ende des Textes anhangen // damit der Suchalgorythmus keine Fileende- // Kontrolle machen muss. // Turbo-Search SP := 0; // Startpunkt der Suche im Text A := 0; // Anzahl-gefunden-Zahler while
SP < Size do
begin
L2 := Ts_Search(Buffer, PChar(TT), L, SP); // L = Musterlange // SP= Startposition im Text SP := L2 + L; // StartPosition auf Letzte gefundene Position+Musterlange Inc(a); // Anzahl gefunden Zahler end
; // Am Schluss nicht vergessen Buffer freigeben und Inputfile schliessen finally
FreeMem(Buffer); // Memory freigeben. end
; finally
CloseFile(F); // Datei schliessen. end
; end
; end
.