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

C++. Вопрос по функции memmove()

Дан заполненный целочисленный динамический массив. Как с помощью функции memmove(ДРУГИХ СПОСОБОВ НЕ ПРЕДЛАГАТЬ!!) выполнить копирование первой половины элементов массива во вторую (N/2), а второй части в первую соответственно?
int N = 5; //число элементов
int *data = new int[N]; //сам массив
for(int i=0;i<n;i++)> = rand;}//заполнение массива
Ег
Егор
3 193
Пример

Данная программа сдвигает содержимое массива str на 10 позиций в сторону младших адресов и выводит результат на дисплей.

#include <stdio.h>
#include <string.h>

#define SIZE 80

int main(void)
{
char str[SIZE], *p;

strcpy(str, "Когда, в случае если.. . ");
p = str + 10;

memmove(str, p, SIZE);
printf("результат сдвига: %s", str);

return 0;
}
Baurjan Tulebaev
Baurjan Tulebaev
9 830
Лучший ответ
Егор но здесь не надо младшие разряды ставить на бывшее место страших
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main() {
srand(time(0));

int n = 10;
int *d = new int[n];
for (int c = 0; c < n; ++c) cout << ' ' << (d[c] = rand() % 100);
cout << endl;

// используя цикл
for (int c = 0; c < n / 2; ++c) {
int tmp = d[n / 2 - c - 1];
memmove(&d[n / 2 - c - 1], &d[n / 2 - c], n / 2 * sizeof(d[0]));
d[n - c - 1] = tmp;
}
for (int c = 0; c < n; ++c) cout << ' ' << d[c];
cout << endl;

// используя дополнительный массив
int *tmp = new int[n / 2];
memmove(tmp, d, n / 2 * sizeof(d[0]));
memmove(d, d + n / 2, n / 2 * sizeof(d[0]));
memmove(d + n / 2, tmp, n / 2 * sizeof(d[0]));
for (int c = 0; c < n; ++c) cout << ' ' << d[c];
cout << endl;

// C++ style
swap_ranges(d, d + n / 2, d + n / 2);
for (int c = 0; c < n; ++c) cout << ' ' << d[c];
cout << endl;

return 0;
}

ЗЫ: учти, что для массива с нечетной длинной необходим дополнительный код, учитывающий это
Виталий К
Виталий К
94 443