Autor |
Beitrag |
Ballpower
Hält's aus hier
Beiträge: 5
|
Verfasst: Do 04.01.07 15:47
Hallo, ich brauche eine Funktion vom Typ boolean mit den beiden String-Parametern wort1 und wort2, die als Ergebnis true zurückgibt, wenn wort1 alphabetisch vor wort2 kommt, oder die beiden Wörter gleich sind. Wenn wort2 alphabetisch vor wort1 kommt, muss die Funktion false zurückgeben. wort1 und wort2 wird in der Funktion in Kleinbuchstaben mittels AnsiLowerCase() umgewandelt, weil das keine Rolle spielen soll. Ich habe auch schon eine solche Funktion entworfen, doch sie funktioniert nicht wie gewollt, da sie beim Vergleichen des 2. Buchstaben den 1. außer Acht lässt.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| function TMain.reihenfolge_richtig(wort1,wort2:String):boolean; var i:integer; kleinwort1,kleinwort2 :String; begin result := true; i:=1; kleinwort1 := AnsiLowerCase(wort1); kleinwort2 := AnsiLowerCase(wort2); if kleinwort1 <> kleinwort2 Then begin while (i <> length(kleinwort1) +1) or (i <> length(kleinwort2) +1) do begin if ord(kleinwort1[i]) = ord(kleinwort2[i]) Then begin i := i + 1; end else if ord(kleinwort1[i]) < ord(kleinwort2[i]) Then begin result := true; break; end else if ord(kleinwort1[i]) > ord(kleinwort2[i]) Then begin result := false; break; end; end; end else begin result := true; end;
end; |
Es wäre nett, wenn mir jemand helfen könnte. Die Lösung braucht nicht schnell, sondern nur einfach zu verstehen zu sein, damit ich als Anfänger da Durchblick finde. Und er sollte wenn möglich mit Delphi 3 funktionieren, damit aus mir kein Raubkopierer wird  .
Danke schonmal!
|
|
Gausi
      
Beiträge: 8549
Erhaltene Danke: 478
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Do 04.01.07 15:50
Hallo und  in der Entwickler-Ecke!
Funktioniert if AnsiLowerCase(wort1) < AnsiLowerCase(wort2) then ... in Delphi3 noch nicht?
_________________ We are, we were and will not be.
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Do 04.01.07 16:06
Hallo,
oder schau Dir mal CompareText in der Delphi-Hilfe an.
Die Funktion CompareText vergleicht zwei Strings ohne Berücksichtigung der Groß-/Kleinschreibung.
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Ballpower 
Hält's aus hier
Beiträge: 5
|
Verfasst: Do 04.01.07 16:17
Titel: if AnsiLowerCase(wort1) < AnsiLowerCase(wort2) then
Doch, es funktoniert schon, aber die gesammte Funktion nicht. Das mit compare Text mache ich sofort. Danke schonmal 
|
|
Miri
      
Beiträge: 657
Delphi 3 Prof., Delphi 2005 PE
|
Verfasst: Do 04.01.07 16:24
Ballpower hat folgendes geschrieben: | Doch, es funktoniert schon, aber die gesammte Funktion nicht. |
schätzungsweise nicht richtig gelesen, würd ich mal sagen
Gausi's Vorschlag ersetzt deine Funktion nahezu komplett, da er gleich die ganzen Worte vergleicht, nicht wie du einzelne Buchstaben! Du brauchst also eigentlich nur die eine if-Bedingung und legst abhängig davon dein Ergebnis fest.
_________________ Anonymes Eckenkind
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Do 04.01.07 16:26
Man könnte das vermutlich auch so schreiben:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| function IsSorted(Word1, Word2: String): Boolean; var X: Integer; begin X := 1;
Word1 := AnsiLowerCase(Word1); Word2 := AnsiLowerCase(Word2);
while (Word1[X] = Word2[X]) AND (X <= Length(Word1)) AND (X <= Length(Word2)) do inc(X);
Result := Ord(Word1[X]) <= Ord(Word2[X]); end; |
Ungetestet.
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Zuletzt bearbeitet von GTA-Place am Do 04.01.07 16:29, insgesamt 1-mal bearbeitet
|
|
Jailbird
      
