Autor |
Beitrag |
-delphin-
      
Beiträge: 200
|
Verfasst: Sa 04.06.05 18:22
Also ich habe ein Programm geschrieben, das eine Liste einer ausgewählten Anzahl zufälliger Zahlen in einer ListBox (LBRandom) mit BubbleSort sortieren soll. Das Ganze sieht so aus:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70:
| unit UBubbleSort;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const max = 100; type TForm1 = class(TForm) LBRandom: TListBox; LBSort: TListBox; LRandom: TLabel; EAnzahl: TEdit; LSort: TLabel; BRandom: TButton; BSort: TButton; LAnzahl: TLabel; procedure BRandomClick(Sender: TObject); procedure BSortClick(Sender: TObject); private public end;
var Form1: TForm1;
Menge: array [1..max] of integer;
implementation
{$R *.dfm}
procedure TForm1.BRandomClick(Sender: TObject); var i, Anzahl : integer; begin randomize; Anzahl := StrToInt(EAnzahl.Text); for i:=1 to Anzahl do LBRandom.Items.Add(IntToStr(Random(max)+1)); end;
procedure TForm1.BSortClick(Sender: TObject); var i,j,merke,anzahl:integer; begin LBSort.Items.clear; anzahl:=High(Menge); for i:=1 to anzahl do begin for j:=anzahl downto i do begin if Menge[j]<Menge[j-1] then begin merke:=Menge[j]; Menge[j]:=Menge[j-1]; Menge[j-1]:=Menge end end end; for i:=1 to anzahl do begin LBSort.items.add(IntToStr(Menge[i])); end end;
end. |
In der Zeile merke:=Menge[j]; kommt allerdings der Fehler eines Variablenkonfliktes mit Integer (merke) und Array (Menge). Daher bräuchte ich den Umrechnungscode.. sowas wie ArrToInt oder so funktioniert nicht, die Delphi-Hilfe hat mir auch nicht weitergeholfen.
Thx im Vorraus,
Delphin^^
|
|
Maweki
      
Beiträge: 197
Ubuntu Linux
Lazarus
|
Verfasst: Sa 04.06.05 18:44
Delphi-Quelltext
sollte doch
Delphi-Quelltext
heissen, oder??
und mach mal Leerzeichen
Edit:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68:
| unit UBubbleSort;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
const max = 100;
type TForm1 = class(TForm) LBRandom: TListBox; LBSort: TListBox; LRandom: TLabel; EAnzahl: TEdit; LSort: TLabel; BRandom: TButton; BSort: TButton; LAnzahl: TLabel; procedure BRandomClick(Sender: TObject); procedure BSortClick(Sender: TObject); private public end;
var Form1: TForm1; Menge: array [1..max] of Integer; implementation {$R *.dfm} procedure TForm1.BRandomClick(Sender: TObject); var i, Anzahl: Integer; begin Randomize; Anzahl := StrToInt(EAnzahl.Text); for i := 1 to Anzahl do LBRandom.Items.Add(IntToStr(Random(max) + 1)); end;
procedure TForm1.BSortClick(Sender: TObject); var i, j, merke, anzahl: Integer; begin LBSort.Items.clear; anzahl := High(Menge); for i := 1 to anzahl do for j := anzahl downto i do if Menge[j] < Menge[j - 1] then begin merke := Menge[j]; Menge[j] := Menge[j-1]; Menge[j - 1] := merke; end; for i := 1 to anzahl do LBSort.items.add(IntToStr(Menge[i])); end;
end. |
habs nochmal kurz formatiert...
|
|
-delphin- 
      
Beiträge: 200
|
Verfasst: Sa 04.06.05 18:55
Jetzt kommen in der Ausgabe der zweiten ListBox max - 1 Nullen (also im Moment 99) und als letztes immer die Zahl 9181752! Womit hängt das nun zusammen??
|
|
Maweki
      
Beiträge: 197
Ubuntu Linux
Lazarus
|
Verfasst: Sa 04.06.05 19:00
weil du ausserhalb deines Arrays rumspielst...
Delphi-Quelltext 1:
| Menge: array [1..max] of Integer; |
und du greifst teilweise auf das Element [0] zu. Also aender das mal nach
Delphi-Quelltext 1:
| Menge: array [0 .. max] of Integer; |
bzw (max - 1)
Edit:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.BSortClick(Sender: TObject); var i, j, merke, anzahl, Start: Integer; begin LBSort.Items.clear; Start := Low(Menge); anzahl := High(Menge); for i := Start + 1 to anzahl do for j := anzahl downto i do if Menge[j] < Menge[j - 1] then begin merke := Menge[j]; Menge[j] := Menge[j - 1]; Menge[j - 1] := merke; end; for i := Start to anzahl do LBSort.items.add(IntToStr(Menge[i])); end; |
Zuletzt bearbeitet von Maweki am Sa 04.06.05 19:02, insgesamt 1-mal bearbeitet
|
|
-delphin- 
      
Beiträge: 200
|
Verfasst: Sa 04.06.05 19:02
jetzt sind nur noch max nuller und keine 9181 usw. mehr dahinter :/
Edit: nach deiner Lösung sind es max + 1 Nullen
|
|
Maweki
      
