Entwickler-Ecke

Sonstiges (Delphi) - Array Rotieren lassen


ridom - Mi 29.09.10 18:18
Titel: Array Rotieren lassen
Hi leute habe als Schulaufgabe auf in ein Stringgrid über ein array zufallszahlen hinein zu schreiben das ganze ist ja kein Problem
jetzt soll ich aber diese zufallszahlen rotieren lassen sprich alle zahlen werden um 1 nach links gerückt und die vorderste hinten angehongen
hier eine Bsp:

erste zeile:

>> zufallszahlen
1 5 3 4

zweite zeile:

>> rotiert
5 3 4 1

das rotieren wollten wir jetzt so umsetzen


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  for i := 1 to 10 do
        begin
          zufall[i-1]:=zufall[i];
          stringgrid1.Cells[i,2]:=inttostr(zufall[i]);
          zufall[i]:=zufall[k];
        end;
  stringgrid1.Cells[10,2]:=inttostr(zufall[k]);


Gerd Kayser - Mi 29.09.10 18:41

Du hast zwar nicht geschrieben, welches Problem dabei auftritt, aber ich denke mal, Du hast nicht berücksichtigt, daß Du beim Rotieren / Vertauschen eine "Zwischenvariable" benötigst.

Zur Verdeutlichung:

Der Inhalt der Variablen A mit dem Wert 1 soll mit dem Inhalt der Variablen B mit dem Wert 2 vertauscht werden.

Delphi-Quelltext
1:
2:
A := B;
B := A;

Danach haben beide Variablen aber den gleichen Inhalt.
So gehts:

Delphi-Quelltext
1:
2:
3:
Temp := A;
A := B;
B := Temp;


elundril - Mi 29.09.10 18:43

wenn du es geschickt machst, musst du die zwischenvariable nur einmal setzen und auslesen. ;)

lg elundril


ridom - Mi 29.09.10 18:49

also das problem ist folgendes

zeile 1
5 4 2 6

beim 1 klick

zeile 2

5 4 2 5

beim 2 klick

4 2 6 4


Gerd Kayser - Mi 29.09.10 19:02

user profile iconridom hat folgendes geschrieben Zum zitierten Posting springen:
also das problem ist folgendes
Und genau für dieses Problem habe ich Dir oben den Lösungsweg geschildert.

Wink mit dem Zaunpfahl:

Delphi-Quelltext
1:
2:
3:
4:
Temp := A;
A := B;
B := C;
C := Temp;

Manchmal ist es sinnvoll, mit Papier und Bleistift zu arbeiten, um sich etwas zu verdeutlichen.


Tranx - Mi 29.09.10 21:28

Am besten schreibst Du eine Prozedur, die den Tausch vornímmt:


Ich habe ein Formular mit dem StringGrid und zwei Buttons definiert.


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

interface


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

const
  n = 10;
var
  Zufall : Array[0..n] of integer;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    bu_fuellen: TButton;
    bu_Rotieren: TButton;
    procedure bu_fuellenClick(Sender: TObject);
    procedure bu_RotierenClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}
procedure Tausch(var x1, x2 : integer);
var
  temp : integer;
begin
  Temp := x1;
  x1 := x2;
  x2 := Temp;
end;

procedure TForm1.bu_fuellenClick(Sender: TObject);
var
  i : integer;
begin
  for i := 0 to n do
  begin
    Zufall[i] := Round(random*100);
    Stringgrid1.Cells[0,i]:=IntToStr(i);
    Stringgrid1.Cells[1,i]:=IntToStr(Zufall[i]);
  end;
end;

procedure TForm1.bu_RotierenClick(Sender: TObject);
var
  i : integer;
begin
  for i:= 1 to n do
  begin
    Tausch(Zufall[i-1],Zufall[i]);
    stringgrid1.Cells[1,i-1]:=inttostr(zufall[i-1])
  end;
  stringgrid1.Cells[1,n]:=inttostr(zufall[n])
end;

end.


Das funktioniert so, wie Du es vorhast.


Tryer - Do 30.09.10 11:41

Warum das Array drehen wenn es reicht beim Auslesen mit einem Offset zu arbeiten?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm8.StringGrid1Click(Sender: TObject);
var
  i, r, c: Integer;
  Zufall: array of Integer;
begin
  SetLength(Zufall, StringGrid1.ColCount - StringGrid1.FixedCols);
  for i := 0 to High(Zufall) do
    Zufall[i] := Random(100);

  for r := StringGrid1.FixedRows to Pred(StringGrid1.RowCount)  do
    for c := 0 to High(Zufall) do
      StringGrid1.Cells[c + StringGrid1.FixedCols, r] :=
        IntToStr(Zufall[(r - StringGrid1.FixedRows + c) mod Length(Zufall)]);
end;


Grüsse, Dirk


Bergmann89 - Do 30.09.10 14:30

user profile iconTryer hat folgendes geschrieben Zum zitierten Posting springen:
Warum das Array drehen wenn es reicht beim Auslesen mit einem Offset zu arbeiten?

weil das eben die Aufgabe ist ;) (siehe 1. Post)

@Tranx: Deine Methode ist etwas umständlich und warscheinlich auch langsamer als von deinen Vorrednern beschrieben. Gerd Kayser hat die Lösung schon fast geschrieben, nur das er anstatt der Elemente im Array normale Variablen genommen hat. Jetz muss ridom nur noch eine Schleife drum rum bauen und dann wissen wir auch das er es verstanden hat un das is ja Sinn und Zweck der ganzen Sache...

Mfg Bergmann


Tryer - Do 30.09.10 15:18

Da steht nur das die Zahlen rotiert ausgegeben werden sollen, nicht das sie rotiert im Array stehen müssen ;)
Da wir nur eine (in diesem Punkt ungenaue) Beschreibung der Aufgabenstellung und nicht die Aufgabenstellung selber haben gibt es eine gewisse Interpretationsfreiheit.. und somit alternative Lösungswege.

EDIT: ja ich habe den Titel des Threads gelesen, aber der könnte auch aus einer Fehlinterpretation des Threaderstellers hervorgegangen sein. Bin gespannt was der Lehrer denn nun erwartet hat.

Grüsse, Dirk


ridom - Do 30.09.10 23:08

Also es hat jetzt funktioniert durch rum probieren ich weiss ist nicht ganz sinn der sache und ja der Lehrer wollte die zahlen im Array rotieren lassen und nicht in der Oberfäche ^^ aber danke nochmal für die hilfe