Beiträge: 127
Windows XP Pro SP2
Delphi 7 Professional
|
Verfasst: Do 04.01.07 16:28
@GTA-Place...Spontan gesagt würde ich erst den Längen-Check machen und erst danach die Buchstaben am Index vergleichen. Aber wahrscheinlich stellt der Optimizer sowas intern sogar um
_________________ Jailbird
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Do 04.01.07 16:30
Joa, aber nachdem scheinbar das von Gausi auch funktioniert, hat sich das sowieso erledigt. Aber BTW: Habs getestet, meines würde auch funktionieren
EDIT: Bei Gausi fehlt aber noch das Gleichheitszeichen:
Delphi-Quelltext 1:
| if AnsiLowerCase('Apfel') <= AnsiLowerCase('Apfel') then |
Er will ja, dass auch True rauskommt, wenn die Wörter gleich sind.
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
Gausi
      
Beiträge: 8549
Erhaltene Danke: 478
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Do 04.01.07 16:38
Ob jetzt Apfel vor Apfel kommt, oder Apfel vor Apfel - das ist Jacke wie Hose, würde ich sagen. Wenn man nach dem Test auf richtige Reihenfolge aber eine Vertauschung vornehmen möchte, ist es natürlich sinnvoll zu sagen, dass Apfel Apfel richtig sortiert ist. Sonst bringt man die Obstkiste ja unnötig durcheinander.
btw: CompareText macht genau das, was ich gepostet habe - erst ein Lowercase beider Worte (oder wars Uppercase?) und dann den Vergleich.
_________________ We are, we were and will not be.
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Do 04.01.07 16:41
Ballpower hat folgendes geschrieben: | Hallo, ich brauche eine Funktion vom Typ boolean mit den beiden String-Parametern wort1 und wort2, die als Ergebnis true zurückgibt, wenn wort1 alphabetisch vor wort2 kommt, oder die beiden Wörter gleich sind. Wenn wort2 alphabetisch vor wort1 kommt, muss die Funktion false zurückgeben. |
Gausi hat folgendes geschrieben: | Ob jetzt Apfel vor Apfel kommt, oder Apfel vor Apfel - das ist Jacke wie Hose, würde ich sagen. |
Ist es nicht - zumindest sieht das Threadersteller anders
Außerdem hinkt dein Vergleich gewaltig: Jacke kommt nämlich nach Hose und Apfel ist gleich Apfel  .
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
Ballpower 
Hält's aus hier
Beiträge: 5
|
Verfasst: Do 04.01.07 16:43
Titel: DANKE!
Es war tatsächlich das, was ich brauche, danke. Falls jemand nach mir kommt und ähnliches sucht, hier der Code:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function TMain.reihenfolge_richtig(wort1,wort2:String):boolean; begin result := true; if CompareText(wort1,wort2) <= 0 Then begin result := true; end else if CompareText(wort1,wort2) > 0 Then begin result := false; end; end; |
Einfacher, als ich es mir ertäumen konnte, danke!
|
|
Gausi
      
Beiträge: 8549
Erhaltene Danke: 478
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Do 04.01.07 16:49
Titel: Re: DANKE!
Eine Kleine Optimierung:
Delphi-Quelltext 1: 2: 3: 4:
| function TMain.reihenfolge_richtig(wort1,wort2:String):boolean; begin result := AnsiCompareText(wort1,wort2) <= 0; end; |
Das mit dem Ansi ist bei Umlauten wie ÄÖÜ wichtig.
_________________ We are, we were and will not be.
|
|
IngoD7
      
Beiträge: 629
D7
|
Verfasst: Do 04.01.07 16:50
Gausi hat folgendes geschrieben: | btw: CompareText macht genau das, was ich gepostet habe - erst ein Lowercase beider Worte (oder wars Uppercase?) und dann den Vergleich. |
Auch wenn's nicht wirklich wichtig ist, aber wenn ich das richtig durchblicke, vergleicht CompareText Zeichen für Zeichen und subtrahiert dabei jeweils einzelnd 32 vom ASCII-Code, wenn es sich um Kleinbuchstaben handelt.
Aber was vielleicht entscheidender ist:
Wenn schon gleich anfangs von AnsiUpperCase und dergleichen die Rede war, dann sollte man jetzt auch möglichst AnsiCompareText nehmen.
//Nachtrag: Ein Hoch auf die Postingüberschneidungen.
//2. Nachtrag: Groß- und Kleinbuchstaben verwechselt. Jetzt ist richtig.
|
|
Gausi
      
Beiträge: 8549
Erhaltene Danke: 478
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Do 04.01.07 17:02
Hmm. Irgendwo hab ich mal so ein CompareText-Ding gesehen. Hab grade bei TurboDelphi nochmal reingeguckt - da wars nicht.  Da geht das über Funktionen aus der kernel32.dll. Wie MS das implementiert hat, weiß ich allerdings wirklich nicht.
Egal - wieder was gelernt, bzw. ein Irrglaube weniger.
_________________ We are, we were and will not be.
|
|
|