Другие языки программирования и технологии

Помогите пожалуйста написать программу на c++. Циклически сдвинуть массив на k элементов влево.

#include <iostream>

using namespace std;

void arshift(int *a, int size, int sh) {
for (int i = 0; i < sh % size; ++i) {
int tmp = a[0];
for (int j = 1; j < size; ++j) {
a[j - 1] = a[j];
}
a[5] = tmp;
}
}

/*
// более оптимальный вариант с выделением дополнительной памяти,
// который тоже можно значительно улучшить, но не буду
void arshift(int *a, int size, int sh) {
sh = sh % size;
if (sh != 0) {
int *tmp = new int[sh];
for (int c = 0; c < sh; ++c) tmp[c] = a[c];
for (int c = 0; c < size - sh; ++c) a[c] = a[c + sh];
for (int c = 0; c < sh; ++c) a[size - sh + c] = tmp[c];
delete [] tmp;
}
}
*/

int main() {
cout << "array: ";
int a[] = { 1, 2, 3, 4, 5, 6 };
for (int j = 0; j < 6; ++j) cout << ' ' << a[j];
cout << "\nk? ";
int k;
cin >> k;
arshift(a, 6, k);
cout << "result:";
for (int j = 0; j < 6; ++j) cout << ' ' << a[j];
return 0;
}
Славон Беликов
Славон Беликов
51 512
Лучший ответ
проверь почту
#include <iostream>
#include <locale>

#include <iterator>
#include <algorithm>

#include <stdlib.h>
#include <time.h>

#define FROM -10
#define TO 10

struct R
{
int operator()() const
{
return rand() % (TO - FROM + 1) + FROM;// -10..10
}
};

template < typename FwdIterator >
void array_rotate(FwdIterator begin, FwdIterator end, ptrdiff_t K)
{
std::rotate(begin, begin + K, end);
}
}

int main()
{
setlocale(LC_ALL, "");
srand((unsigned) time(NULL));

int arr[10];
std::generate_n(arr, sizeof(arr) / sizeof(arr[0]), R());

typedef std::ostream_iterator< int > O;

std::cout << "Array: ";
std::copy(arr, arr + sizeof(arr) / sizeof(arr[0]), O(std::cout, " "));
std::cout << std::endl;

std::cout << "Rotate step (positive for left, negative for right): ";

ptrdiff_t K;
std::cin >> K;

K %= static_cast<ptrdiff_t>(sizeof(arr) / sizeof(arr[0]));
if (K < 0)
K += sizeof(arr) / sizeof(arr[0]);

array_rotate(arr, arr + sizeof(arr) / sizeof(arr[0]), K);

std::cout << "Rotated(" << K << "): ";
std::copy(arr, arr + sizeof(arr) / sizeof(arr[0]), O(std::cout, " "));
std::cout << std::endl;

return 0;
}