/*
 * 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;
}
