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.
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
ridom hat folgendes geschrieben : |
| 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 public 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
Tryer hat folgendes geschrieben : |
| 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!