Skip to content

YuMSh-Ivanov/cpp-pointers

Repository files navigation

Работа с указателями.

В этом домашнем задании Вам нужно написать несколько функций, работающих с указателями:

  1. Функция swap принимает два указателя на int и меняет местами значения, на которые они указывают. Например:
    int x = 10;
    int y = -20;
    swap(&x, &y);
    REQUIRE((x == -20 && y == 10));
  2. Функция 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));
  3. Функция 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));
    Обрабатывать копирование пересекающихся интервалов не требуется (подробнее см. ниже).
  4. Функция 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 к максимальной оценке.
  • Использовать функции стандартной библиотеки в этом задании нельзя.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published