![]() |
Delphi-Version: 5
Sortieralgorithmen
hallo leute,
ja ich weiß die schon wieder :-) heute muss ich eine funktion schreiben, die das vergleichen von 2 zeilen ersetzen soll (wenn ihr euch noch an den bubblesort von freitag erinnert)
Delphi-Quellcode:
wenn ihr es euch mal ansehen könntet... über einen tipp würde ich mich freuen!
unit sortieren;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; procedure Button1Click(Sender: TObject); private function Sort(ASrcA, ASrcD: String): Integer; function CharToInt(AValue: Char): Integer; { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; CharTable: array[0..25] of Char = ('A','B', 'C', 'D', 'E', 'F', 'G', 'H', 'I','J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'); implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i, j : Integer; //Position Buffer: String; //speicher begin for j := 0 to Memo1.lines.count -2 do begin for i := j+1 to Memo1.Lines.Count -1 do begin if Memo1.Lines[j] > Memo1.lines[i] then //soll mit funktion Sort ausgetauschen werden begin Buffer := Memo1.lines[j]; Memo1.Lines[j] := Memo1.Lines[i]; Memo1.Lines[i] := Buffer; end; end; end; end; function TForm1.CharToInt(AValue: Char): Integer; var i : Integer; begin Result := -1; for i := 1 to length(CharTable) do begin if CharTable[i] = AValue then begin Result := i; Break; end; end; end; function TForm1.Sort(ASrcA, ASrcD: String): Integer; // komme ab hier nicht weiter var i: Integer; s: String; begin Result := -1; for i := 1 to Length(CharTable) do end; end. |
AW: funktion erstellen... weiß nicht weiter
Hier kommt der Tipp *Trommelwirbel*:
![]() Schau Dir im Besonderen einmal die Rückgabewerte an. |
AW: funktion erstellen... weiß nicht weiter
theoretisch versteh ich es.... aber praktisch ist so eine Sache... ich probier mal rum.
|
AW: funktion erstellen... weiß nicht weiter
Wenn es nur um das Vergleichen geht, würde ich die Funktion Compare nennen. Im ButtonClick könnte das dann später so aussehen:
Delphi-Quellcode:
for j := 0 to Memo1.lines.count -2 do
begin for i := j+1 to Memo1.Lines.Count -1 do begin if Compare(Memo1.Lines[j], Memo1.Lines[i]) > 0 then |
AW: funktion erstellen... weiß nicht weiter
ich soll ja eine funktion erstellen die alle werte auf einmal vergleicht.
|
AW: funktion erstellen... weiß nicht weiter
Das macht keinen Sinn. Oder soll die Funktion auch gleich das Tauschen und somit die komplette eigentliche Sortierung übernehmen?
|
AW: funktion erstellen... weiß nicht weiter
nein eigentlich nur das vergleichen ich denke dass mein ausbilder mir bloß die funktionen näher bringen will.
|
AW: funktion erstellen... weiß nicht weiter
Dann erklär doch einmal, was genau Deine Funktion vergleichen und vor allem, was sie zurückgeben soll (Minimum, Maximum oder was?).
|
AW: funktion erstellen... weiß nicht weiter
also sie soll eben alle werte in einem Wort vergleichen und das Höchste auf eine Stelle höhersetzen... aber das soll ja im endeffekt nicht mit in die funktion. die funktion soll eben nur jeden einzelnen buchstaben eines worten mit den einzelnen buchstaben vom zweiten wort usw. vergleichen
|
AW: funktion erstellen... weiß nicht weiter
Einen String kannst Du wie ein Array durchlaufen, um die einzelnen Buchstaben zu ermitteln. Und den ASCII-Code eines Buchstaben erhältst Du mit
![]() |
AW: funktion erstellen... weiß nicht weiter
also ich habe es jetzt so gemacht. wobei ich allerdings nicht weiß ob "sort" richtig ist aber das kläre ich gleich.
jetzt will ich ja in meiner procedure die eine Zeile mit Sort austauschen. aber wie mach ich das? der meckert immer!
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i, j : Integer; //Position Buffer: String; begin for j:=0 to Memo1.Lines.count -2 do begin for i:=j +1 to Memo1.Lines.Count -1 do begin if Memo1.Lines[j] > Memo1.Lines[i] then //tauschen mit funkction Sort begin Buffer:= Memo1.Lines[j]; Memo1.Lines[j]:= Memo1.Lines[i]; Memo1.Lines[i]:= Buffer; end; end; end; end; function TForm1.CharToInt(AValue: String): Integer; var i: Integer; begin Result := -1; for i := 1 to Length(CharTable) do begin if AValue = Chartable[i] then begin Result := i; Break; end; end; end; function TForm1.Sort(ASrcA, ASrcD: String): Integer; var i: Integer; begin Result := 0; for i:=1 to Length(ASrcD) do begin if ASrcA > ASrcD then begin Result:= i+1 ; end else begin Result:= i-1; CharToInt(ASrcA[i]); CharToInt(ASrcD[i]); Break; end; end; end; |
AW: funktion erstellen... weiß nicht weiter
Wo meckert er? Wo wird Deine Funktion denn aufgerufen? Wozu dieses CharToInt statt Ord?
|
AW: funktion erstellen... weiß nicht weiter
sollte ich so machen.... also wenn ich sort mit Memo1.lines tausche dann meckert er. also sie soll da aufgerufen werden wo ich den quelltext kommentiert habe.
|
AW: funktion erstellen... weiß nicht weiter
Wer meckert? Der Compiler? Zeig doch mal den Quelltext, der da moniert wird, sonst kommen wir nicht weiter.
|
AW: funktion erstellen... weiß nicht weiter
Irgendwie scheint die Hilfe von DeddyH nicht sehr hilfreich zu sein.
wenn ich's richtig verstehe, soll die Zeile: "if Memo1.Lines[j] > Memo1.lines[i] then " dann z.B. lauten "if StrCompare(Memo1.Lines[j], Memo1.lines[i]) > 1 then " und StrCompare sollte dann z.B. so aussehen:
Delphi-Quellcode:
Die Funktion liefert 0, falls beide Strings gleich sind, 1 falls s1 > s2 und -1 falls s1 < s2.
function TForm1.StrCompare(const s1, s2: String): Integer;
var j, minLen: Integer; begin minLen := Length(s1); if Length(s2) < minLen then minLen := Length(s2); j := 1; result := 0; while (j <= minLen) and (result = 0) do begin if ord(s1[j]) < ord(s2[j]) then result := -1 else if ord(s1[j]) > ord(s2[j]) then result := 1 else result := 0; inc(j); end; end; |
AW: funktion erstellen... weiß nicht weiter
Vorkauen ist also hilfreicher (BTW: 'hal' und 'hallo' sind also gleich, kommt bei Dir zumindest raus)? Dann mach Du weiter, ich verabschiede mich.
|
AW: funktion erstellen... weiß nicht weiter
also bin jetzt bis dahin
Delphi-Quellcode:
er sortiert zwar aber nicht nach dem alphabet.
function TForm1.Sort(ASrcA, ASrcD: String): Integer;
var i: Integer; lResult: Integer; begin Result := 0; for i:=1 to Length(ASrcD) do begin for lResult:= CharToInt(ASrcD[i]) to CharToInt(ASrcA[i]) do OutputDebugString( PChar(ASrcD[i] + ' = ' + IntToStr(lResult)) ); begin if lResult > 0 then Result:= i+1; end; for lResult:= CharToInt(ASrcA[i]) to CharToInt(ASrcD[i]) do OutputDebugString( PChar(ASrcA[i] + ' = ' + IntToStr(lResult)) ); begin if lResult < 0 then Result:= i-1; end; |
AW: funktion erstellen... weiß nicht weiter
Du ermittelst doch Zahlenwerte aus den Buchstaben. Die kann man auch einfach von einander subtrahieren. Das macht allerdings auch nur solange Sinn, wie das Gesamtergebnis 0 ist, danach musst Du aus der Schleife raus, sonst überschreibst Du Dir das richtige Ergebnis ggf. mit einem falschen. Außerdem kann die Länge der Strings ja auch unterschiedlich sein, daher darf die Vergleichsschleife nur über die Länge des kürzeren laufen. Kommt da 0 bei heraus, ist der längere auch der größere.
|
AW: funktion erstellen... weiß nicht weiter
prinzip verstanden... mal gucken ob es auch in der praxis klappr:lol:
|
AW: funktion erstellen... weiß nicht weiter
zu DeddyH:
Also ich lerne von anderer Leute code mehr als aus Büchern. Damit (hal > hallo) oder (hal < hallo), muss man erst mal entscheiden, was sinnvoll wäre. Eine Wahl wäre z.B. so:
Delphi-Quellcode:
zu Biby90:
function TForm1.StrCompare(s1, s2: String): Integer;
var j, minLen: Integer; begin minLen := Length(s1); if Length(s2) < minLen then minLen := Length(s2); j := 1; result := 0; while (j <= minLen) and (result = 0) do begin if ord(s1[j]) < ord(s2[j]) then result := -1 else if ord(s1[j]) > ord(s2[j]) then result := 1 else result := 0; inc(j); end; if (result = 0) and (Length(s2) > minLen) then result := -1; if (result = 0) and (Length(s1) > minLen) then result := 1; end; Du brauchst kein ChartoInt. Die Funktion ord macht das schon. Zum Vergleichen musst Du synchron durch beide Strings laufen: (j = 1..minLen) bis einer von beiden zu Ende ist. Sobald ein Unterschied in der Zeichenfolge besteht, kann die Funktion beendet werden. |
AW: funktion erstellen... weiß nicht weiter
Wieso Bücher? Ich habe lediglich versucht, Hilfe zur Selbsthilfe zu geben, dabei lernt man nämlich noch mehr. Aber wenn der Compiler etwas moniert, ist es wenig hilfreich zu sagen "der meckert", ohne den Code dann zu zeigen.
|
AW: funktion erstellen... weiß nicht weiter
naja ich brauche ja auch eigentlich keine Sort funktion... naja ich sollte die halt machen und jetzt eine, um das Memo1.lines > Memo1.lines blablabla zu ersetzen...
reiner lerneffekt. nicht streiten.... :-( |
AW: funktion erstellen... weiß nicht weiter
Da nun bereits 2 mögliche Lösungen gepostet wurden, hier meine Umsetzung (die vielen Hilfsvariablen sollen dem Verständnis dienen):
Delphi-Quellcode:
Im ButtonClick dann
function Min(Wert1, Wert2: integer): integer;
begin if Wert1 < Wert2 then Result := Wert1 else Result := Wert2; end; function MyStrCompare(const Str1, Str2: string): integer; var i, MaxLen, Laenge1, Laenge2, Wert1, Wert2: integer; begin Result := 0; i := 1; Laenge1 := Length(Str1); Laenge2 := Length(Str2); MaxLen := Min(Laenge1, Laenge2); while (i <= MaxLen) and (Result = 0) do begin Wert1 := CharToInt(Str1[i]); Wert2 := CharToInt(Str2[i]); Result := Wert1 - Wert2; i := i + 1; end; if Result = 0 then Result := Laenge1 - Laenge2; end;
Delphi-Quellcode:
for j:=0 to Memo1.Lines.count -2 do
begin for i:=j +1 to Memo1.Lines.Count -1 do begin if MyStrCompare(Memo1.Lines[j], Memo1.Lines[i]) > 0 then //tauschen |
AW: funktion erstellen... weiß nicht weiter
na das sieht doch schon eher nach dem aus was ich brauche. danke ich versuchs mal
|
AW: funktion erstellen... weiß nicht weiter
hier das endprodukt... danke nochmal ihr seid die besten :thumb:
Delphi-Quellcode:
unit main;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; procedure Button1Click(Sender: TObject); private function Sort(ASrcA, ASrcD: String): Integer; function CharToInt(AValue: String): Integer; { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; CharTable: array[0..51] of String = ('A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f', 'G', 'g', 'H', 'h','I', 'i', 'J', 'j', 'K', 'k', 'L', 'l', 'M', 'm', 'N', 'n', 'O', 'o', 'P', 'p', 'Q', 'q', 'R', 'r', 'S', 's', 'T', 't', 'U', 'u', 'V', 'v', 'W', 'w', 'X', 'x', 'Y', 'y', 'Z', 'z'); implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i, j : Integer; //Position Buffer: String; begin for j:=0 to Memo1.Lines.count -2 do begin for i:=j +1 to Memo1.Lines.Count -1 do begin if Sort(Memo1.Lines[j], Memo1.Lines[i]) > 0 then begin Buffer:= Memo1.Lines[j]; Memo1.Lines[j]:= Memo1.Lines[i]; Memo1.Lines[i]:= Buffer; end; end; end; end; function TForm1.CharToInt(AValue: String): Integer; var i: Integer; begin Result := -1; for i := 1 to Length(CharTable) do begin if AValue = Chartable[i] then begin Result := i; Break; end; end; end; function TForm1.Sort(ASrcA, ASrcD: String): Integer; var i, j: Integer; lResult: Integer; begin Result := 0; for i:=1 to Length(ASrcD) do begin if CharToInt(ASrcA[i]) = CharToInt(ASrcD[i]) then begin Result := 0; end else begin if CharToInt(ASrcA[i]) < CharToInt(ASrcD[i]) then begin Result:= -1; Break; end else begin Result := +1; Break; end; end; end; end; end. |
AW: funktion erstellen... weiß nicht weiter
Und wenn ASrcA kürzer als ASrcD ist, kracht es u.U. in Deiner Sort-Methode, da Du aus dem Nirvana liest.
|
AW: funktion erstellen... weiß nicht weiter
hö? verstehe gerade nur bahnhof.... es funktioniert auf jeden fall und das ist die hauptsache.
mein ausbilder findet es auch in ordnung |
AW: funktion erstellen... weiß nicht weiter
Dann ruf doch einmal
Delphi-Quellcode:
auf.
Sort('123', '12345')
|
AW: funktion erstellen... weiß nicht weiter
hmm.... vorhin hatte es geklappt dass Baumhaus unter Baum stand und beim sortieren es eben getauscht hat
er machts immer noch genau so... nur nicht zahlen |
AW: funktion erstellen... weiß nicht weiter
Dann sortier nochmal oder ruf wie gezeigt die Funktion direkt auf.
|
AW: funktion erstellen... weiß nicht weiter
versuch ich später habe jetzt eine neue Aufgabe bekommen... naja nach BubbleSort kommt jetzt halt ShellSort^^
|
AW: funktion erstellen... weiß nicht weiter
Da wirst Du aber auch vergleichen müssen ;)
|
AW: funktion erstellen... weiß nicht weiter
jop ich weiß.... bin grad dabei das zu verstehen und selber hinzukriegen....
nur diese beispiele im internet sind echt blöd! |
AW: funktion erstellen... weiß nicht weiter
kann hier jemand den fehler entdecken?
Delphi-Quellcode:
unit sortierenShell;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; procedure Button1Click(Sender: TObject); private procedure ShellSort(CharTable: String); { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; CharTable: array[0..51] of String = ('A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f', 'G', 'g', 'H', 'h','I', 'i', 'J', 'j', 'K', 'k', 'L', 'l', 'M', 'm', 'N', 'n', 'O', 'o', 'P', 'p', 'Q', 'q', 'R', 'r', 'S', 's', 'T', 't', 'U', 'u', 'V', 'v', 'W', 'w', 'X', 'x', 'Y', 'y', 'Z', 'z'); implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i, j: Integer; begin ShellSort(Memo1.Lines[i]); end; procedure TForm1.ShellSort(CharTable: String); var i, j, k: Integer; lBuffer: String; begin i := Length(Memo1.Text) div 2; While i > 0 do begin j := k; if Memo1.Lines[j] > Memo1.Lines[j +i] then begin lBuffer := Memo1.Lines[j]; Memo1.Lines[j] := Memo1.Lines[j +i]; Memo1.Lines[j +i] := lBuffer; end else begin k := k +1; if k < Length(Memo1.Text) -i then begin i := i div 2; Break; end; end end; end; end. |
AW: funktion erstellen... weiß nicht weiter
Zitat:
Ich finde Du solltest Deine Fragen konkreter formulieren. Wenn man sich selbst des Problems richtig bewusst ist, erkennt man oft selbst wo der Fehler liegt. Wo tritt ein Fehler auf? Ist es ein logischer Fehler oder ein Programmierfehler. Lässt sich der Code kompilieren, wenn nein welche Fehlermeldungen werden angegeben. Hast Du die Inhalte deiner Variablem mal angesehen bzw hast Du dich schon mit dem Debugging beschäftigt? Wenn nein, empfehle ich dir das ![]() |
AW: funktion erstellen... weiß nicht weiter
Delphi-Quellcode:
procedure TForm1.Button6Click(Sender: TObject);
// i undefiniert, j nicht benutzt // ShellSort erwartet als Paramter eine CharTable procedure TForm1.ShellSort(CharTable: String); // CharTable wid nicht benutzt // k undefiniert, j auch // j ist k, weshalb j deklariert // was soll diese procedure eigentlich machen ? |
AW: funktion erstellen... weiß nicht weiter
Zitat:
Delphi-Quellcode:
Bei Letzerem muß natürlich die Länge geprüft werden, zu beginn der Prozedur, bevor man auf die einzelnen Zeichen zugreift.
CharTable: array[0..51] of Char = // warum war das "of String", wo es doch nur einzelne Chars sind?
('A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f', 'G', 'g', 'H', 'h','I', 'i', 'J', 'j', 'K', 'k', 'L', 'l', 'M', 'm', 'N', 'n', 'O', 'o', 'P', 'p', 'Q', 'q', 'R', 'r', 'S', 's', 'T', 't', 'U', 'u', 'V', 'v', 'W', 'w', 'X', 'x', 'Y', 'y', 'Z', 'z'); // oder doch als String CharTable: String = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz'; // oder als echte Konstante CharTable = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz'; |
AW: funktion erstellen... weiß nicht weiter
Das Length(Memo1.Text) verwirrt mich etwas. Müsste hier nicht die Zeilenanzahl stehen?
|
AW: funktion erstellen... weiß nicht weiter
ähhhh ... jupp
|
AW: funktion erstellen... weiß nicht weiter
Zitat:
habe auch eine Schleife übersehn dir rein muss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz