Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi zahlen sortieren (https://www.delphipraxis.net/91571-zahlen-sortieren.html)

ahnungsloser 7. Mai 2007 09:23


zahlen sortieren
 
Guckt mal, ich hab dieses Programm geschrieben, es kommt aber immer eine Fehlermeldung, wenn ich den Sortierenbutton anklicke. Woran liegt das???

Delphi-Quellcode:
type
  tzz = array [1..100] of integer;
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    ListBox1: TListBox;
    ListBox2: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
   zz: tzz;
implementation

{$R *.dfm}

procedure zufall(var zz:tzz);
var
i:integer;
begin
for i:= 1 to 100 do
begin
zz[i]:= random(150)+1;
Form1.ListBox1.Items.Add(IntToStr(zz[i]));
end;
end;
procedure sortieren (zz:tzz);
var i,j,hilf:integer;
begin
for i:= 100 downto 1 do
for j:= 1 to i do
begin
if
zz[j]<zz[j-1] then
begin
hilf:= zz[j-1];
zz[j-1]:= zz[j];
zz[j]:= hilf;
Form1.ListBox2.Items.Add(IntToStr(zz[j]));
end;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
randomize;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
zufall(zz);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
sortieren(zz);
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;

end.
Wäre toll, wenn mir jemand weiter helfen könnte.
Danke

Klaus01 7. Mai 2007 09:28

Re: zahlen sortieren
 
Welche Fehlermeldung, zur Laufzeit oder wenn Du Compilierst?
Wo hast Du die Variable "hilf" deklariert/definiert?

Grüße
Klaus

Tormentor32 7. Mai 2007 09:30

Re: zahlen sortieren
 
Du hast deine Prozedur auch nicht Deklariert!

Delphi-Quellcode:
procedure Zufall(var zz:tzz);
Das musst du in den Interface Teil schreiben!

Edit: Ach ja und Sortieren auch :wink:

sirius 7. Mai 2007 09:30

Re: zahlen sortieren
 
Delphi-Quellcode:
zz[j]<zz[j-1] then
Beim ersten Schleifendurchlauf ist j=1 und demnach j-1=0. Und es gibt kein zz[0]!

Btw: Ein bisschen Struktur tut deinem code auch ganz gut
Und demnächst könntest du den Sortierbutton auch so nennen, und nicht Button1!


Edit: @Tormentor: Nö, man muss nicht "deklarieren". Auch wenn die Struktur so, sagen wir, sehr anfängerlich aussieht, müssen tut man nicht :tongue:

ahnungsloser 7. Mai 2007 14:46

Re: zahlen sortieren
 
Hallo, ich hab den Fehler (unglaublich aber wahr!) dann selber gefunden...trotzdem danke, für die tipps!!
Delphi-Quellcode:
procedure sortieren (zz:tzz);
var i,j,hilf:integer;
begin
  for i:= 20 downto 1 do
  for j:= 1 to i do
 begin
  if
   zz[j]<zz[j-1] then
    begin
      hilf:= zz[j-1];
      zz[j-1]:= zz[j];
      zz[j]:= hilf;
    end;
 end;
for i:= 1 to 20 do
 Form1.ListBox2.Items.Add(IntToStr(zz[i]));
end;
jetzt werden die zahlen sortiert....müsste ich denn anstatt zz[j]<[zz[j-1] eher schreiben zz[j]>zz[j+1], damit j nicht 0 werden kann...aber dann werden die Zahlen absteigend sortiert...also 20 10 5 1 und nicht 1 5 10 20....Ach so und das mit dem anfängerlich trifft voll und ganz zu *g*

Klaus01 7. Mai 2007 14:52

Re: zahlen sortieren
 
Du könntest mit j = 2 in der Schleife anfangen,
dann wäre j-1 = 1;

Grüße
Klaus

Jelly 7. Mai 2007 14:58

Re: zahlen sortieren
 
Du bist Dir schon bewusst dass der Bubblesort nicht gerade prozessorschonend ist :mrgreen:

Anstatt das Sortieren selbst zu schreiben, kannst du auch eine TList nutzen, anstatt eines arrays. Listen können beliebig viele Objekte aufnehmen. Und List implementiert bereits eine Sortier Methode, die als einzigen Parameter eine Funktion braucht, die einen Integer zurückliefert beim Vergleich von 2 Werten. (sozusagen das Pendant zu IComparable Interface in .NET). Hier einfach mal ein Beispiel, damits klarer wird. Zwar etwas aufgebauscht, aber damit wird dann schnell verständlich, dass das mit beliebigen Objekten in der List funktioniert, und nicht nur mit Integer:

Delphi-Quellcode:
type
  TMyClass = class
  public
     Value : integer ;
  end ;

  TForm1 = class (TForm)
  // ...
  public
    List : TList ;
      end ;

implementation

procedure Compare (Item1, Item2 : TPointer) ;
var
 V1, V2 : integer ;
begin
     V1 := Item1(TMyClass).Value ;
     V2 := Item2(TMyClass).Value ;
     if V1 < V2 then
        Result := 1
     else if V1 > V2 then
        Result := -1 
     else
        Result := 0 ;
end ;

end.
Die Liste sortieren geht dann ganz leicht mit
Delphi-Quellcode:
List.Sort (Compare) ;
Bei diesem Sortierverfahren ist der QuickSort Algorythmus implementiert, der wesentlich effektiver arbeitet als BubbleSort.

Ich find die Methode über TList sehr elegant.

ahnungsloser 7. Mai 2007 16:10

Re: zahlen sortieren
 
Okis vielen Dank nochmal und schönen Tag noch!!!
:wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz