Как сдвинуть все элементы массива влево на 2?

166
08 ноября 2019, 04:20
#include "pch.h"
#include <iostream>
#include <Windows.h>
using namespace std;
void sdvig(int * m, int size, int sdv) {
    int max = *m;
    bool s = false;
    for(int i = 1; i < size; i++) {
        if (m[i] > max)
            max = m[i];
    }
        for (int * p = m; *p <= size; p++) {
                *p = (p - m) + (sdv + 1);
        } 
        int num = 0;
        while (!s) {
            for (int i = 0; i < size; i++) {
                if (m[i] <= max) num++;
                else s = 1;
            }
        }
        for (int * p = m + num; *p <= size; p++) {
            *p = (p - (m + num)) - 5;
        }
    for (int j = 0; j < size; j++) cout << m[j] << endl;
    cout << "      " << num << endl;
}
int main(int argc, const char * argv[]) {
    int m[5] = { 1, 2, 3, 4, 5 };
    sdvig(m, 5, 2);
    cin.get();
    return 0;
}

У меня такая проблема: мне нужно сдвинуть все элементы массива влево на 2. То есть если начальный массив {1, 2, 3, 4, 5}, то должно получиться {3, 4, 5, 1, 2}. В чем моя ошибка? Исправьте, если не трудно.

Answer 1

Чтоб обойтись без всяких временных массивов, проще всего развернуть массив - сначала весь, а потом две части:

void reverse(int * a, int begin, int end)
{
    for(int i = begin, j = end; i < j; ++i, --j)
    {
        int t = a[i];
        a[i] = a[j];
        a[j] = t;
    }
}
void rotate(int * a, int size, int count)
{
    reverse(a,0,size-1);
    reverse(a,0,count-1);
    reverse(a,count,size-1);
}

Это, конечно, если религия (или преподаватель) категорически запрещают использовать стандартную функцию rotate()...

Answer 2

Для сдвига массива лучше использовать memcpy и memmove.

#include <cstring>
#include <iostream>
void shift_left(int *arr, int size, int offset) {
    // массив для хранения элементов, которые перенесутся в конец
    int *tmp = new int[offset];
    // копируем во временный массив элементы, которые перенесутся в конец
    std::memcpy(tmp, arr, offset * sizeof(int));
    // сдвигаем элементы, начиная с arr[offset], на offset влево
    std::memmove(arr, &arr[offset], (size - offset) * sizeof(int));
    // копируем элементы из временного массива в конец исходного
    std::memcpy(&arr[size - offset], tmp, offset * sizeof(int));
    delete[] tmp;
}
int main(int argc, char *argv[]) {
    int m[5] = {1, 2, 3, 4, 5};
    shift_left(m, 5, 2);
    for (int i = 0; i < 5; ++i) {
        std::cout << m[i] << ' ';
    }
    std::cout << std::endl;
}
READ ALSO
Как мне заполнить массив?

Как мне заполнить массив?

Как мне заполнить массив вводом с клавиатуры через цикл, чтобы при присваивании элементам массива значений и при нажатии Enter курсор не перебегал...

146
WinInet, 301 редирект и отличия в версиях

WinInet, 301 редирект и отличия в версиях

Подскажите пожалуйста, есть функция для GET запроса через WinInetОна отлично отрабатывает на Win10 (мой домашний ПК) и на Win7 (один из серверов)

131
Создание копии на указатель

Создание копии на указатель

Как можно скопировать из указателя на int в новую переменную, пытаюсь

144
не выводит строку [закрыт]

не выводит строку [закрыт]

Программа выводи количество, цену, общую сумму, но не выводит номер товара и его названиеЧто не так?

140