/*
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)>>1);
if(P>Z) P-=N; else if(P<-Z) P+=N; // optymalizacja 14 w lewo = 1 w prawo (jeżeli N=15)
      for(;P>0;--P) Przesun_lewo(Tb,N);
      for(;P<0;++P) Przesun_prawo(Tb,N);
     }
  }
                            
void Przesun_lewo(int T[],unsigned N)
  {
   int X=T[N-1];
   for(unsigned i=N-1;i>0;--i) T[i]=T[i-1];
   T[0]=X;
  }

void Przesun_prawo(int T[],unsigned N)
  {
   int X=T[0];
   for(unsigned i=1;i<N;++i) T[i-1]=T[i];
   T[N-1]=X;
  }

