Autor Beitrag
Slice
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: So 15.02.09 12:13 
Hey,
also wir sollen den Sortiervorgang von Quicksort grafisch darstellen. Also entweder in nem Image oder ner Paintbox. Hab allerdings keine Ahnung wie das gehen soll^^ könnte mir da mal jmd weiterhelfen? btw: muss bis heute abend fertig sein, aber ich denke es wird nicht sehr aufwendig sein oder?
Hier mal der aktuelle Quelltext:
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:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    Button2: TButton;
    PaintBox1: TPaintBox;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure vertauschen(var a,b:integer);
    procedure quicksort(links,rechts:integer);
  end;

var
  Form1: TForm1;
  zahl: array[1..100] of integer;
  i: integer;

implementation

{$R *.DFM}
procedure TForm1.vertauschen;
var
x:integer;
begin
x:=zahl[a];
zahl[a]:= zahl[b];
zahl[b]:=x;
end;

procedure TForm1.quicksort(links,rechts:integer);
var
i,j,x: integer;
begin
i:=links;
j:=rechts;
 if j>i then
 begin
 x:=zahl[(links+rechts)div 2];
 Repeat
  while zahl[i] < x do Inc(i);
  while zahl[j] > x do Dec(j);
  if i <= j then
   begin
   vertauschen(i,j);
   Inc(i);
   Dec(j);
   end;
 Until i>j;
  quicksort(links,j);
  quicksort(i,rechts);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
for i:=1 to 100 do
 begin
 zahl[i]:=random(100)+1;
 Listbox1.Items.add(IntToStr(zahl[i]));
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
begin
Listbox1.Clear;
quicksort(1,100);
for i:= 1 to 100 do
begin
 Listbox1.Items.Add(IntToStr(zahl[i]));
end;
end;

end.
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: So 15.02.09 12:24 
guck mal in die Delphi-Beispiele...
Slice Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: So 15.02.09 12:31 
user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
guck mal in die Delphi-Beispiele...


gehts nicht etwas genauer??^^ hab nix gefunden...
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 15.02.09 12:33 
In der Demo zu Threads gibt es ein Beispiel mit verschiedenen Sortieralgorithmen, u.a. Quicksort.
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: So 15.02.09 12:41 
Hatte ich schon vor ein paar Tagen hier geklärt:

www.delphiforum.de/v...rder=asc&start=0

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
Slice Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: So 15.02.09 13:35 
user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
Hatte ich schon vor ein paar Tagen hier geklärt:

www.delphiforum.de/v...rder=asc&start=0


ok habs aber trotzdem noch net ganz richtig ;) ich bekomme jetzt aber nur das fertig sortierte gezeichnet aber nicht das sortieren selbst...

so sieht jetzt der teil mit dem zeichnen aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.zeichnen;     //zeichnen
var
  k : integer;
  position : integer;
begin
position := 0;
PaintBox1.Canvas.Pen.Color := clLime;
for k := 1 to 400 do
    begin
    position := position +1;
    PaintBox1.Canvas.MoveTo (position, 400);
    PaintBox1.Canvas.LineTo (position, 400 - (zahl[k]));
    sleep(5);
    end;
end;
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: So 15.02.09 13:40 
Also ich habe das ganze so gestaltet:
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:
// Zeichnen
procedure TForm1.paint;
var
   i, j, k : integer;
   punkt, punkt2, posi : integer;
begin
PaintBox1.Refresh;
punkt  := 0;
punkt2 := 0;
posi := 0;
PaintBox1.Canvas.Pen.Color := clRed;
for k := 1 to 200 do
    begin
    posi := posi +2;
    PaintBox1.Canvas.MoveTo (posi, 400);
    PaintBox1.Canvas.LineTo (posi, 400 - (zahlen[k]));
    sleep(1);
    end;

PaintBox1.Canvas.Pen.Color := clBlack;
     PaintBox1.Canvas.MoveTo (0,0);
     PaintBox1.Canvas.LineTo (0,400);
     PaintBox1.Canvas.LineTo (400,400);
for i := 1 to 40 do begin
                    punkt := punkt + 10;
                    PaintBox1.Canvas.MoveTo (punkt,400);
                    PaintBox1.Canvas.LineTo (punkt,395);
                    end;
for j := 1 to 40 do begin
                    punkt2 := punkt2 + 10;
                    PaintBox1.Canvas.MoveTo (0, punkt2);
                    PaintBox1.Canvas.LineTo (5, punkt2);
                    end;
end;


Ich kann dir das Projekt auch schicken wenn du möchtest.

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 15.02.09 13:40 
Hast Du Dir denn nun die Thread-Demo angeschaut?
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: So 15.02.09 13:43 
Das Demoprojekt findest du bei Delphi 5 in C:\Programme\Borland\Delphi5\Demos\Threads.

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
Slice Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: So 15.02.09 13:45 
user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
Also ich habe das ganze so gestaltet:
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:
// Zeichnen
procedure TForm1.paint;
var
   i, j, k : integer;
   punkt, punkt2, posi : integer;
begin
PaintBox1.Refresh;
punkt  := 0;
punkt2 := 0;
posi := 0;
PaintBox1.Canvas.Pen.Color := clRed;
for k := 1 to 200 do
    begin
    posi := posi +2;
    PaintBox1.Canvas.MoveTo (posi, 400);
    PaintBox1.Canvas.LineTo (posi, 400 - (zahlen[k]));
    sleep(1);
    end;

