Entwickler-Ecke

Algorithmen, Optimierung und Assembler - StringGrid mit Bubblesort sortieren


FlyMan - Mo 08.05.06 13:33
Titel: StringGrid mit Bubblesort sortieren
Hallo!
Wir sollen im Informatikunterrricht ein Programm erstellen das folgendermaßen aufgebaut ist:
Eine StringGrid Tabelle mit 100 Spalten soll durch eine Random Funktion über einen Button mit Zufallszahlen gefüllt werden. Über einen weiteren Button sollen die Zahlen mit Bubblesort sortiert werden (1-99) und über einen anderen Button invertiert (99-1) werden. Schließlich soll noch ein Button zum löschen des Inhaltes vorhanden sein.
Wer kann mir da weiterhelfen?
Vielen Dank im Vorraus.
Gruß
FlyMan


azubi_20 - Mo 08.05.06 13:37

Was hast du denn bis jetzt gemacht, bzw. wo hast du Probleme ?


FlyMan - Mo 08.05.06 13:49

Ich habe das Layout fertig. Weiterhin bekomm ich es hin, das in eine Spalte des StringGrids eine Zufallszahl geschrieben wird, die dann über den anderen Button gelöscht wird.
Über eine Schleife wäre es sicherlich am einfachsten, aber irgendwie bekomme ich das nur für einzelne Spalten hin...


azubi_20 - Mo 08.05.06 13:52

Poste doch mal deinen Quellcode, womit du eine Spalte füllst.


FlyMan - Mo 08.05.06 13:57


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:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    b_ende: TButton;
    b_sortieren: TButton;
    b_erzeugen: TButton;
    b_invertieren: TButton;
    b_loeschen: TButton;
    procedure b_endeClick(Sender: TObject);
    procedure b_erzeugenClick(Sender: TObject);
    procedure b_loeschenClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.b_endeClick(Sender: TObject);
begin
close;
end;

procedure TForm1.b_erzeugenClick(Sender: TObject);
begin
StringGrid1.Cells[1,1]:=random(99)+1;         Also so oder ähnlich, da ist irgendwo der Wurm drin.

end;

procedure TForm1.b_loeschenClick(Sender: TObject);
begin
StringGrid1.cells[1,0]:=' ';
end;

end.


Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt


azubi_20 - Mo 08.05.06 14:03


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.b_erzeugenClick(Sender: TObject);
begin
// Schleife mit 100 Durchläufen
 for Spalte := 0 to 99 do
  begin
    StringGrid1.Cells[Spalte,0]:=inttostr(random(99)+1); 
    //Der Inhalt der Spalte muss vom Typ "String" sein (deshalb STRINGGRID),
    //daher noch mit "inttostr" umwandeln.
  end;
end;


azubi_20 - Mo 08.05.06 14:25

Also, da du noch Sortierung reinbringen musst, sollte man die Daten und die Darstellung trennen.
Mein Vorschlag ist, folgende Prozeduren zu schreiben:

ErzeugeArray(anzahlElem:Integer);
SortiereArray(Richtung:Boolean);
FülleGrid;
LeereGrid;

Da den entsprechenden Code rein und an der richtigen Stelle aufrufen.


FlyMan - Mo 08.05.06 16:08

Ich hab das Programm jetzt soweit, dass ich die Spalten mit Zufallszahlen füllen kann.
Wir sollen das mit bubblesort sortieren und invertieren. Dazu haben wir zwar auch Unterlagen bekommen,
die allerdings schwer verständlich sind.


azubi_20 - Mo 08.05.06 16:30


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:
procedure TForm1.sort(Richtung : Boolean);
var
  Index: Integer;
  Lauf: Integer;
  x: Byte;
