Autor Beitrag
Greg1812
Hält's aus hier
Beiträge: 6



BeitragVerfasst: So 04.05.08 13:49 
Hallo miteinander!
Ich habe im Internet, jawohl im Internet findet man so einiges, na jedenfalls habe ich im besagten Internet einen Quelltext gefunden. Dieser Quelltext arbeitet mit einer while-do-schleife und gibt einen beliebigen String, also eine Zeichenkette, unabhängig von Länge und Inhalt wieder rückwärts aus. Ich hab es selber ausprobiert, selbstverständlich funktionert diese Function. Nun, da ich in Delphi noch viel eher der Anfänger bin, habe ich feststellen müssen, dass ich nicht alles in diesem Quelltext verstanden habe. Ist es euch möglich, mir die einzelnen Schritte der while-do-schleife zu erläutern und welche Rolle bei dem Ganzen "cc" vom Character-typ spielt?

Hier der Quelltext:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function ReverseString (InString: string): string;

var
  i,j   : integer;
  cc    : char;

begin
result := InString;
i := 1;
j := length(InString);
while (i < j) do
  begin
  cc := result[i];
  result[i] := result[j];
  result[j] := cc;
  inc (i);
  dec (j);
  end;
end;


Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: So 04.05.08 14:15 
Hi und :welcome: im Delphi-Forum,

Zunächst einmal: benutze am besten Delphi-Tags für deine Beiträge,
ausblenden das macht sie leicht lesbar:
1:
<span class="inlineSyntax"><span class="codecomment">{PROTECTTAG20953dc49f34be5731b5a71e40545a94}</span></span>					


Hier einmal eine kommentierte Version, bei weiteren Fragen markiere einfach mit dem highlight-Tag die entsprechenden Stellen im Quelltext:

Hmm, das ist aber echt kompliziert, so. Ich habs mal abgeändert.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function ReverseString (const S: String): String;  //const verhindert, dass der String extra kopiert werden muss und spart damit Zeit
var
  i, Laenge : integer;
begin
  Laenge := Length(S);  //Länge des Eingangsstrings abspeichern
  result := Copy(S, 1, Laenge);  //String kopieren(dient hier eigentlich nur zum Setzen der Länge des Rückgabestrings)
  i := 1;  //i für Schleifendurchlauf initialisieren
  while i < Laenge do begin  //String durchgehen, bis Laufvariable das Ende des Strings erreicht hat
    result[i] := S[Laenge + 1 - i];  //und das Ende an den Anfang kopieren
    Inc(i);  //Laufvariable um eins erhöhen
  end;
end;


Ansonsten kann ich dir nur den Crashkurs von Christian S. empfehlen, da ist schonmal eine Menge an Wissen gebündelt :D .

mfG,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: So 04.05.08 14:25 
Hallo und :welcome: im Forum!

Der Quellcode, den Du gefunden hast, beruht auf dem Prinzip "Tauschen der entsprechenden Zeichen".
Das erste Zeichen wird mit dem letzten, das zweite mit dem vorletzten usw. vertauscht.
Wie man im Quelltext sieht, nähert er sich der Mitte einmal von links [inc(i) =^ i = i + 1] und einmal von rechts [dec(j) =^ j = j - 1].
Die Hilfsvariable wird bei dieser Variante benötigt, um sich eines der beiden Zeichen zu merken, bevor es überschrieben wird.

Ein String ist übrigens nichts anderes als ein Array of Char, also eine Aneinanderkettung einzelner Zeichen. Daher ist es möglich über den Index in den eckigen Klammern [] auf einzelne Zeichen im String zuzugreifen!


Man hätte es sich allerdings auch sparen können, gibt garantiert effizientere Methoden, aber danach wurde nicht gefragt. ;)

Cheers,
Marc
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: So 04.05.08 14:35 
user profile iconMarc. hat folgendes geschrieben:
Man hätte es sich allerdings auch sparen können, gibt garantiert effizientere Methoden, aber danach wurde nicht gefragt. ;)


