W jaki sposób szybko obracać tablicę?

0

Cześć. Mamy sobie tablicę liczb:

 

Tablica: array [1..9] of byte = (1,2,3,4,5,6,7,8,9);

tmp: array [1..9] of byte = (1,2,3,4,5,6,7,8,9);

teraz w jaki sposób szybko obracać tablicą w prawą stronę, tak żeby nie zginęły liczby

 
Tablica[1] := tmp[2];
Tablica[2] := tmp[2];
Tablica[9] := tmp[1];

robiłem to ręcznie w 9 funkcjach, z pewnością da się to zrobić w pętli

0

Nie widzę żadnej prawidłowości w przykładzie, który podałeś.
Powiedz także w jakim celu potrzebujesz coś tak wymyślnego - może istnieje jakaś lepsza droga.

0

Piszę zasobnik. W zasobniku umieszczane będą elementy. Za każdym razem kiedy umieszczany jest element w zasobniku, wszystkie elementy muszą być przesunięte w prawo

0

Przykład prawdopodobnie powinien wyglądać tak:

Tablica[1] := tmp[2];
Tablica[2] := tmp[3];
Tablica[9] := tmp[1]; 

Można to zrobić mniej więcej tak:

Temp := Tablica[1];
For I := 1 To 8 Do
Begin
  Tablica[I] := Tablica[I + 1];
End;
Tablica[9] := Temp;
2

Zamiast przewracać dane w te i wewte mógłbyś zastosować jakiś view, który będzie przekształcał indeksy.

0
Tablica: array [1..10] of byte = (1,2,3,4,5,6,7,8,9,0);
Tablica[10]:=Tablica[1];
Move(Tablica[1],Tablica[2],SizeOf(Tablica)-SizeOf(byte));
2

To już nie lepiej było by wykorzystać listę?

1
xor01 napisał(a)

W zasobniku umieszczane będą elementy. Za każdym razem kiedy umieszczany jest element w zasobniku, wszystkie elementy muszą być przesunięte w prawo

I za każdym razem chcesz robić coś, czego robić nie powinieneś, czyli przesuwać całą pamięć; Po co to? Czy już nie ma innych struktur danych, niż tablice ze statycznym rozmiarem?

Jak chcesz mieć fajne i szybkie rozwiązanie, to użyj wskaźników do budowy tego kontenera - oczywiście całość opakuj sobie w klasę, żeby miało to wygląd i dało się wygodnie wykorzystywać; W zależności od konkretnych wymagań, możesz skorzystać ze stosu, kolejki, listy jedno- lub dwukierunkowej, a także jakiegokolwiek bufora cyklicznego (np. listy cyklicznej - implementacją sam się zająłem jakiś czas temu); Z tego co obskórnie opisałeś, potrzebujesz właśnie bufora cyklicznego;

Poza tym nie podałeś praktycznie żadnych przydatnych informacji, czyli czym są elementy i ile ich może być.

0

Być może podszedłem do tematu nie właściwie. Jaką listę? TStringList?

0

;d i tu pojawił się Exception...

jak tego użyć?

var
Menu: String;

begin
Menu := 'Lista';

  Lista := TList.Create;
  Lista.Add(@Menu);

  ShowMessage(Lista.Items[1]);

 
0

Można też od tylca indeksować tablice, wtedy nie trzeba nic z nią robić i to jest chyba najbardziej optymalne rozwiązanie ;)

2

Może tak?:

ShowMessage(PAnsiString(Lista.Items[0])^);
0

działa, dzięki zamykam temat

1

Iterowanie następuje od zera... Poza tym istnieje dedykowana klasa do ciągów znaków - TStringList

1 użytkowników online, w tym zalogowanych: 0, gości: 1