CTRL85 Temat założony przez niniejszego użytkownika |
Przesuwane cykliczne tablicy » 2016-11-16 21:04:20 Witam! Mam do napisania program, który w tablicy będzie przesuwał cyklicznie zadany zakres tablicy (na wejście podany jest pierwszy indeks, długość fragmentu oraz wartość przesunięcia). Mój program działa poprawnie tylko wtedy, gdy EndIndex jest większy od StartIndex i nie mam pojęcia jak to naprawić. W zadaniu nie mogę używać wskaźników ani pomocniczych tablic. Na przykład dla wartości StartIndex = 3, length = 5 oraz shift = -7 działa poprawnie, bo wtedy EndIndex = 8, ale już gdy StartIndex = 8 nie, ponieważ wtedy EndIndex 'przeskakuje' na początek tablicy i ma wartość 1 a wtedy pętla się nie wykonuje. #define TabLength 12
...
tab[ TabLength ] = { 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22 }; int StartIndex = 8; int length = 5; int shift = - 7;
while( StartIndex < 0 ) StartIndex = StartIndex + TabLength;
SaveStartIndex = StartIndex = StartIndex % TabLength;
shift = shift % length; if( shift < 0 ) shift = shift + length;
EndIndex = StartIndex + length; EndIndex = EndIndex % TabLength;
for( int g = 0; g < shift; g++ ) { temp = tab[( EndIndex - 1 ) % TabLength ]; j = EndIndex - 1; for( int j = EndIndex - 1; j >( StartIndex ) % TabLength; j-- ) tab[ j ] = tab[ j - 1 ]; tab[ StartIndex % TabLength ] = temp; }
|
|
pekfos |
» 2016-11-16 22:25:22 Mój program działa poprawnie tylko wtedy, gdy EndIndex jest większy od StartIndex i nie mam pojęcia jak to naprawić. |
To gdy to zachodzi, zamień je ze sobą. To dalej ten sam zakres. |
|
CTRL85 Temat założony przez niniejszego użytkownika |
» 2016-11-16 22:51:34 Ale załóżmy, że StartIndex = 8, length = 5, TabLength = 12, czyli chcę przesunąć elementy o indeksach 8,9,10,11,0 a jak zamienię je ze sobą to program przesunie elementy o indeksach 0,1,2,3,4.
|
|
pekfos |
» 2016-11-16 23:25:13 To zależy jak interpretujesz ten zakres.
U ciebie ten problematyczny przypadek pojawia się przez to, że od razu liczysz indeks modulo dla EndIndex. Jeżeli będziesz dopuszczać, by zakres nie musiał pokrywać się z poprawnymi indeksami tablicy, to zawsze będziesz mieć end > start. Sprowadź te wartości do dozwolonych dla tablicy dopiero przy dostępie do niej. Będziesz mieć na tym przykładzie zakres [8, 13) zamiast [8, 1), dla indeksów tablicy [0, 12). Przesunięcie +2, ostatni element, nr 12, ląduje na indeksie 14. Żeby zapisać do tablicy robisz modulo 12 i masz indeks 2. Wychodzi na to samo, co robiąc modulo od razu (0+2=2). |
|
mateczek |
» 2016-11-17 20:40:47 Zobacz to? pomysł polega na tym by zamieniać kolejne ekementy. A gdy index wykroczy poza rozmiar tablicy to ustawić go z powrotem na 0; #include <iostream> int main() { const int tablenght = 12; int tab[ tablenght ] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; int StartIndex = 8, length = 5, shift = 3; for( int i = 0; i < shift; i++ ) { int baseindex = StartIndex; for( int j = 0; j < length - 1; j++ ) { if( baseindex == tablenght ) baseindex = 0; int nextindex = baseindex + 1; if( nextindex == tablenght ) nextindex = 0; std::swap( tab[ baseindex ], tab[ nextindex ] ); baseindex++; } } for( int element: tab ) std::cout << element << ","; }
|
|
« 1 » |