Je länger, desto schwerer zu verstehen :wink:

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 04.05.08 19:55 
user profile iconHidden hat folgendes geschrieben:

ausblenden Delphi-Quelltext
1:
result := Copy(S, 1, Laenge);  //String kopieren(dient hier eigentlich nur zum Setzen der Länge des Rückgabestrings)					


Und warum dann nicht gleich: result := length(s)
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: So 04.05.08 19:58 
user profile iconLuckie hat folgendes geschrieben:
Und warum dann nicht gleich: result := length(s)

Du meinst wohl Result := S; ;)

Die Funktion ReverseString gibt's übrigens schon in der StrUtils Unit.
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: So 04.05.08 20:07 
user profile iconLuckie hat folgendes geschrieben:
user profile iconHidden hat folgendes geschrieben:

ausblenden Delphi-Quelltext
1:
result := Copy(S, 1, Laenge);  //String kopieren(dient hier eigentlich nur zum Setzen der Länge des Rückgabestrings)					


Und warum dann nicht gleich: result := length(s)


Was ich überlegt hatte war SetLength(result, Length(S)), aber ich wusste nicht ganz, ob das geht.

mfG,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 04.05.08 20:26 
user profile iconHidden hat folgendes geschrieben:
Was ich überlegt hatte war SetLength(result, Length(S)), aber ich wusste nicht ganz, ob das geht.

Das wäre genau die richtige Funktion gewesen. ;)
Greg1812 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: So 04.05.08 22:45 
Hallo, und vielen Dank! :wink:
Ich werd beim nächsten Mal auf jeden Fall auf die Delphi-tags achten! Mein Fehler...
Also ihr seid super, macht weiter so! Ich habe bloß versucht ein bisschen info-stoff nachzuarbeiten, und bin dabei auf diesen Quelltext gestoßen. Sofort hab ich mir natürlich meine Gedanken dazu gemacht und dann gemerkt, dass ich so es nicht alles nachvollziehen konnte. Die vereinfachte Form meiner im Internet gefundenen Variante ist natürlich deutlich einfacher nachzuvolziehen. Und im Nachhinein ist es mir auch um einiges klarer geworden, welche Zeile für was verantwortlich ist (also von der ursprünglichen Variante)!
Also ich finde ihr leistet hier super Arbeit! :)

Zitat:
Inc(i); //Laufvariable um eins erhöhen
Warum ist es nötig die Laufvariable um eins zu erhöhen?

Ist das ganze nicht noch einfacher mit einer for-to-do-schleife? Ich hab da schon einmal was mit programmiert, hat zwar ein bisschen gedauert bis ich die for-schleife verstanden hatte, aber schließlich sah es doch relativ gut und verständlich aus. Von daher hatte ich versucht es mit FOR i:= 2 TO Length(S) DO usw. , aber es hat nicht geklappt.
Was hat es mit "SetLength(result, Length(S))" auf sich? Wäre das eine "elegantere" Schreibweise?
Dann hab ich noch eine Frage zu einer iterativen und einer rekursiven Lösung eines beliebigen Problems(möglicherweise auch von dieser Function ReverseString?). Zunächst einmal, was bedeuten diese beiden Begriffe? Iterativ so etwas wie "alles kurz und verständlich mit wenigen Zeilen" ? Ich meine da mal so etwas Ähnliches gelesen zu haben..

Nochmals Danke :!:

Greg

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Ich glaube ich hab iterativ und rekursiv verwechselt. Ich weiß es gerade nicht genau :roll:

ausblenden Delphi-Quelltext
1:
function ReverseString (const S: String): String;  //const verhindert, dass der String extra kopiert werden muss und spart damit Zeit					