PaintBox1.Canvas.Pen.Color := clBlack;
     PaintBox1.Canvas.MoveTo (0,0);
     PaintBox1.Canvas.LineTo (0,400);
     PaintBox1.Canvas.LineTo (400,400);
for i := 1 to 40 do begin
                    punkt := punkt + 10;
                    PaintBox1.Canvas.MoveTo (punkt,400);
                    PaintBox1.Canvas.LineTo (punkt,395);
                    end;
for j := 1 to 40 do begin
                    punkt2 := punkt2 + 10;
                    PaintBox1.Canvas.MoveTo (0, punkt2);
                    PaintBox1.Canvas.LineTo (5, punkt2);
                    end;
end;


Ich kann dir das Projekt auch schicken wenn du möchtest.


ok schick mal pls weil sonst wird das wieder nix^^
@ Deddy: jo hab ich aber da blick ich net durch xD
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: So 15.02.09 13:48 
Guck dir erst mal die Demo an, wenn du es nachher immer noch nicht verstehst schicke ich es dir.

Aber wenn ich es dir einfach so schicke gibt das ja keinen Lehreffekt. :wink:

PS: Komm in ICQ online.

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
Slice Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: So 15.02.09 13:57 
also so isses im mom (im anhang is noch das ganze prog)

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:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    Button2: TButton;
    PaintBox1: TPaintBox;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure vertauschen(var a,b:integer);
    procedure quicksort(links,rechts:integer);
    procedure zeichnen;
  end;

var
  Form1: TForm1;
  zahl: array[1..1000] of integer;
  i: integer;

implementation

{$R *.DFM}

procedure TForm1.vertauschen;
var
x:integer;
begin
x:=zahl[a];
zahl[a]:= zahl[b];
zahl[b]:=x;
end;

procedure TForm1.quicksort(links,rechts:integer);
var
i,j,x: integer;
begin
i:=links;
j:=rechts;
 if j>i then
 begin
 x:=zahl[(links+rechts)div 2];
 Repeat
  while zahl[i] < x do Inc(i);
  while zahl[j] > x do Dec(j);
  if i <= j then
   begin
   vertauschen(i,j);
   Inc(i);
   Dec(j);
   end;
 Until i>j;
  quicksort(links,j);
  quicksort(i,rechts);
  end;
end;

procedure TForm1.zeichnen;     //zeichnen
var
  k : integer;
  position : integer;
begin
position := 0;
PaintBox1.Canvas.Pen.Color := clLime;
for k := 1 to 400 do
    begin
    position := position +1;
    PaintBox1.Canvas.MoveTo (position, 400);
    PaintBox1.Canvas.LineTo (position, 400 - (zahl[k]));
    sleep(5);
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
for i:=1 to 1000 do
 begin
 zahl[i]:=random(1000)+1;
 Listbox1.Items.add(IntToStr(zahl[i]));
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
begin
Listbox1.Clear;
quicksort(1,1000);
for i:= 1 to 1000 do
begin
 Listbox1.Items.Add(IntToStr(zahl[i]));
end;
zeichnen;

end;

end.
Einloggen, um Attachments anzusehen!
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: So 15.02.09 13:59 
Die Procedure Zeichnen muss in die Quicksort Prozedur, damit du auch siehst wie es sich langsam sortiert.

So wie du es jetzt hast, zeichnet es nur das fertig Sortierte.

Kein Wunder. :)

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
Slice Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: So 15.02.09 16:00 
user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
Die Procedure Zeichnen muss in die Quicksort Prozedur, damit du auch siehst wie es sich langsam sortiert.

So wie du es jetzt hast, zeichnet es nur das fertig Sortierte.

Kein Wunder. :)


hab ich gemacht aber jetzt wird nur das gezeichnet, wie es vor dem sortieren aussieht und es passiert nix...
ausblenden 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:
procedure TForm1.quicksort(links,rechts:integer);
var
i,j,x: integer;
begin
i:=links;
j:=rechts;
 if j>i then
 begin
 x:=zahl[(links+rechts)div 2];
 Repeat
  while zahl[i] < x do Inc(i);
  while zahl[j] > x do Dec(j);
  if i <= j then
   begin
   vertauschen(i,j);
   Inc(i);
   Dec(j);
   end;
 Until i>j;
  quicksort(links,j);
  quicksort(i,rechts);
  end;
 zeichnen;
end;
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: So 15.02.09 16:39 
das muss ja auch in die schleife...
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: So 15.02.09 17:18 
user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
das muss ja auch in die schleife...


Nein muss es nicht, siehe mein Beispiel.
ausblenden 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:
// Quicksort
procedure TForm1.qsort (links, rechts : integer);
var
   i, j, pivot, hilf : integer;
begin
     i := links;
     j := rechts;
       if i < j then begin
          pivot := zahlen[(links+rechts) div 2];    // Pivotwert zuweisen
       Repeat
             while zahlen[i] < pivot do Inc(i);    // Vergleich
             while zahlen[j] > pivot do Dec(j);
         if i <= j then
            // Dreieckstausch
            begin
            hilf := zahlen[i];
            zahlen[i] := zahlen[j];
            zahlen[j] := hilf;
            Inc(i);
            Dec(j);
            end;
       until (i>j);
       // rekursiver Aufruf
       if links < j then qsort(links, j);
       if rechts > i then qsort(i, rechts);
                     end;
       paint;
end;


Wird wohl daran liegen, dass der Inhalt der PaintBox nicht aktualisiert wurde.

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.