Portál AbcLinuxu, 12. května 2025 01:21
1 2 3 4 5 6 1 2 3 4 5 6 6 1 2 3 4 5→5 1 2 3 4→4 5 1 2 3→3 4 5 1 2→2 3 4 5 1→1 2 3 4 5 6 1 2 3 4 5
public void orotujMatici() { int predchozi = 1; for (int i = 0; i < zadanaMatice.length - 1; i++) { for (int j = 0; j < zadanaMatice[0].length - 1; j++) { if((i == 0) && (j == 0)) predchozi = zadanaMatice[pocetRadku - 1][pocetSloupcu - 1]; if((j == 0) && (i != 0)) predchozi = zadanaMatice[i-1][pocetSloupcu - 1]; if(j != 0) predchozi = zadanaMatice[i][j - 1]; orotovanaMatice[i][j] = predchozi; } } }
class Matice: Matice (pocet_radku, pocet_sloupcu): M = new int[pocet_radku * pocet_sloupcu]; offset = 0 int prvek(int radek, int slupec): return M[ (pocet_sloupcu * radek + sloupec + offset) % (pocet_radku * pocet_sloupcu) ]; void orotuj(): offset += pocet_radku * pocet_sloupcu - 1; offset %= pocet_radku * pocet_sloupcu;a obesel bych se uplne bez kopirovani pameti. Samozrejme v realny aplikaci by volba konkretniho algoritmu zalezela na spouste dalsich faktoru ( napr. jak casto budu provadet tuhle operaci a jak casto nejaky jiny ? je tahle reprezentace matice vhodna i pro ostatni operace s ni ? atd. ... )
orotovanaMatice[0][0]= zadanaMatice[pocetRadku - 1][pocetSloupcu - 1]
Ale tak, ako som to pôvodne pochopil, by malo byť možné použiť systém, kedy máš metódu, ktorá zarotuje len jeden riadok a túto metódu postupne zavolať na všetky riadky. Inými slovami, nemá dochádzať k presunu medzi riadkami (a fungovanie takej metódy som navrhol vyššie). Ako je to? Daj príklad, na maticu, ktorá má viac ako jeden riadok.
Zdenek: pri tvojom riešení vymieňaš prvky. To znamená 3 priradenia na jeden krok. Pri mojom riešení, je to len jedno.
program shift_array implicit none integer, parameter :: max=6 integer :: i, j integer :: a(max) a = (/1, 2, 3, 4, 5, 6/) print'(a12,x,6(i2,1x))',"A(puvodni)= ",(a(i), i=1,max) a = cshift(a,-1) print'(a12,x,6(i2,1x))',"A(nova)= ",(a(i), i=1,max) end program shift_arrayA potom
[milan@penguin-shift-array]$ gfortran -o shift-array shift-array.f90 [milan@penguin-shift-array]$ ./shift-array A(puvodni)= 1 2 3 4 5 6 A(nova)= 6 1 2 3 4 5 [milan@penguin-shift-array]$
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.