begin
  for Lauf := 1 to 98 do
    for Index := 99 downto Lauf do
    if Richtung then // (Richtung = true)
    begin
      if aZahlen[Index] < aZahlen[Index - 1then
      begin
        x := aZahlen[Index];
        aZahlen[Index] := aZahlen[Index - 1];
        aZahlen[Index - 1] := x;
      end;
    end
    else // (Richtung = false)
    begin
      //wenn Elemnt größer als vorhergehendes Element ...
      if aZahlen[Index] > aZahlen[Index - 1then
      begin
        // ... dann tauschen
        x := aZahlen[Index]; //Element in x zwischenspeichern
        aZahlen[Index] := aZahlen[Index - 1]; //Wert des vorherigen Elements in Element speichern
        aZahlen[Index - 1] := x; //Wert von x (=ursprüngliches Element) in vorheriges Elemnt speichern
      end;
    end;
end;


Aufruf mit sort(true) //Bubblesort vorwärts
oder sort(false) //Bubblesort rückwärts (invertieren)

statt aZahlen schreibst du den Namen deines Arrays


Edit :
Bubblesort : Es werden zwei Elemente verglichen und wenn nötig ausgetauscht.
mit dem Parameter "Richtung" wird entschieden, ob auf- oder abwärts sortiert werden soll


FlyMan - Mo 08.05.06 19:48

Moin,
könntest du bitte mal deinen kompletten Quelltext des Programms posten. Bei einem kompletten Quelltext kann ich die Thematik besser verstehen.


azubi_20 - Di 09.05.06 09:36

Ich glaub eher du kannst dann besser copy and paste machen... :roll:
Also du deklarierst ein Array, das 100 Integer-Werte aufnehmen kann.
In einer Schleife kannst du jedem Element eine Zufallszahl zuordnen.
In einer weiteren Schleife kannst du das Grid mit den Werten des Arrays füllen.
Sortieren : s.o.
Nach dem Sortieren musst du natürlich dein Grid neu befüllen, damit man das Ergebnis auch sieht.
Wenn du was nicht verstehst, kann ich gerne versuchen, es dir zu erklären, aber komplett fertigen Code gibts nicht. 8)


FlyMan - Mi 10.05.06 14:31

So ich hab das versucht mit Copy und Paste. Aber was ein Array ist habe ich nicht rausgefunden, beschäftige mich auch noch nicht so lange mit Delphi.
Mein aktueller Quelltext:


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:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    b_erzeugen: TButton;
    b_sortieren: TButton;
    b_invertieren: TButton;
    b_loeschen: TButton;
    b_close: TButton;
    procedure b_closeClick(Sender: TObject);
    procedure b_erzeugenClick(Sender: TObject);
    procedure b_loeschenClick(Sender: TObject);
    procedure b_sortierenClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.b_closeClick(Sender: TObject);
begin
close;
end;

procedure TForm1.b_erzeugenClick(Sender: TObject);
var i:integer;
begin
for i := 0 to 99 do
    StringGrid1.Cells[i,0]:=inttostr(random(99)+1);

end;

procedure TForm1.b_loeschenClick(Sender: TObject);
begin
StringGrid1.cells[0,0]:=' ';
end;

procedure TForm1.b_sortierenClick(Sender: TObject);
var
  Index: Integer;  
  Lauf: Integer;  
  x: Byte;  
begin  
  for Lauf := 1 to 98 do  
    for Index := 99 downto Lauf do  
    if Richtung then
    begin
      if aZahlen[Index] < aZahlen[Index - 1then
      begin  
        x := aZahlen[Index];  
        aZahlen[Index] := aZahlen[Index - 1];  
        aZahlen[Index - 1] := x;  
      end;  
    end  
    else
    begin
        if aZahlen[Index] > aZahlen[Index - 1then
        begin
        x := aZahlen[Index];
        aZahlen[Index] := aZahlen[Index - 1];
        aZahlen[Index - 1] := x;
      end;  
    end;  

end;

end.


Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt


azubi_20 - Mi 10.05.06 14:50

OK, das mit dem Copy'n'Paste war eher ein ironischer Hinweis, das ich dir nichts fertiges gebe, weil du dann nichts lernst. :roll:

Also zum Thema :
Ein Array [http://www.dsdt.info/tutorials/crashkurs/?page=6] ist sowas wie eine Tabelle.


Bisher erzeugst du die Zahlen direkt ins Grid, sie werden nicht gespeichert, du kannst also nicht darauf zugreifen und auch nicht sortieren.
Du musst trennen zwischen den Daten (gespeichert im Array) und der Darstellung (im Stringgrid).
Das sieht dann so aus : Du erzeugst eine Tabelle mit 100 Zahlen (=Array). Dann stellst du diese Zahlen in dein Grid.
Dein Array kannst du dann sortieren und anschliessend wieder im Stringgrid darstellen.


FlyMan - Mi 10.05.06 14:58

Heißt das, dass das Array im Hintergrund arbeitet und nicht in Form1 erzeugt werden muss?


azubi_20 - Mi 10.05.06 15:16

Naja, so ähnlich...
ein Array ist keine sichtbare Komponente (wie ein stringgrid) sonder eher ein Datentyp wie z.B. Integer. In einer Variable vom Typ Integer kannst du aber nur einen Wert speichern - in einem Array kannst du mehrere Werte des gleichen Datentyps speichern.

Beispiel für Integer:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
//...
var
 i : integer;
begin
 i := 12;
end;
/..



Beispiel für Array of Integer :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var  
 a : Array[0..99Of Integer; // 100 Elemnte, die Integer-Werte aufnehmen können
begin
  a[0]:= 15// 1. Element hat den Index 0 und den Wert 15
  a[1]:= 23// 2. Element hat den Index 1 und den Wert 23
  a[2]:= 63// 3. Element hat den Index 2 und den Wert 63
  //... usw
end;


DaKirsche - Mi 10.05.06 15:38

Etwas ähnliches mussten wir auch mal schreiben während meiner Schulzeit...
Die Zahlen werden ebenfalls in einem Stringgrid ausgegeben und dann Sortiert...

Musst mal schauen, ob du was mit dem Quellcode anfangen kannst...
Mfg


Tino - Mi 10.05.06 17:21

Hallo,

bitte ändere den Titel des Topics, da er wenig über das eigentlich Thema verrät. Hier der entsprechende Absatz aus den Richtlinien [http://www.entwickler-ecke.de/richtlinien.html]:

1.2 Beiträge:
Bitte formuliere den Betreff Deiner Beiträge so, dass andere Mitglieder anhand dieser bereits das eigentliche Thema festmachen können. Beiträge wie etwa "Eine Anfängerfrage" oder "Weiß jemand, wie das geht?" lassen den Leser im Unklaren darüber, was das Thema der Diskussion ist.[...]


Einfach oben bei Deinem ersten Beitrag auf user defined image klicken und den Titel ändern. Dank Dir!

Viele Grüße,
Tino


FlyMan - Do 11.05.06 15:34

Ja hab ich geändert....
Ich werd mir die Posts mal anschauen uns sehen was sich draus machen lässt.