Autor Beitrag
sennaheu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Sa 26.04.03 21:27 
nachdem ich wieder aus dem kurzurlaub zurück bin 8) will ich noch das programm, dass ich schon letzte woche angefangen habe fertig machen.
habe leider immer noch das selbe problem.
ich will einen text in einem edit wortweise rückwärts ausgeben, den es vorher in einem anderen edit eingelesen hat.
nach anfäglichen problemen, bei denen ausser fehlermeldungen gar nichts ging, hat es nur das erste oder das letzte wort bis zur leerstelle (je nachdem, ob man von hinten oder vorne mit der for-schleife begann) ausgegeben.

weiss jemand eine lösung?
dann wäre nämlich das programm endlich fertig :D

senneheu
Moritz M.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1672



BeitragVerfasst: Sa 26.04.03 22:25 
Ganz einfach.
Du splittest den eingegeben Text nach Leerzeichen in ein Array auf, und gibst das dann rückwärts wieder. Das ganze sollte ca. so ausschaun(Nicht geprüfter Code)
ausblenden volle Höhe 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 SplitToArray(input: string):TStringList;
var i:integer;
      text:string;
begin
  {
  Diese Funktion spltittet einen String in eine TStringList auf.
  Die Einträge trennen sich durch ein Leerzeichen
  }
  result:=TStringList.create;
  text:='';
  for i:=0 to length(input) do
  begin
    if input[i]=' ' then
    begin
      result.add(text);
      text:)'';
    end else
      text:=text+input[i];
end;

function DreheUm(input: string):string;
var i: Integer;
begin
  {
  Diese Funktion dreht einen String, der in eine StringList ist, um
  }
  result:='';
  for i:=SplitToArray(input).count-1 downto 0 do
    result:=result+SplitToArray(input)[i];
end;

procedure Button1.Button1click(Sender: TObject);
begin
  Edit2.text:=DrehUm(Edit1.text);


Wie gesagt, nicht geprüft. Sollte aber Funktionieren.
Wie man es benutzt siehst du an der Button1.Button1Click - Procedur
Terra23
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: Sa 26.04.03 22:26 
Das habe ich dir doch schon geschrieben:

Edit1.Text -> Hallo Welt
---> Edit2.Text -> Welt Hallo

Zwischenspeicher -> Integer;

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
TForm1.Button1Click(Sender)
begin

Edit2.Text:='';

For I:=Length(Edit1.Text) DownTo 1 Do
Begin
If Edit1.Text[I]=' ' ///also Leerzeichen
Then Begin
        Zwischenspeicher:=I; /// I merken, denn da mußt du wieder weitermachen
        I:=I+1;
        Edit2.Text:=Edit2.Text+Edit1.Text[I]
        End;
End;

end;


So oder so ähnlich müßte das gehen. Ich bin jetzt zu müde, daß auszuprobieren, aber das ist ja auch dein Tool. So mußt du irgendwie vorgehen...

_________________
Hasta La Victoria Siempre
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 26.04.03 22:51 
Hi!

So sollte es gehen:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
procedure TForm1.Button1Click(Sender: TObject);
VAR i, leerzeichen : INTEGER;
begin
  edit2.text:='';
  i:=Length(edit1.text);
  while i>0 do
  begin
    while (edit1.text[i] <> ' ') and (i>0) do dec(i);

    leerzeichen:=i;
    inc(i);

    while (edit1.text[i] <> ' ') and (i<=Length(edit1.Text)) do
    begin
      edit2.text:=edit2.text+edit1.text[i];
      inc(i);
    end;

    edit2.text:=edit2.Text+' ';

    i:=leerzeichen-1;
  end;
end;


MfG,
Peter

P.S.: Habe jetzt nicht geguckt, ob Terra23's Code funktioniert. Kann also sein, dass meiner überflüssig ist.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Terra23
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: So 27.04.03 15:01 
@Peter: Überflüssig ist er sicherlich nicht. Ich habe meinen Code auch nur so vom Verständnis her getippt. Kann sein, daß man da noch so einiges verbessern muß, aber irgendwie klappt es sicher. Dein Code scheint mir sogar noch richtiger zu sein als meiner. :-)

_________________
Hasta La Victoria Siempre
Moritz M.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1672



BeitragVerfasst: So 27.04.03 15:59 
Er hat nun 3 Codes...und noch keine Antwort.
Hmmm...
Wir könnten alle 3 mal auf Geschwindigkeit testen. Weiß wer wie man das macht?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 27.04.03 16:30 
Wir könnten in einer Schleife einen String erzeugen, der 100000mal das Wort "Delphi-Forum" hintereinander mit Leerzeichen enthält und dann mal die Zeit nehmen, die der Algorithmus braucht, um den String wortweise umzudrehen.

Ich habe folgenden Algorithmus verwendet:

ausblenden volle Höhe 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:
35:
36:
37:
38:
39:
40:
procedure umdrehen (VAR urstring, neustring : String);
VAR i, leerzeichen : INTEGER;
begin
  neustring:='';
  i:=Length(urstring);
  while i>0 do
  begin
    while (urstring[i] <> ' ') and (i>0) do dec(i);

    leerzeichen:=i;
    inc(i);

    while (urstring[i] <> ' ') and (i<=Length(urstring)) do
    begin
      neustring:=neustring+urstring[i];
      inc(i);
    end;

    neustring:=neustring+' ';

    i:=leerzeichen-1;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
VAR urstring, neustring: String;
  i, anfang, ende : INTEGER;
begin
  urstring:='';
  for i:=0 TO 99998 DO
  urstring:=urstring+'Delphi-Forum ';

  urstring:=urstring+'Delphi-Forum';

  anfang:=GetTickCount;
  umdrehen(urstring,neustring);
  ende:=GetTickCount;

  ShowMessage(IntToStr(ende-anfang));
end;


Wenn ihr Eure Algorithmen so umschreibt, dass sie in meine Funktion umdrehen passen, dann werde ich auch eure Algorithmen testen. Denn sie sollen natürlich alle auf dem selben Rechner getestet werden.

MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Moritz M.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1672



BeitragVerfasst: So 27.04.03 18:39 
Ich hab das ganze mal gemacht: Peters Methode ist knapp schneller als meine, Terra's geht nicht.
Terra23
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: So 27.04.03 21:44 
Das war klar. Man muß ja erstmal überprüfen, wie viele Wörter man hat, anhand der Leerzeichen, denke ich. Das die nicht geht, hätte ich mir denken können, es war ja auch nur so nach dem Motto "im Prinzip". ;-)

Vielleicht hätte ich schreiben sollen:

Keine Angaben ohne Gewehr.. :angel:

_________________
Hasta La Victoria Siempre
Moritz M.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1672



BeitragVerfasst: Mo 28.04.03 13:36 
Ich würde mal sagen, das heißt:
Alle Angaben ohne Gew(ä/e)hr