Entwickler-Ecke

Sonstiges (Delphi) - Zahlen Andersrum Ausgeben?


HouseGemacht - Mo 08.11.10 13:41
Titel: Zahlen Andersrum Ausgeben?
Ich habe mal eine Frage: Wie kann man in einem Edit die Zahlen "Falschrum" ausgeben lassen.

Wenn ich also Hallo im Edit eingebe kommt ollaH raus?

Über antworten und Codeschnipzel freue Ich mich sehr.

MfG,
HouseGemacht


Delete - Mo 08.11.10 13:45

Neuere Delphiversioen kennen die Funktion ReverseString.


HouseGemacht - Mo 08.11.10 13:48

Ich Arbeite, Bedingt durch den Betrieb (Praktikum) mit Delphi 7 Enterprise, und nehme an es gehört nicht zu den neuerren versionen!?!


Delete - Mo 08.11.10 13:49

Dann selber schreiben. Mit einer for-Schleife von hinten nach vorne über die Zeichen der Zeichenkette laufen und die Zeichen neu zusammensetzen. Sollte in fünf Minuten programmierbar sein.


HouseGemacht - Mo 08.11.10 13:52

Es soll aber direkt im Edit angezeigt werden.


Nersgatt - Mo 08.11.10 13:59

Und wo genau ist das Problem?


Delete - Mo 08.11.10 14:03


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function ReverseString(s: String): string;
var
  i: Integer;
begin
  SetLength(Result, Length(s));
  Result := '';
  for i := Length(s) downto 1 do
  begin
    Result := Result + s[i];
  end;
end;

Weitere, optimierte Versionen findest du hier: http://www.delphipraxis.net/144590-reversestring-fuer-aeltere-delphi-versionen.html


Hidden - Mo 08.11.10 16:22

user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
SetLength(Result, Length(s));
Result := '';
Lese ich falsch? :P

Auch, sollte Das Argument dringendst als const s: String deklariert werden, auch wenn man nicht speziell auf's Optimieren auf ist. Sonst wird vorher alles noch einmal zwischenkopiert da der Compiler glaubt, es wird schreibend darauf zugegriffen.

Ich glaube, was user profile iconLuckie schreiben wollte, ist:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function ReverseString(const S: String): String;
var
  i: Integer;
  Len: Integer;
begin
  Len := Length(S) + 1;
  SetLength(result, Len - 1);
  for i := Len - 1 downto 1 do
    result[Len - i] := S[i];
end;


E: Oh, das ist gerade die eine optimierte Version^^

lg,


bole - Mo 08.11.10 18:12

Hallo

Wieso rechnest Du Len:=Lenght(S)+1 und nachher bei jedem gebrauch der Variable Len-1.

Kann man das ganze +/- nicht auch weglassen oder hat das einen bestimmten Zweck?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function ReverseString(const S: String): String;
var
  i: Integer;
  Len: Integer;
begin
  Len := Length(S) + 1
  SetLength(result, Len - 1);
  for i := Len - 1 downto 1 do
    result[Len - i] := S[i];
end;


Gruss

Bole


Hidden - Mo 08.11.10 18:24

user profile iconbole hat folgendes geschrieben Zum zitierten Posting springen:
Wieso rechnest Du Len:=Lenght(S)+1 und nachher bei jedem gebrauch der Variable Len-1.

Kann man das ganze +/- nicht auch weglassen oder hat das einen bestimmten Zweck?

Wenn ich das machen würde, könnte man das: Ja :zwinker:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function ReverseString(const S: String): String;
var
  i: Integer;
  Len: Integer;
begin
  Len := Length(S) + 1;        //wird 1x ausgeführt
  SetLength(result, Len - 1);  //wird 1x ausgeführt
  for i := Len - 1             //wird 1x berechnet
    downto 1 do                //wird Length(S) mal überprüft
    result[Len - i] := S[i];   //wird Length(S)x ausgeführt
end;


In der markierten Zeile wird allerdings keine Konstante zu Len addiert, und die wollte ich mit dem +1 möglichst einfach halten, denn sie wird häufig ausgeführt.

Wo ich die 1 addiere bzw. abziehe, ist letzten Endes egal: ja. Was ich hier gemacht habe, ist eine Indexverschiebung [http://de.wikipedia.org/wiki/Indexverschiebung]. Die +1 aus dem Length(S) mal ausgeführten Code habe ich entfernt, dafürmuss sie im 1x ausgeführten Code stehen.

Vielleicht hätte ich die Variable danach nicht mehr Len nennen sollen, das suggeriert sie habe Length(S) eingespeichert.

Grüße,


Tranx - Mo 08.11.10 18:53

Ein programmtechnisch sehr anspruchsvolles Beispiel, weil mit Rekursiven Prozeduren gearbeitet wird, siehst Du im folgenden Beispiel (im Thread weiter unten)

http://www.delphi-forum.de/viewtopic.php?t=102421


Möglicherweise nicht optimiert. Aber das ist bei einer Zahl, welche aus i.d.Regel nur 5 - 10 Zeichen besteht, auch nicht unbendingt notwendig, oder? ;)


Delete - Mo 08.11.10 21:08

user profile iconHidden hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
SetLength(Result, Length(s));
Result := '';
Lese ich falsch? :P

Ich hatte das nur mal schnell in den Editor geklimpert. Und ich hatte das Problem, dass in Result immer Müll drin stand. Mir ist da auf die schnelle keine bessere Lösung eingefallen. Eventuell hätte man mir FillChar arbeiten können.


bole - Mo 08.11.10 21:43

Ich sollte mal meine Brille putzen :shock:

Ich habe erst jetzt gesehen, dass es ja result[Len - i] und nicht result[Len - 1] heisst...

Aber i und 1 sieht ja auch seeeehr ähnlich aus... :)