Das mit der Konstanten ist geschickt, auch wenn es nur ein kleines Programm ist, spart bestimmt ein paar bruchteile einer Sekunde. Ich meine es nicht mit ironischem Hintergedanken :)
Ich bin für jede Hilfe, die ich bis jetzt schon zur Genüge von euch erhalten habe, dankbar.
Bis später!
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Mo 05.05.08 02:18 
user profile iconGreg1812 hat folgendes geschrieben:
Ich habe bloß versucht ein bisschen info-stoff nachzuarbeiten, und bin dabei auf diesen Quelltext gestoßen. Sofort hab ich mir natürlich meine Gedanken dazu gemacht und dann gemerkt, dass ich so es nicht alles nachvollziehen konnte.

Lobenswerte Einstellung... sollten mehr Leute haben.

user profile iconGreg1812 hat folgendes geschrieben:
Ist das ganze nicht noch einfacher mit einer for-to-do-schleife?

Die Variante von user profile iconHidden auf jeden Fall.
Im Original bringt das nix, da der hier von beiden Seiten ran muss. @all: sieht mir nach Bubblesort ohne Vergleichen aus, oder?

user profile iconGreg1812 hat folgendes geschrieben:
Was hat es mit "SetLength(result, Length(S))" auf sich? Wäre das eine "elegantere" Schreibweise?

Eleganter als result := Copy(S, 1, Laenge);  //String kopieren(dient hier eigentlich nur zum Setzen der Länge des Rückgabestrings), ja.
Wenn ich nur die Länge setzen will, ist es besser auch nur das zu tun, und nicht munter durch die Gegend zu kopieren ;)

user profile iconGreg1812 hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
function ReverseString (const S: String): String;  //const verhindert, dass der String extra kopiert werden muss und spart damit Zeit					

Das mit der Konstanten ist geschickt, auch wenn es nur ein kleines Programm ist, spart bestimmt ein paar bruchteile einer Sekunde.

Naja... vielleicht. Hier einfach mal die Delphi-Hilfe lesen (F1 auf const, die Sache mit den Parameter-Übergaben und den (internen) Effekten von var, const, out usw. ist da sehr gut erklärt, wie ich finde.

user profile iconGreg1812 hat folgendes geschrieben:
Dann hab ich noch eine Frage zu einer iterativen und einer rekursiven Lösung eines beliebigen Problems(möglicherweise auch von dieser Function ReverseString?). Zunächst einmal, was bedeuten diese beiden Begriffe? Iterativ so etwas wie "alles kurz und verständlich mit wenigen Zeilen" ? Ich meine da mal so etwas Ähnliches gelesen zu haben..

Falsch gelesen ;)
Iterativ heißt 'eins nach dem anderen', meistens also in einer Schleife. Bei rekursiven Aufrufen ruft sich eine Funktion immer wieder selber auf. Das gleiche wie iterative und rekursive Bildungsvorschriften für Zahlenfolgen in der Mathematik.
Häufiges Beispiel ist die Berechnung der Suche in: Delphi-Forum FAKULTAET.

mfg
Martok

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Greg1812 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 06.05.08 18:34 
Ich hab diese Function mal ausprobiert und in ein kleines Programm eingebaut(werd ich bestimmt mal hier hochladen,später) und habe feststellen müssen, dass die function den string nicht "richtig" ausgibt. Beispielsweise steht im eingangsfeld "Hallo", dann steht im Ausgabefeld nicht "ollah" sondern "ollao" .Folglich kopiert die Function den String zwar, jedoch bleibt der Buchstabe vom Ende des Strings auch bei dem "umgekehrten" String hinten. Der erste Buchstabe vom String im Eingangsfeld geht verkoren.
Wo liegt die Ursache für dieses Problem?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function ReverseString (const S: String): String;  //const verhindert, dass der String extra kopiert werden muss und spart damit Zeit
var
  i, Laenge : integer;