Beiträge: 197
Ubuntu Linux
Lazarus
|
Verfasst: Sa 04.06.05 19:06
Zum ersten weist du Menge nie etwas zu...
Wird also komplett als null initialisiert (genauer gesagt 0).
Edit: natuerlich max + 1. Da die 0 ja dazu gehoert...
|
|
-delphin- 
      
Beiträge: 200
|
Verfasst: Sa 04.06.05 19:08
menge is ja mein array von 0 bis max. wie weise ich dem denn was zu und wozu benötige ich das?
|
|
Maweki
      
Beiträge: 197
Ubuntu Linux
Lazarus
|
Verfasst: Sa 04.06.05 19:14
|
|
-delphin- 
      
Beiträge: 200
|
Verfasst: Sa 04.06.05 20:32
Naya jetz sortier er zwar ordnungsgemäß, aber jetz haben wir ja anzahl rausgehauen, deshalb kann man nicht mehr bestimmen, wie viele zahlen er erstellen soll
|
|
Maweki
      
Beiträge: 197
Ubuntu Linux
Lazarus
|
Verfasst: Sa 04.06.05 20:36
wie jetzt?? Er macht den ganzen Array voll mit ZUfallszahlen. Schau in die Hilfe bzgl. Low und High wenn dir nciht ganz klar ist, was die bewirken...
|
|
-delphin- 
      
Beiträge: 200
|
Verfasst: Sa 04.06.05 22:27
jop aber ich hab ja noch ein editfeld, mit dem man entscheiden kann, wie viele zufallszahlen er erstellen soll. gespeichert werden die dann in anzahl (integer).
|
|
Maweki
      
Beiträge: 197
Ubuntu Linux
Lazarus
|
Verfasst: Sa 04.06.05 22:43
und was genau soll dann max??
ich meine, du hast einen statischen array den du mit dynamisch vielen Zahlen fuellst um ihn dann im ganzen auszulesen und zu sortieren ohne ihn ueberhaupt zu fuellen.
Ergibt fuer mich nich sonderlich viel Sinn 
|
|
-delphin- 
      
Beiträge: 200
|
Verfasst: Sa 04.06.05 22:48
Max ist einfach nur der Zahlenbereich, aus dem Zahlen genommen werden. Im Anhang ist das prog (;
Einloggen, um Attachments anzusehen!
|
|
Maweki
      
Beiträge: 197
Ubuntu Linux
Lazarus
|
Verfasst: So 05.06.05 07:03
nein, denn max ist auch die Laenge deines Arrays...
und imho hast du in deinem hochgeladenen Code nichts geaendert.
Zum ersten zwei eine empfehlung:
halte dich bitte an den Delphi Styleguide ( DELPHI STYLEGUIDE)
dein Code ist wirklich nicht schoen zu lesen.
Nochmal:
Delphi-Quelltext 1: 2:
| for i:=1 to Anzahl do LBRandom.Items.Add(IntToStr(Random(max)+1)); |
Du schreibst soviele Zufallszahlen in eine ListBox, wie in einem Editfeld angegeben wurde. Und das alles im Bereich eins bis inkl. max.
und in deinem Bubblesort-Code sortierst du den array Menge, den du nirgendswo mit Werten gefuellt hast...
Du sortierst NICHT LBRandom sondern den max Langen leeren(!) array Menge.
Also, nicht wundern, wenn bei der Sortierung eines leeren Arrays nur nullen als Ergebnis kommen. Das Verhalten ist absolut logisch und gerechtfertigt...
|
|
-delphin- 
      
Beiträge: 200
|
Verfasst: So 05.06.05 12:13
und wie änder ich das? oO
|
|
Maweki
      
Beiträge: 197
Ubuntu Linux
Lazarus
|
Verfasst: So 05.06.05 12:17
aendere das hier noch ein wenig ab, sodass es deinen Anforderungen enspricht.
Delphi-Quelltext 1: 2: 3: 4: 5:
| for i := Low(Menge) to High(Menge) do begin Menge[i] := Random(max) + 1; LBRandom.Items.Add(IntToStr(Menge[i])); end; |
du musst entweder nur den Array fuellen und ihn dann anzeigen, oder du fuellst den Array und die Liste parallel.
Aber im Moment fuellst du nur die Liste und sortierst dann den array...
|
|
-delphin- 
      
Beiträge: 200
|
Verfasst: So 05.06.05 13:29
hm aber der array wird doch gefüllt durch den random befehl in der schleife
|
|
Maweki
      
Beiträge: 197
Ubuntu Linux
Lazarus
|
Verfasst: So 05.06.05 13:34
wo bitteschoen? In deinem eigenen Code zumindest nicht...
|
|
Verion
Hält's aus hier
Beiträge: 9
XP
D7 ent.-trial
|
Verfasst: Do 09.06.05 20:35
Ich denke du meinst diese Zeile:
Delphi-Quelltext 1:
| LBRandom.Items.Add(IntToStr(Random(max)+1)); |
dadurch füllst du aber, wie gesagt nur deine listbox.
Delphi-Quelltext 1: 2: 3: 4: 5:
| for i:=1 to Anzahl do begin Menge[i] := Random(max)+1; LBRandom.Items.Add(IntToStr(Menge[i])); end; |
damit sollten dein array und deine listbox eigentlich gefüllt sein. Ich habe mich jetzt allerdings nur mit dem füllen des arrays beschäftigt und nicht geguckt ob das mit dem Rest deines Quelltextes zusammenpasst
mfg
Verion
|
|