hey, nun hab ich mich ja lang genug mit dem kmp algo rumgeschlagen das er endlich annähernd vorführbereit ist. jetz gehts an den boyer-moore algo. ich habe mal ein wenig rumprobiert und bin besher so weit gekommen:
Delphi-Quellcode:
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 =
class(TForm)
bt_neu: TButton;
bt_ende: TButton;
Memo1: TMemo;
Label1: TLabel;
ed_suche: TEdit;
Label2: TLabel;
bt_start: TButton;
bt_text: TButton;
Label3: TLabel;
Memo2: TMemo;
procedure bt_endeClick(Sender: TObject);
procedure bt_neuClick(Sender: TObject);
//function BMsearch(Pat, Txt :string) : Longint;
procedure bt_startClick(Sender: TObject);
procedure bt_textClick(Sender: TObject);
// procedure bt_textClick(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.bt_endeClick(Sender: TObject);
begin
close;
end;
procedure TForm1.bt_neuClick(Sender: TObject);
begin
memo1.clear;
memo2.Clear;
ed_suche.clear;
end;
//wort ,text
function BMsearch(Pat, Txt :
string) : Longint;
var Postable:
array[0..255]
of longint;
Patlen : Longint;
//länge des suchstrings
txtlen : Longint;
//gesamte länge text(anzahl der zeichen)
index : longint;
//um das was sich verschiebt
patindex : Longint;
//wort das gesucht wurde
position : longint;
//derzeitige position
b : Byte;
// Zähler das zeichenanzahl nicht überschritten wird
//aus array 255
y : Boolean;
//gesuchtes wort gefunden
x : integer;
begin
if pat = '
'
then
begin
BMsearch := 0;
exit;
end;
x :=0;
// kein wort gefunden da Anfang
Patlen := Length(Pat);
Txtlen := Length(txt);
for b := 0
to 255
do
postable[b] := -1;
for patindex := 1
to Patlen
do
Postable[ord(Pat[Patindex])] := Patindex;
index := 0;
while (patindex > 0)
and (
index <= txtlen - patlen)
do
begin
Patindex := Patlen;
while (Pat[Patindex] = txt[
index + Patindex])
and
(patindex > 0)
do
//gefunden ergibt sich aus true
if (Pat[Patindex] = txt[
index + Patindex])
and (patindex > 0)
then y := true;
if y = true
then x + 1;
begin Dec(Patindex);
if Patindex >0
then
begin
position := Postable[ord(txt[
index + patindex])];
if position = -1
then inc(
index,Patindex)
else if Position > Patindex
then inc (
index,1)
else inc(
index,patindex - Position);
end;
end;
if Patindex =0
then BMsearch :=
index +1
else BMsearch :=0;
end;
end;
procedure TForm1.bt_startClick(Sender: TObject);
var
pat,txt :
string;
begin
BMsearch(Pat, Txt);
// Zugriff auf Schleife
end;
procedure TForm1.bt_textClick(Sender: TObject);
begin
memo1.lines.add
('
hallo, wie geht es dir?');
end;
end.
könntet ihr mal drüberschaun und eventuell meinen fehler finden bzw. mir sagen das selbst der ansatz faltsch ist
?
ich habe soweit eigentlich nur noch ein problem mit der ausgabe. ich weis nicht wie ich die mache.
danke euch
greetz görly
[edit=SirThornberry]code-tags durch delphi-tags ersetzt - Mfg, SirThornberry[/edit]