Autor Beitrag
-delphin-
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: 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:

ausblenden volle Höhe Delphi-Quelltext
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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-1then
       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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 197

Ubuntu Linux
Lazarus
BeitragVerfasst: Sa 04.06.05 18:44 
ausblenden Delphi-Quelltext
1:
Menge[j-1]:=Menge					

sollte doch
ausblenden Delphi-Quelltext
1:
Menge[j-1] := merke					


heissen, oder??

und mach mal Leerzeichen ;)


Edit:
ausblenden volle Höhe Delphi-Quelltext
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  
    { Private-Deklarationen }  
  public  
    { Public-Deklarationen }  
  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 - 1then  
        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- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 197

Ubuntu Linux
Lazarus
BeitragVerfasst: Sa 04.06.05 19:00 
weil du ausserhalb deines Arrays rumspielst...
ausblenden Delphi-Quelltext
1:
Menge: array [1..max] of Integer;					


und du greifst teilweise auf das Element [0] zu. Also aender das mal nach

ausblenden Delphi-Quelltext
1:
Menge: array [0 .. max] of Integer;					


bzw (max - 1)

Edit:
ausblenden 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 - 1then    
        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- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 197

Ubuntu Linux
Lazarus
BeitragVerfasst: 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- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 197

Ubuntu Linux
Lazarus
BeitragVerfasst: Sa 04.06.05 19:14 
naja, das ding is ja voll mit nullen. Und die sortierst du und gibst sie aus. Ich denke mit der Zeile
ausblenden Delphi-Quelltext
1:
2:
for i := 1 to Anzahl do    
    LBRandom.Items.Add(IntToStr(Random(max) + 1));

meinst du
ausblenden 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;
-delphin- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 197

Ubuntu Linux
Lazarus
BeitragVerfasst: 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- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 197

Ubuntu Linux
Lazarus
BeitragVerfasst: 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- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 197

Ubuntu Linux
Lazarus
BeitragVerfasst: 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 (Suche bei Google DELPHI STYLEGUIDE)
dein Code ist wirklich nicht schoen zu lesen.

Nochmal:
ausblenden 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- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: So 05.06.05 12:13 
und wie änder ich das? oO
Maweki
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 197

Ubuntu Linux
Lazarus
BeitragVerfasst: So 05.06.05 12:17 
aendere das hier noch ein wenig ab, sodass es deinen Anforderungen enspricht.
ausblenden 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- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: So 05.06.05 13:29 
hm aber der array wird doch gefüllt durch den random befehl in der schleife
Maweki
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 197

Ubuntu Linux
Lazarus
BeitragVerfasst: 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
BeitragVerfasst: Do 09.06.05 20:35 
Ich denke du meinst diese Zeile:
ausblenden Delphi-Quelltext
1:
  LBRandom.Items.Add(IntToStr(Random(max)+1));					


dadurch füllst du aber, wie gesagt nur deine listbox.

ausblenden 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