Задание 3. Динамические массивы. Указатели. С-строки

Скачайте пример работы с массивом и создайте проект.

Часть 1. Одномерные массивы в динамической памяти [30 баллов]

В следующих двух задачах требуется использовать размещение массивов в динамической памяти (new / delete).

  1. Дан массив целых чисел A, создать массив, в который входят только чётные элементы A. Вернуть новый массив и его длину.

    Указание 1 (заголовок). Поскольку под возвратом массива понимается возврат указателя, то int * можно сделать либо явным возвращаемым значением функции, либо передавать по ссылке, подразумевая выходной параметр. Следовательно, имеем два приемлемых варианта заголовка данной функции:

    • int * onlyEvens(int * a, int size, int & newSize);
    • void onlyEvens(int * a, int size, int * & evens, int & newSize);

    Указание 2 (алгоритм). Есть два подхода к решению подобных задач. Либо предварительно подсчитать количество чётных элементов и выделить нужное количество памяти под результирующий массив, либо выделить под результирующий массив максимально возможное количество памяти, которое может потребоваться (в данном случае это длина исходного массива). Имеем традиционный выбор между затратами по памяти в обмен затрат по времени или наоборот. Оба варианта приемлемы.

  2. Дан массив целых чисел A, создать массив, в котором после каждого элемента, последняя цифра которого равна трём, вставлено число 0.

  3.  Дан массив вещественных чисел. Удалить из массива все элементы, меньшие
    среднего арифметического элементов массива. 

Убедитесь, что в основной программе после печати результирующего массива вы не забыли освободить память (delete []).

Часть 2. Указатели и массивы [40 баллов]

Через указатели можно работать с любыми массивами. Решите следующие задачи, не пользуясь операцией индексации массива []:

  1. Дан массив целых чисел. Обнулить каждый второй его элемент.

  2. Дан массив целых чисел. Найти и обнулить максимальный элемент.

  3. Дан массив чисел. Организовать циклический сдвиг элементов массива на 1 элемент влево. Указание. Реализовать шаблон функции.


Часть 3. Указатели и С-строки [30 баллов]


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

  1. Дана строка. Подсчитать количество содержащихся в ней цифр.

    int countDigits(char * str);
  2. Дана строка. Определите указатель на ее последний символ. Верните «нулевой указатель» (число 0 или nullptr), если строка пустая.

    char * findLastChar(char * str);

    В печати результата данной функции на консоль удобно использовать тернарную условную операцию: 1) сохранить результат в переменной, 2) выводить значение этой переменной если она не равна 0/nullptr и сообщение типа <пустая строка> в противном случае. Всё это, конечно, делается внутри main.

  3. Поменяйте порядок символов в строке на противоположный. Для этого определите указатель на последний символ (используйте решение предыдущего задания), и, перемещая два указателя от начала и конца строки к середине, меняйте местами соответствующие символы.

    void reverseString(char * str);

    Указание: при проверке в assert следует использовать стандартную функцию сравнения строк strcmp.