Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - For-schleifen


DeltaEx - Di 29.10.02 17:10
Titel: For-schleifen
Wie verwirkliche ich das in Delphi??

Das ist Java:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
public static boolean isPalindrom(String str) 
  {
    int mid = str.length() / 2;  
    int last = str.length() - 1;

    for (int pos = 0; pos < mid; pos++)
      if (str.charAt(pos) != str.charAt(last - pos)) return false;

    return true;
  }


Code-Tag eingefügt. Marc


Christian S. - Di 29.10.02 17:27

Hi!


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
function isPalindrom (str : STRING);
VAR mid, last,pos : Integer;
begin
  mid:=Trunc(Length(str) /2);
  last:=Trunc(Length(str)-1);

  for pos:=0 TO mid-1 DO
  begin
    if str[pos] <> str[last-pos] then
    begin
      result:=false;
      exit;
    end;
  end;
  result:=true;
end;


So sollte es funktionieren. Delphi schneidet die Nachkommastellen von reellen Zahlen nicht automatisch ab, um sie zu ganzen Zahlen zu machen, daher der Befehl Trunc. Das Verlassen der Funktion nach Zuweisen eines Ergebnisses macht Delphi auch nicht automatisch, dafür das Exit.

MfG,
Peter


DeltaEx - Di 29.10.02 18:50

Es geht leider nicht:-(
Das programm muss vollgendes machen:

Um zu überprüfen, ob ein Wort achsensymmetrisch zu seinem Mittelpunkt aufgebaut ist, vergleicht das Programm den ersten mit dem letzten Buchstaben des Wortes, den zweiten mit dem vorletzten Buchstaben, usw. Falls das Wort eine ungerade Länge hat, muß der mittlere Buchstabe entweder gar nicht oder mit sich selbst verglichen werden.

user defined image
Stimmen alle diese Buchstaben paarweise überein, handelt es sich bei dem Wort um ein Palindrom.


Delete - Di 29.10.02 19:07

Möglicherweise rührt die Nicht-Funktion in dem Fall daher, dass Peter auf die Null reingefallen ist ... Das erste Zeichen in einem String ist aber an Position 1, im Zeichen Null findet man die Länge des Strings.
Demzufolge kann "last" auch als

Quelltext
1:
last:= Length(str)                    

zugewiesen werden.

Trotzdem springt die Funktion raus, weil sie bereits beim ersten Durchlauf den "Fehler" bemerkt. Um beim Beispiel von TOBABOT zu bleiben:

Im Zeichen #0 steht das Char 7 (Länge), und das ist ungleich O, weil

Quelltext
1:
if str[pos] <> str[last-pos] then                    

Wenn man "last" wie o.g. verändert, bleibt´s dabei, weil das Zeichen #7 auch ungleich T ist. :)


DeltaEx - Di 29.10.02 19:11

und was heisst das im klar Text?


Delete - Di 29.10.02 20:35

Ich dachte, das wäre klar?! Zum einen nimmst du die von mir schon gepostete Änderung an der Variablen "last" vor. Zum anderen addierst du Eins im linken Teil der if-Prüfung

Quelltext
1:
if str[pos] <> str[last-pos] then                    

damit du von der Ausgangsposition Null (Schleifenvariable) auf das tatsächlich erste Zeichen im String kommst.

Nach diesen beiden Änderungen besitzt die Funktion das von dir gewünschte Verhalten und erkennt sowohl TOBABOT, als auch OTTO, RENTNER, REITTIER und RELIEFPFEILER als gültig.

Irgendwas sagt mir, dass die Java-Funktion nicht von dir stammt. Ist nicht böse gemeint, aber wenn du sie geschrieben hättest, wüsstest du (bei deinem Wahlspruch "Delphi forever") auch die passende Umsetzung. :)


DeltaEx - Di 29.10.02 21:42

So hier die Code die Funktioniert:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
function isPalindrom (str : String): Boolean;
VAR mid, last,pos : Integer;
begin
  mid:=Trunc(Length(str) /2);
  last:=Length(str);
 for pos:=1 TO mid DO
  begin
    if str[pos] <> str[last-pos+1] then
    begin
      result:=false;
      exit;
    end;
  end;
  result:=true;
end;


Danke für die Hilfe das Board ist das beste Delphiboard:-)