Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Przesuwane cykliczne tablicy

Ostatnio zmodyfikowano 2016-11-17 20:40
Autor Wiadomość
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.


C/C++
#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;
}
P-153797
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.
P-153805
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.

P-153809
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).
P-153812
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;

C/C++
#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++ ) { //ile zamian lenngt-1;
            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 << ",";
   
}
P-153856
« 1 »
  Strona 1 z 1