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' {Form1};

{$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)
  {Zahlen=record
    Zahl : integer;}

    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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    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;  { Zaehlvariablen }
  x, Min: integer;  { Zwischenspeicher, Minimum }
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 user profile iconGausi: Code- durch Delphi-Tags ersetzt


jaenicke - Sa 29.11.08 22:33

Du hast in unit1.pas diese Zeilen vor implementation gelöscht... :roll:

Delphi-Quelltext
1:
2:
var
  Form1: TForm1;


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

user profile iconwicked hat folgendes geschrieben Zum zitierten Posting springen:

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. ;-)