/*
MODYFIKACJA: teraz używamy wskaźników
Cykliczne przesuwanie wartości w tablice
Program wypisuje 15-elementową tablice i prosi użytkownika o wprowadzenie
liczby cyklicznych przesunięć, przesuwa elementy w tablice cykliczne
podaną ilość razy. Podana ilość może być ujemna - przesuwamy w drugą stronę.



















*/
#include <iostream>
#include <iomanip>
#include <limits>

using namespace std; // w starszych kompilatorach trzeba zakomentować ten wiersz

void Przesun(int *Tb,unsigned N,int P);

int main()
  {
   int Tb[15]={21,22,23,24,25,26,27,28,29,30,31,32,33,34,35};
   while(true)
     {
      for(short i=0;i<15;++i) cout<<Tb[i]<<' ';
      cout<<endl<<"Podaj ilosc przesuniec (0-koniec): ";
      int P;
      cin>>P;
      if(cin)
        {
         if(!P) break;
         Przesun(Tb,15,P);
        }
      else
        {
         cin.clear();
         cout<<"Blad wprowadzenia"<<endl<<endl;
        }
      cin.ignore(INT_MAX,'\n');
     }
   return 0;
  }

void Przesun_lewo(int *Tb,unsigned N);
void Przesun_prawo(int *Tb,unsigned N);

void Przesun(int *Tb,unsigned N,int P)
  {
   P%=(int)N; // bo przesunięcie tablicy 16 razy da ten sam efekt co 1 raz (jeżeli N=15)
   if(P) // jeżeli wyszło zero to wcale nie przesuwamy
     {
      int Z=(int)(N>>1);
      if(P>Z) P-=N; else if(P<-Z) P+=N; // optymalizacja: 14 w lewo = 1 w prawo (jeżeli N=15)
      if(P>0) while(P-->0) Przesun_lewo(Tb,N);
      else    while(P++<0) Przesun_prawo(Tb,N);
     }
  }

void Przesun_lewo(int *T,unsigned N)
  {
   int *K,X=*(K=T+(N-1));
   while(K>T) *(K--)=*(K-1);
   *T=X;
  }

void Przesun_prawo(int *T,unsigned N)
  {
   int *K=T+(N-1),X=*T;
   while(T<K) *(T++)=*(T+1);
   *K=X;
  }


