Autor |
Beitrag |
wicked
      
Beiträge: 19
|
Verfasst: Sa 29.11.08 22:10
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. |
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
      
Beiträge: 19321
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 29.11.08 22:33
|
|
wicked 
      
Beiträge: 19
|
Verfasst: 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
      
Beiträge: 19321
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 19
|
Verfasst: 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 
      
Beiträge: 19
|
Verfasst: 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
      
Beiträge: 19321
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 19
|
Verfasst: 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; |
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
      
Beiträge: 19321
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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.
de.wikipedia.org/wiki/Selectionsort#C.23
|
|
wicked 
      
Beiträge: 19
|
Verfasst: 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
      
Beiträge: 19321
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 30.11.08 11:46
|
|
|