Entwickler-Ecke
Sonstiges (Delphi) - Probleme beim Selection Sort
wicked - Sa 29.11.08 22:10
Titel: Probleme beim Selection Sort
Hallo,
ich bin grade dabei einen einfachen Selection Sort, durch den eine Zahlenreihe sortiert werden soll zu programmieren.. leider komme ich wegen einer komischen Fehlermeldung nicht weiter.. hier mein Quelltext bzw. die Fehlermeldung:
(es können allerdings auch noch einige andere Fehler enthalten sein - ich programmiere noch nicht sehr lang..)
Vielen Dank schonmal für Hilfe!!
die Fehlermeldung: wenn ich das Programm starten will, erscheint folgendes:
[Fehler]Project1.dpr(11): Undefinierter Bezeichner: 'Form1'
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| program Project1;
uses Forms, Unit1 in 'Unit1.pas' ;
{$R *.res}
begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. |
Delphi-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: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97:
| type TForm1 = class(TForm) E1: TEdit; E2: TEdit; E7: TEdit; E3: TEdit; E6: TEdit; E5: TEdit; E8: TEdit; E9: TEdit; E10: TEdit; Label1: TLabel; Panel1: TPanel; BSortieren: TButton; E4: TEdit; BLoeschen: TButton; BSchliessen: TButton; procedure BSortierenClick(Sender: TObject); procedure BSchliessenClick(Sender: TObject); procedure FormCreate(Sender: TObject); private public L: array of integer; max: integer; end;
implementation
{$R *.dfm}
procedure TForm1.BSchliessenClick(Sender: TObject); begin Close; end;
procedure TForm1.FormCreate(Sender: TObject); begin max:= 10; setlength(L,max+1); end;
procedure TForm1.BSortierenClick(Sender: TObject); var i, j : integer; x, Min: integer; begin L[1]:=strtoint(e1.text); L[2]:=strtoint(e2.text); L[3]:=strtoint(e3.text); L[4]:=strtoint(e4.text); L[5]:=strtoint(e5.text); L[6]:=strtoint(e6.text); L[7]:=strtoint(e7.text); L[8]:=strtoint(e8.text); L[9]:=strtoint(e9.text); L[10]:=strtoint(e10.text);
for i := 0 to max do begin Min := i; for j := i to max+1 do if L[j] < L[Min] then begin Min := j;
x:= L[Min]; L[Min]:= L[i]; L[i]:= x; end;
e1.text:=inttostr(L[1]); e2.text:=inttostr(L[2]); e3.text:=inttostr(L[3]); e4.text:=inttostr(L[4]); e5.text:=inttostr(L[5]); e6.text:=inttostr(L[6]); e7.text:=inttostr(L[7]); e8.text:=inttostr(L[8]); e9.text:=inttostr(L[9]); e10.text:=inttostr(L[10]);
end;
end;
end. |
Moderiert von
Gausi: Code- durch Delphi-Tags ersetzt
jaenicke - Sa 29.11.08 22:33
Du hast in unit1.pas diese Zeilen vor implementation gelöscht... :roll:
wicked - Sa 29.11.08 23:42
Danke für die Hilfe!!
Das Programm läuft jetzt zwar, allerdings muss ich komischerweise immer mehrmals ( in der Regel 3mal) auf den Button "Sortieren" drücken, bis die Zahlen vollständig sortiert sind.. sie sind dann allerdings auch richtig sortiert (immerhin^^)
kann mir vielleicht jemand sagen, woran das liegen könnte? Ich verstehe es leider nicht..
Danke schonmal!
jaenicke - Sa 29.11.08 23:53
Naja, du hast 10 Zahlen, hast aber im Array Platz für 11 und sortierst ab Index 0, dabei gehen deine Zahlen erst bei Index 1 los...
Ein Array fängt bei 0 an zu zählen und die Länge musst du auch auf 10 setzen, wenn du 10 Zahlen hast, und nicht auf 10+1...
wicked - So 30.11.08 00:32
Ich verstehe schon was du meinst, aber ich kann es irgendwie nicht umsetzen.. welche Änderung muss ich denn konkret im Quelltext vornehmen?
Ich habe es zum Beispiel mal mit
Quelltext
1: 2: 3:
| for i := 0 to max-1 do begin Min := i; for j := i to max-1 do |
versucht, aber es hat sich nichts verändert..
Danke für Hilfe!
wicked - So 30.11.08 00:34
achso.. und noch eine Frage:
Kann man dieses Teil hier verkürzt durch eine Schleife darstellen?
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| L[0]:=strtoint(e1.text); L[1]:=strtoint(e2.text); L[2]:=strtoint(e3.text); L[3]:=strtoint(e4.text); L[4]:=strtoint(e5.text); L[5]:=strtoint(e6.text); L[6]:=strtoint(e7.text); L[7]:=strtoint(e8.text); L[8]:=strtoint(e9.text); L[9]:=strtoint(e10.text); |
Danke!
jaenicke - So 30.11.08 00:35
Dein SetLength setzt die Länge auf 11 statt 10 (warum steht das SetLength überhaupt im FormCreate und nicht dort wo du das Array füllst, außerdem könnte die variable auch lokal sein, wenn du das nicht trennen würdest) und mit
Delphi-Quelltext
1:
| L[1]:=strtoint(e1.text); |
schreibst du die erste Zahl in das zweite Feld des Arrays.
Und zu deiner anderen Frage, die eigentlich in ein neues Thema gehört, da schau dir mal die Funktion FindComponent an.
wicked - So 30.11.08 00:51
Ich habe jetzt ein bisschen was geändert, aber es funktioniert leider noch immer nicht.. kannst du nochmal drüberschauen?
Quelltext
1: 2: 3: 4: 5:
| procedure TForm1.FormCreate(Sender: TObject); begin max:= 10; setlength(L,max-1); end; |
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: 41: 42: 43: 44: 45:
| procedure TForm1.BSortierenClick(Sender: TObject); var i, j : integer; x, min: integer; begin L[0]:=strtoint(e1.text); L[1]:=strtoint(e2.text); L[2]:=strtoint(e3.text); L[3]:=strtoint(e4.text); L[4]:=strtoint(e5.text); L[5]:=strtoint(e6.text); L[6]:=strtoint(e7.text); L[7]:=strtoint(e8.text); L[8]:=strtoint(e9.text); L[9]:=strtoint(e10.text);
for i := 0 to max-1 do begin Min := i; for j := i to max-1 do if L[j] < L[Min] then begin Min := j; if min>i then begin x:= L[Min]; L[Min]:= L[i]; L[i]:= x;
end;
end;
e1.text:=inttostr(L[0]); e2.text:=inttostr(L[1]); e3.text:=inttostr(L[2]); e4.text:=inttostr(L[3]); e5.text:=inttostr(L[4]); e6.text:=inttostr(L[5]); e7.text:=inttostr(L[6]); e8.text:=inttostr(L[7]); e9.text:=inttostr(L[8]); e10.text:=inttostr(L[9]);
end; |
jaenicke - So 30.11.08 01:19
Warum setzt du die Länge denn jetzt auf 9? Erst Länge 11 für 10 Einträge, jetzt 9, wie wäre es mit 10...
Und was den Algorithmus an sich angeht, schau dir mal bei Wikipedia das C# Beispiel an, das ist praktisch identisch.
http://de.wikipedia.org/wiki/Selectionsort#C.23
wicked - So 30.11.08 10:47
ja stimmt, das war sinnlos..
aber ich habe jetzt zum beispiel mit L[0] angefangen, dass jeder platz genutzt wird.. deshalb habe ich das dann auch unten geändert.. war das sinnvoll? leider sortiert sich die zahlenreihe noch immer nicht nach einem klick..
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| for i := 0 to max-1 do begin Min := i; for j := i+1 to max-1 do if L[j] < L[Min] then begin Min := j; if min>i then begin x:= L[Min]; L[Min]:= L[i]; L[i]:= x; |
jaenicke - So 30.11.08 11:46
wicked hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| for i := 0 to max-1 do begin Min := i; for j := i+1 to max-1 do if L[j] < L[Min] then begin Min := j; if min>i then begin x:= L[Min]; L[Min]:= L[i]; L[i]:= x; | |
Die markierten Zeilen kommen im C# Code nicht vor. ;-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!