Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi zu blöd für MinSort... (https://www.delphipraxis.net/12754-zu-bloed-fuer-minsort.html)

avemaria 3. Dez 2003 16:59


zu blöd für MinSort...
 
Hi! Ich habe ein kleines Problem. Wenn ich ein Feld sortieren will, erscheint in der sortierten Menge am Anfang einfach eine 0 !
Kann mir jemand (sogar für mich verständlich) das mal erklären?
Ich habe hier jetzt mal (für den Fall) auch die Prozedur, um das Feld aufzustellen.
Danke im Voraus!
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

begin
 randomize;
 listbox1.clear;
 for anz:=1 to 5 do begin
  a[anz]:=round(random*1000)/100;
  listbox1.Items.Add(floattostr(a[anz]));

 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i,j, pos: integer;
var hilf: real;
begin
 for i:= 1 to anz do begin
  pos:=i;
  for j:= i+1 to anz do begin
   if a[j]<a[i] then pos:=j;
   hilf:=a[pos];
   a[pos]:= a[i];
   a[i]:=hilf;
  end;
 end;
 listbox1.clear;
 for i:=1 to anz do listbox1.Items.Add(floattostr(a[i]));
end;
Noch mal danke!

himitsu 3. Dez 2003 17:23

Re: zu blöd für MinSort...
 
Ein Hallöle von http://www.FrankNStein.de/Smiley-Wolke.gif und herzlich willkommen in unserer DP-Gemeinde,

Der Fehler liegt an der Verwendung von anz.
anz ist nach der Ausführung der Schleife 6 (das hängt mit dem Aufbau der For-Schleife zusammen), daher wird auch eine 6. Zahl im Button2-Ereignis verarbeitet, welche natürlich beim Sortieren an den Anfang rutscht.

Rein vom Tempo her ist das nicht so optimal:
Delphi-Quellcode:
  pos := i;
  For j := i + 1 to anz do Begin
    if a[j] < a[i] Then pos := j;
Ausserdem ist IMHO die untere Variante übersichtlicher, da nicht ständig eine Zuweisung erfolgt,
Delphi-Quellcode:
hilf := a[j];
a[j] := a[i];
a[i] := hilf;
sondern nur die Zuweisung ausgeführt wird, wenn die Werte auch getauscht werden.

So ist es besser und der Fehler ist auch gleich behoben:
Delphi-Quellcode:
Procedure TForm1.Button1Click(Sender: TObject);
  Var i: Integer;

  Begin
    Randomize;
    ListBox1.Clear;
    anz := 5;
    For i := 1 to anz do Begin
      a[anz] := Round(Random * 1000) / 100;
      ListBox1.Items.Add(FloatToStr(a[anz]));
    End;
  End;

Procedure TForm1.Button2Click(Sender: TObject);
  Var i, j: integer;
    hilf: real;

  Begin
    For i := 1 to anz - 1 do
      For j := i + 1 to anz do
        If a[j] < a[i] Then Begin
          hilf := a[j];
          a[j] := a[i];
          a[i] := hilf;
        End;
    ListBox1.Clear;
    For i := 1 to anz do
      ListBox1.Items.Add(FloatToStr(a[i]));
  End;
http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

avemaria 3. Dez 2003 18:19

Re: zu blöd für MinSort...
 
hast du das mal ausprobiert?
Bei meiner Listbox steht dann nur noch
0
0
0
0
<die letzte Zahl des Feldes>
:?:

*ganzratlossein*

... hab´s jetzt noch mal (auf meine Art :-D ) probiert -mit Erfolg (auch mit dem selben anz, usw. ...)
Jetzt muss ich nur noch rauskriegen, weshalb´s funktioniert... :gruebel:

Illuminator-23-5 3. Dez 2003 18:27

Re: zu blöd für MinSort...
 
Zitat:

if a[j] < a[i] Then pos := j;
if a[j] < a[pos] then pos := j;

dann müssts gehn:
Delphi-Quellcode:
for i:= 1 to anz do begin
  pos:=i;
  for j:= i+1 to anz do begin
   if a[j]<a[pos] then pos:=j;
   hilf:=a[pos];
   a[pos]:= a[i];
   a[i]:=hilf;
  end;
end;

avemaria 3. Dez 2003 18:39

Re: zu blöd für MinSort...
 
Wo ist denn der Unterschied?
a[pos] und a[i] sind doch in der Zeile eigentlich das Selbe, oder?
Schließlich steht zwei Zeilen vorher pos:=i und dazwischen wird an i nichts geändert... :?:

himitsu 3. Dez 2003 19:13

Re: zu blöd für MinSort...
 
Ein Hallöle von http://www.FrankNStein.de/Smiley-Wolke.gif,

:oops: hatte die Zählervariable nicht mit geändert:
Code:
[b]Procedure[/b] TForm1.Button1Click(Sender: TObject);
  [b]Var[/b] i: Integer;

  [b]Begin[/b]
    Randomize;
    ListBox1.Clear;
    anz := 5;
    [b]For[/b] i := 1 [b]to[/b] anz [b]do[/b] [b]Begin[/b]
      a[[color=red]anz[/color]] := Round(Random * 1000) / 100;
      ListBox1.Items.Add(FloatToStr(a[[color=red]anz[/color]]));
    [b]End[/b];
  [b]End[/b];
Der Fehler lag also nicht beim Sortieren, sondern beim Füllen des Arrays. Da wurde eben nur a[anz] / a[5] gefüllt.


So, jetzt geht es:
Delphi-Quellcode:
Procedure TForm1.Button1Click(Sender: TObject);
  Var i: Integer;

  Begin
    Randomize;
    ListBox1.Clear;
    anz := 5;
    For i := 1 to anz do Begin
      a[i] := Round(Random * 1000) / 100;
      ListBox1.Items.Add(FloatToStr(a[i]));
    End;
  End;

Procedure TForm1.Button2Click(Sender: TObject);
  Var i, j: integer;
    hilf: real;

  Begin
    For i := 1 to anz - 1 do
      For j := i + 1 to anz do
        If a[j] < a[i] Then Begin
          hilf := a[j];
          a[j] := a[i];
          a[i] := hilf;
        End;
    ListBox1.Clear;
    For i := 1 to anz do
      ListBox1.Items.Add(FloatToStr(a[i]));
  End;
http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:24 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