Разбить элементы массива на группы и преобразовать их

235
29 января 2018, 06:25

Помогите, пожалуйста, решить задачу по программированию в с++. Разбить элементы массива на группы по 4. В каждой четверке осуществить сдвиг влево на 1. Первый на 4 место. Если количество элементов в массиве не кратно 4, то для последней группы сдвиг осуществляется для того количества элементов, которое осталось Это нужно сделать без использования всяких навороченных штук, только с помощью циклов и т.д.

Answer 1

Имелся практически готовый код, переделал под Вашу задачу. Если разберетесь, будет хорошо. Можете убрать шаблоны, сделав под свои конкретные типы. Тогда как раз останутся одни функции с циклами.

#include <iostream>
#include <algorithm>

template<typename ForwardIterator>
void rotate(ForwardIterator begin, ForwardIterator first, ForwardIterator end)
{
    while (begin != first && first != end) {
        ForwardIterator beginCopy = first;
        for (; begin != first && beginCopy != end; ++begin, ++beginCopy) {
            std::iter_swap(begin, beginCopy);
        }
        if (begin == first) {
            first = beginCopy;
        }
    }
}

template<typename ForwardIterator>
void shift(ForwardIterator begin, ForwardIterator end, int step)
{
    std::ptrdiff_t dist = std::distance(begin, end);
    if (step == 0 || dist == 0) {
        return;
    }
    ForwardIterator first = (step < 0? begin: end);
    std::advance(first, -step % dist);
    //std::rotate(begin, first, end);   
    ::rotate(begin, first, end);
}

template<typename ForwardIterator>
ForwardIterator safe_advance(ForwardIterator begin, ForwardIterator end, int distance)
{
    //todo: negative distance
    //todo: optimize for random access iterator
    ForwardIterator it = begin;
    while (it != end && distance) {
        ++it;
        --distance;
    }
    return it;
}

template<typename ForwardIterator>
void shift_chunks(ForwardIterator begin, ForwardIterator end, unsigned chunk_size, int shift)
{
    while (begin != end) {
        ForwardIterator chunk_end = safe_advance(begin, end, static_cast<int>(chunk_size));
        shift(begin, chunk_end, shift_value);
        begin = chunk_end;
    }    
}

int main()
{
    int arr[] = {1, 5, 6, 4, 7, 8, 9, 8, 5, 3};
    shift_chunks(arr, arr + sizeof(arr) / sizeof(*arr), 4, -1);
    for (auto e: arr) {
        std::cout << e << " ";
    }
}

http://rextester.com/ZYA1914

READ ALSO
Множественная перегрузка операторов

Множественная перегрузка операторов

Неправильно сравнивает 2 массива, вместо false(-) выдает true(+)В чем проблема? (Функция помечена комментарием)

215
Натуральный логарифм числа

Натуральный логарифм числа

Какая функция вычисляет натуральный логарифм числа в C++?

214
память в куче C++

память в куче C++

ЗдравствуйтеНасколько я знаю ОС сама выделяет память под кучу, но как тогда работать с памятью если мы незнаем сколько ее в куче?

167
Приложение некорректно запрашивает права (permission)

Приложение некорректно запрашивает права (permission)

Имеется приложение, которое записывает звук и сохраняет его в памяти устройстваПри первом открытии активити, приложение выдало запрос на разрешение...

205