AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

zu blöd für MinSort...

Ein Thema von avemaria · begonnen am 3. Dez 2003 · letzter Beitrag vom 3. Dez 2003
Antwort Antwort
avemaria
(Gast)

n/a Beiträge
 
#1

zu blöd für MinSort...

  Alt 3. Dez 2003, 16:59
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!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.121 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 3. Dez 2003, 17:23
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.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
avemaria
(Gast)

n/a Beiträge
 
#3

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

  Alt 3. Dez 2003, 18:19
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 ) probiert -mit Erfolg (auch mit dem selben anz, usw. ...)
Jetzt muss ich nur noch rauskriegen, weshalb´s funktioniert...
  Mit Zitat antworten Zitat
Illuminator-23-5
(Gast)

n/a Beiträge
 
#4

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

  Alt 3. Dez 2003, 18:27
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;
  Mit Zitat antworten Zitat
avemaria
(Gast)

n/a Beiträge
 
#5

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

  Alt 3. Dez 2003, 18:39
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...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.121 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 3. Dez 2003, 19:13
Ein Hallöle von http://www.FrankNStein.de/Smiley-Wolke.gif,

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.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:19 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