Задание
https://stepic.org/lesson/Указатели-и-массивы-539/step/9
В этой задаче вам нужно реализовать функцию, которая сдвигает содержимое массива влево на заданное число позиций (циклический сдвиг).
На вход функция принимает массив, его размер и величину сдвига. Например, если на вход функции подан массив: int a[] = { 1, 2, 3, 4, 5 }; и требуется циклически сдвинуть его влево на 2 позиции, то на выходе мы получим числа в таком порядке: 3, 4, 5, 1, 2.
Обратите внимание, что величина сдвига может быть нулевой, а может быть и больше размера массива, все эти случаи нужно учесть.
Требования к реализации: вам нужно реализовать только функцию циклического сдвига. При этом она не должна вводить или выводить что-либо. При решении этой задачи вы можете определять любые вспомогательные функции, если они вам нужны. Реализовывать функцию main не нужно. Предполагается, что вам не потребуется дополнительная память, а именно: массивы и стандартные контейнеры. Пользоваться стандартными алгоритмами и контейнерами не разрешается, даже если вы с ними знакомы.
Рекомендация: перед тем, как начать кодировать решение этой задачи, продумайте алгоритм, который вы будете использовать. В данной задаче не проверяется эффективность этого алгоритма (в разумных пределах).
Подсказка: вам может потребоваться оператор % для вычисления остатка. Наиболее простая реализация этой функции несколько раз использует функцию, которая переставляет элементы массива в обратном порядке.
Решение:
{% highlight cpp %} #include using namespace std;
void print(int a[], unsigned size) { cout « a[0] « “, “; cout « a[1] « “, “; cout « a[2] « “, “; cout « a[3] « “, “; cout « a[4] « endl; }
void shifRec(int a[], unsigned size, unsigned i) { if (i != 0) { i–; shifRec(a, 5, i); } else { return; } a[i] = a[i+1]; }
void shif(int a[], unsigned size) { int f = a[0]; shifRec(a, size, size); a[size - 1] = f; }
void rotate(int a[], unsigned size, int shift) { for (int i = 0; i < shift % size; i++) { shif(a, size); } }
int main() { int a[5] = {1 ,2 ,3 ,4 , 5}; print(a, 5); rotate(a, 5, 7); print(a, 5); return 0; } {% endhighlight %}