begin
  Laenge := Length(S);  //Länge des Eingangsstrings abspeichern
  result := Copy(S, 1, Laenge);  //String kopieren(dient hier eigentlich nur zum Setzen der Länge des Rückgabestrings)
  i := 1;  //i für Schleifendurchlauf initialisieren
  while i < Laenge do begin  //String durchgehen, bis Laufvariable das Ende des Strings erreicht hat
    result[i] := S[Laenge + 1 - i];  //und das Ende an den Anfang kopieren
    Inc(i);  //Laufvariable um eins erhöhen
  end;
end;


Zitat:
Falsch gelesen :wink:


Danke für die Korrektur :-)

Das mit der Hilfe werd ich mal ausprobieren!
Und danke für das Lob, ich find es einfach interessant und gleichzeitig witzig, was für kleine , und auch große Programme man selber so schreiben kann. :D
Da gibts ja praktisch keine Grenzen. Na gut, bestimmt gibt es die, aber ich hab sie noch lange nicht erreicht :wink:
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Di 06.05.08 19:48 
Hi,

Mit der for-Schleife wollte ich dich nur nicht verwirren, ist natürlich einfacher dann.
ausblenden Eine For-Schleife sieht eigentlich einfach nur so aus:
1:
2:
3:
4:
5:
6:
7:
for i := LowBound to HighBound  //das hier

i := LowBound;  //ist identisch
while i <= HighBound do begin
  DoSomething;
  Inc(i);
end;


Mit der Laufvariable merkst du dir die Position, an der du dich mit dem Umwandeln/Umkopieren befindest. In einer for-Schleife wird i automatisch erhöht, mit while musst du es selbst machen, dafür ist while flexibler(z.B. if... then Inc(i) oder Inc(i, 2), um immer zwei weiter zu gehen).

Der Fehler liegt an einem einfachen Schreibfehler meinerseits, die Schleife steigt zu früh aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function ReverseString (const S: String): String;  //const verhindert, dass der String extra kopiert werden muss und spart damit Zeit
var
  i, Laenge : integer;
begin
  Laenge := Length(S);  //Länge des Eingangsstrings abspeichern
  SetLength(result, Laenge);
  i := 1;  //i für Schleifendurchlauf initialisieren
  while i <= Laenge do begin  //String durchgehen, bis Laufvariable das Ende des Strings erreicht hat
    result[i] := S[Laenge + 1 - i];  //und das Ende an den Anfang kopieren
    Inc(i);  //Laufvariable um eins erhöhen
  end;
end;
ausblenden Und mit einer for-Schleife dann:
1:
2:
3:
4:
5:
6:
7:
8:
9:
function ReverseString (const S: String): String;  //const verhindert, dass der String extra kopiert werden muss und spart damit Zeit
var
  i, Laenge : integer;
begin
  Laenge := Length(S);  //Länge des Eingangsstrings abspeichern
  SetLength(result, Laenge);
  for i := 1 to Laenge do  //String durchgehen, bis Laufvariable das Ende des Strings erreicht hat
    result[i] := S[Laenge + 1 - i];  //und das Ende an den Anfang kopieren
end;


Noch zu dem const: bei Strings macht es einen unter Umständen sehr großen Laufzeitunterschied aus(bei seitenlangen Texten, z.B.). Deshalb ist es besser, es sich dort direkt anzugewöhnen.

mfG,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
Greg1812 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 06.05.08 21:10 
Danke, for-schleifen sind gar nicht so schwer zu verstehen. Und dieser "einfache Schreibfehler" war wirklich sehr banal. Ich selbst hätte auch drauf kommen müssen. Ohne "<=" hört die Laufvariable auf, bevor sie das Ende erreicht hat. Deswegen ist der letzte Buchstabe auch immer an seiner Stelle geblieben. Wie dumm von mir..logisch..

LG


Zuletzt bearbeitet von Greg1812 am Di 06.05.08 22:08, insgesamt 1-mal bearbeitet
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 06.05.08 22:03 
Moin und :welcome: im Forum!

Bitte erstelle für deine 2. Frage ein separates Topic, da die Diskussion mehrerer Fragen in einem Topic für gewöhnlich für Verwirrung und Durcheinander sorgt. Danke. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.