![]() |
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:
Noch mal danke!
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; |
Re: zu blöd für MinSort...
Ein Hallöle von
![]() 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:
Ausserdem ist IMHO die untere Variante übersichtlicher, da nicht ständig eine Zuweisung erfolgt,
pos := i;
For j := i + 1 to anz do Begin if a[j] < a[i] Then pos := j;
Delphi-Quellcode:
sondern nur die Zuweisung ausgeführt wird, wenn die Werte auch getauscht werden.
hilf := a[j];
a[j] := a[i]; a[i] := hilf; So ist es besser und der Fehler ist auch gleich behoben:
Delphi-Quellcode:
http://www.delphipraxis.net/images/common/divider.jpg
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; ![]() ![]() ![]() |
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: |
Re: zu blöd für MinSort...
Zitat:
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; |
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... :?: |
Re: zu blöd für MinSort...
Ein Hallöle von
![]() :oops: hatte die Zählervariable nicht mit geändert:
Code:
Der Fehler lag also nicht beim Sortieren, sondern beim Füllen des Arrays. Da wurde eben nur a[anz] / a[5] gefüllt.
[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]; So, jetzt geht es:
Delphi-Quellcode:
http://www.delphipraxis.net/images/common/divider.jpg
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; ![]() ![]() ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz