Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Texte auf Ähnlichkeit vergleichen (https://www.delphipraxis.net/4616-texte-auf-aehnlichkeit-vergleichen.html)

Stanlay Hanks 6. Mai 2003 16:15


Texte auf Ähnlichkeit vergleichen
 
Hallo zusammen. Ich hab mir hier eine Funktion geschrieben, die, wenn zwei texte ungefähr gleich sind, true zurückgibt. Aber irgendwo hab ich einen Fehler:

Delphi-Quellcode:
function TSuchenForm.FehlerToleranz(FehlerStr, VergleichStr: String;
  Toleranzwert: Integer): Boolean;
var j, fehler: Integer;
begin
For j := 0 to Length(FehlerStr) do begin
 IF FehlerStr[j] <> VergleichStr[j] THEN //Hier wird jeder der Zeichen der zwei texte verglichen
    fehler := fehler +1;
end;
IF Fehler <= ((Toleranzwert / 100) * Fehler) THEN //Wahrscheinlich hab ich hier einen Fehler gemacht, beim ausrechnen des Prozentsatzes
FehlerToleranz := true;
end;
Danke. Man liest sich. Stanlay 8)

Daniel B 6. Mai 2003 16:18

Hallo,

lass Deine Schleife besser bei 1 beginnen, anstatt bei 0.
Ausserdem wäre es das nächste mal Sinnvoller auch zu sagen was denn genau nicht geht.

Grüsse, Daniel :hi:

sakura 6. Mai 2003 16:21

Wenn Du ein Delphi3000 Abo hast, schau Dir mal den Artikel an: http://www.delphi3000.com/articles/article_2240.asp

Ansonsten suche mal im Internet nach: "Damerau-Levenshtein-Metric for string comparsion". Ist zwar nicht Deine Lösung, aber eine der besten für Dein Ziel.

...:cat:...

Stanlay Hanks 6. Mai 2003 16:23

Hallo Daniel. Erstmal Danke für die Hilfe. Ich dachte, dass das Text[] Ding nullbasiert ist. Aber leider geht es dehalb auch noch nicht. Zu deiner Anmerkung: Alles geht nicht. Er kompiliert und dann passiert: Nichts. Gar nix: Ich hab die Funktion so aufgerufen:

Delphi-Quellcode:
IF FehlerToleranz(Edit6.Text,Edit7.Text,50) = true THEN
ShowMessage('Akzeptabel');
Aber wahrscheinlich hab ich zuviele Fehler gemacht (Sowhl in der Funktion als auch im Aufruf).

Man liest sich. Stanlay :cry:

Daniel B 6. Mai 2003 16:31

Hallo,
Zitat:

Zitat von Stanlay Hanks
Hallo Daniel. Erstmal Danke für die Hilfe. Ich dachte, dass das Text[] Ding nullbasiert ist.

Nun, eigentlich lässt man Schleifen von 0 to Length() -1, oder 1 to Length() laufen.
Zitat:

Aber leider geht es dehalb auch noch nicht. Zu deiner Anmerkung: Alles geht nicht. Er kompiliert und dann passiert: Nichts. Gar nix: Ich hab die Funktion so aufgerufen:
Delphi-Quellcode:
IF FehlerToleranz(Edit6.Text,Edit7.Text,50) = true THEN
ShowMessage('Akzeptabel');
Aber wahrscheinlich hab ich zuviele Fehler gemacht (Sowhl in der Funktion als auch im Aufruf).
Nun, der Wert müsste dann kleiner 25 sein, der Formel und dem Aufruf sein, die Frage ist, was steht in dem einen und was in dem anderen Edit?!
Kleiner Tip noch, wenn Du schon auf True abfrägst:
Delphi-Quellcode:
IF FehlerToleranz(Edit6.Text, Edit7.Text, 50) THEN
ShowMessage('Akzeptabel');
Reicht auch schon.
Versuch aml folgendes, um sicher zu sein das die Funktion überhaupt funktioniert:
Nimm den Toleranzwert raus, auch aus dem Aufruf, schreib in einem Edit Hans und im anderen Wurst rein, oder sonst was. Und schau einfach ob Du jemals überhaupt ein Ergebniss von der Funktion bekommst, es reicht ja wenn Du es durchDebuggst, siehst eh besser was los ist, anstatt immer auf ne blöde Message zu warten die nie kommt. ;)

Grüsse, Daniel :hi:

Stanlay Hanks 6. Mai 2003 16:34

Das mit dem Probieren ist wohl wahr. Danke erst mal, für deine Schnelle Hilfe. Ich muss das jetzt erst mal "verarbeiten". Wenns nicht geht schreib ich halt einfach noch mal was nicht geht.

Danke. Stanlay :D

Stanlay Hanks 6. Mai 2003 16:43

Ich hab aus obiger Funktion, wie du gesagt hast, den Tolreanzwert rausgenommen und, zur Kontrolle, festgelegt, dass am Ende der Funktion die Fehleranzahl in die Titelleiste geschrieben wird. Und da steht dann
4438752 :shock: Und das obwohl im einen Edit Edit6 und im anderen Edit7 steht. also genau ein Zeichen unterschied. Wie kann das gehen???

Basic-Master 6. Mai 2003 16:48

hmm versuch mal statt / div zu nehmen...

Stanlay Hanks 6. Mai 2003 16:54

Wie gesagt. ich hab aus obiger funkion den Toleranzwert rausgenommen. Hab also nix mehr zum teilen.

Daniel B 6. Mai 2003 17:06

Hallo,

hier ist mal ein bisschen Code der Sicherlich funktioniert.
Nimm einfach zwei Edits und ein Button.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  iFor, iFehler: integer;
begin
  iFehler := 0;
  for iFor := 0 to Length(Edit1.Text) do
  begin
    if Edit1.Text[iFor] <> Edit2.Text[iFor] then
      Inc(iFehler);
  end;
  ShowMessage(IntToStr(iFehler));
end;
Das ganze basiert natürlich da drauf, das die Länge der Texte in den Edits, absolut gleich ist, daher Vermute ich die utopische Zahl von oben, das Du im zweiten Edit warscheinlich ein kürzeres Wort hast.

Grüsse, Daniel :hi:


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:09 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz