В этом домашнем задании Вам нужно написать несколько функций, работающих с указателями:
- Функция
swap
принимает два указателя наint
и меняет местами значения, на которые они указывают. Например:int x = 10; int y = -20; swap(&x, &y); REQUIRE((x == -20 && y == 10));
- Функция
sort_n
должна сортировать (стабильной сортировкой!) интервал в памяти, используя заданный способ сравнения. Она принимает указатель на начало интервала целых чисел, его длину и указатель на функцию сравнения. Например:static bool cmp_greater(int x, int y) { return x > y; } int array[] = {100, 3, 1, 2, 4, -100}; sort_n(array + 1, 4, cmp_greater); // sort [array+1..array+1+4) REQUIRE((array[1] == 4 && array[2] == 3 && array[3] == 2 && array[4] == 1));
- Функция
copy_n
должна копировать значения одного интервала в памяти в значения другого (той же длины). Она принимает указатель на начало интервала, откуда копировать, указатель на начало интервала, куда копировать и длину обоих интервалов. Пример:Обрабатывать копирование пересекающихся интервалов не требуется (подробнее см. ниже).int array[] = {100, 1, 2, 3, 200, 4, 5, 6, 300}; copy_n(array + 1, 3, array + 5); // copy [array+1..array+1+3) to [array+5..array+5+3) REQUIRE((array[5] == 1 && array[6] == 2 && array[7] == 3));
- Функция
rotate
должна циклически сдвинуть значения интервала в памяти влево на указанное количество позиций. Она принимает указатель на начало интервала, указатель на конец интервала и число, на которое нужно сдвигать. Гарантируется, что это число неотрицательное и меньше либо равно длины интервала. Например:int array[] = {100, 1, 2, 3, 4, 5, 6, -100}; rotate(array + 1, array + 7, 2); // rotates [array+1..array+7) to the left by 2 positions REQUIRE((array[1] == 3 && array[2] == 4 && array[3] == 5 && array[4] == 6 && array[5] == 1 && array[6] == 2));
При выполненнии задания обратите внимание на следующее:
- Начните с создания файла
utils.h
в папкеsrc
, в котором будут написаны заголовки функций. - Все файлы с кодом создавайте, пожалуйста, в папке
src
. Замечание: когда вы создадите свои cpp-файлы, по умолчанию их компилировать не будут. Чтобы их начали компилировать, добавьте их названия в CMakeLists.txt в строчкуadd_executable(tests "conf-src/sanitizers_configure.cpp" "tests/test.cpp" вот-сюда-вот)
- В этом домашнем задании есть два варианта: в базовом не требуется, чтобы
copy_n
мог обрабатывать пересекающиеся интервалы, в сложном требуется. Сложный вариант добавляет 0.5 к максимальной оценке. - Использовать функции стандартной библиотеки в этом задании нельзя.