Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Sortieren funktioniert nicht (https://www.delphipraxis.net/147147-sortieren-funktioniert-nicht.html)

jonsen2.0.0.9 2. Feb 2010 19:38


Sortieren funktioniert nicht
 
Hallo,

so in der Schule arbeiten wir jetzt mit arrays...deshalb hab ich mal Bubble Sort versucht.

Ich finde aber den fehler nicht....das funktioniert bei mir irgendwie nicht :(

Außerdem fände ich es toll wenn ihr mir verbesserungen z.B. bei meiner repeat-until schlife geben würdet.

Mein Programm is halt noch nich so gut :(

Delphi-Quellcode:
var
  Form1: TForm1;
  ar:array[1..100] of integer;
  temp:integer; //in temp sicher ich einen wert

implementation

{$R *.dfm}

procedure sortieren();
Var i,i2:integer;
    a,a2,sicher:integer; //sicher ist damit keine entlosschleife entsteht...is bis jetzt immer so gewesen :(
begin
sicher:=0;
repeat
 sicher:=sicher+1;
 a2:=100;                //a2 gibt an wie oft die for i to do schleife laufen soll
 a:=0;
 for i:=1 to 100 do
  if ar[i]>ar[i+1] then  //wenn ar[i] kleiner ist als ar[i+1] dann soll
   begin
    temp:=ar[i];         //temp su ar[i] werden
    ar[i]:=ar[i+1];      //ar[i] kann ich dann mit ar[i+1] überschreiben
    ar[i+1]:=temp;       //und ar[i+1] mit dem ursprünglichen wert von ar[i] ersetzen
   end;
 for i2:=1 to a2 do
  if ar[i]<=ar[i+1] then
   a:=a+1                 //hier gucke ich ob ALLE passen....wenn nicht wird noch einmal sortiert
  else
   a2:=100;
until (a>=100) or (sicher>=10000000) //wenn entweder 10.000.000 mal sortiert wurde oder alles passt wird beendet
end;

procedure fuellen();
Var i:integer;
begin
for i:=1 to 100 do
 ar[i]:=random(999)+1;          //hier wird mein array gefüllt
end;


procedure TForm1.Button1Click(Sender: TObject);
Var i:integer;
begin
fuellen;
for i:=1 to 100 do
 begin
  listbox1.Items.Delete(i);
  listbox1.Items.Add(inttostr(ar[i]));   //hier wird die listbox in der die zahlen stehen sollen gefüllt.
 end;
end;

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

procedure TForm1.Button2Click(Sender: TObject);
Var i:integer;
begin
sortieren;
for i:=1 to 100 do
 begin
  listbox1.Items.Delete(i);
  listbox1.Items.Add(inttostr(ar[i]));
 end;
end;

end.
Danke schonmal

MFG
Jonsen

himitsu 2. Feb 2010 20:06

Re: Sortieren funktioniert nicht
 
Ein richtiges BubbleSort ist das nicht
http://de.wikipedia.org/wiki/Bubblesort

zumindestens ist deine Abbruchbedingung etwas suboptimal
- richtig = nochmal sortieren, wenn was getauscht wurde
- du = alles angucken, ob richtig sortiert ist und wenn, dann abbrechen
(das Fette ist eine Bremse)


Und was bitte heißt "das funktioniert bei mir irgendwie nicht"
Was passiert oder passiert nicht oder läuft falsch?
> FEHLERBESCHREIBUNG :warn:

Sicher, daß es nicht richtig sortiert?
Delphi-Quellcode:
listbox1.Items.Delete(i);
listbox1.Items.Add(inttostr(ar[i]))
Ich denk eher, daß deine Anzeige der Werte fehlerhaft ist.

Vergleiche mal den Arrayinhalt (laut Debugger) und den Inhalt der ListBox.

jonsen2.0.0.9 2. Feb 2010 20:16

Re: Sortieren funktioniert nicht
 
ok...danke für den tipp mit der bremse...werde ich änder.


und ja...du hast recht...er sortiert richtig -.-

aber in der listbox steht was falsches....ok dann suche ich dafür eine lösung.

DER FEHLER:

in der listbox stehen zahlen, wild durcheinander gewürfelt.

nicht das was eigentlich im array steht.

MFG
Jonsen

s.h.a.r.k 3. Feb 2010 00:50

Re: Sortieren funktioniert nicht
 
Was die Lösung ist, ist klar? Erst Clear und dann in der For-Schleife alles adden. Das Delete ist hier fehl am Platz.

jonsen2.0.0.9 3. Feb 2010 14:49

Re: Sortieren funktioniert nicht
 
ok danke an alle...funtkioniert jetzt perfekt und schnell :)

MFG
Jonsen

himitsu 3. Feb 2010 15:10

Re: Sortieren funktioniert nicht
 
Zitat:

Zitat von s.h.a.r.k
Das Delete ist hier fehl am Platz.

Nicht unbedingt, man muß es nur "richtig" machen.
> Wobei natürlich der Weg über .Clear optimaler ist.

Delphi-Quellcode:
for i := 100 to 1 do begin
  listbox1.Items.Delete(99);
  listbox1.Items.Insert(0, IntToStr(ar[i]));
Delphi-Quellcode:
for i := 1 to 100 do begin
  listbox1.Items.Delete(0);
  listbox1.Items.Add(IntToStr(ar[i]));
Abgesehn davon kannst du froh sein, daß keine Exception ausgelöst wurden, denn die Indize in der ListBox fangen bei 0 an.


Das Problem war einfach das:
(angenommen es wären jetzt nur 10, statt 100 Einträge)

in der Box stehen diese Buchstaben untereinander > abcdefghij
und diese Ziffern sollen eingefügt werden > 1234567890
Code:
1 eingefügt = acdefghij1
2 eingefügt = acefghij12
3 eingefügt = aceghij123
4 eingefügt = acegij1234
5 eingefügt = acegi12345
6 eingefügt = acegi13456
7 eingefügt = acegi13567
8 eingefügt = acegi13578
9 eingefügt = acegi13579
0 eingefügt = acegi13579*0
Der Stern steht für den Index 10, welchen es nicht gibt, und welcher hier versucht wurde zu löschen.

Du siehst jetzt, daß es so nicht stimmte, auch wenn einige Einträge schon den neuen Werten entspricht :angel2:

s.h.a.r.k 3. Feb 2010 15:46

Re: Sortieren funktioniert nicht
 
Zitat:

Zitat von himitsu
Zitat:

Zitat von s.h.a.r.k
Das Delete ist hier fehl am Platz.

Nicht unbedingt, man muß es nur "richtig" machen.
> Wobei natürlich der Weg über .Clear optimaler ist.

Mir ist schon klar, dass es einige Wege nach Rom gibt, aber man kann auch noch eine zweite ListBox eröffnen :mrgreen: Das mit dem Delete ist so, wie etwas von hinten durch die Brust und durch das Auge machen...


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