Autor Beitrag
Ballpower
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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.

ausblenden volle Höhe Delphi-Quelltext
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) +1or (i <> length(kleinwort2) +1do
          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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8549
Erhaltene Danke: 478

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 04.01.07 15:50 
Hallo und :welcome: in der Entwickler-Ecke!
Funktioniert if AnsiLowerCase(wort1) < AnsiLowerCase(wort2) then ... in Delphi3 noch nicht?

_________________
We are, we were and will not be.
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 657


Delphi 3 Prof., Delphi 2005 PE
BeitragVerfasst: Do 04.01.07 16:24 
user profile iconBallpower 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Do 04.01.07 16:26 
Man könnte das vermutlich auch so schreiben:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 127

Windows XP Pro SP2
Delphi 7 Professional
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8549
Erhaltene Danke: 478

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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. :D

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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Do 04.01.07 16:41 
user profile iconBallpower 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.

user profile iconGausi 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 :mrgreen:

Außerdem hinkt dein Vergleich gewaltig: Jacke kommt nämlich nach Hose und Apfel ist gleich Apfel :mrgreen:.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Ballpower Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8549
Erhaltene Danke: 478

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 04.01.07 16:49 
Titel: Re: DANKE!
Eine Kleine Optimierung:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: Do 04.01.07 16:50 
user profile iconGausi 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8549
Erhaltene Danke: 478

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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. :gruebel: 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.