Лабораторная работа №15

Часть 1. Коллекции

  1. шаблон accumulate (2)] Создайте шаблон функции, которая находит произведение элементов данного диапазона (диапазон, англ. range, всегда задаётся итераторами начала и конца), начиная умножение со значения init:

    template<class T, class It>
    T product(It beg, It end, T const & init);
    
    В основной программе продемонстрировать использование на различных коллекциях и типах элементов. Убедиться, что срабатывают тесты
    	int *a = new int[5]{ 1,2,3,4,5 };
    	auto aVec = vector<int>{ 1,2,3,4,5 };
    	auto aDeque = deque<int>{ 1,2,3,4,5 };
    	assert(product(a, a + 5, 1) == 120);
    	assert(product(aVec.begin(), aVec.end(), 1) == 120);
    	assert(product(aDeque.begin(), aDeque.end(), 1) == 120);
    
  2. [1 балл, шаблон for_each] Создайте шаблон функции, которая находит среднее арифметическое элементов данного диапазона:

    template<class T, class It>
    double mean(It beg, It end);

    — на основе лямбда-функции с захватом по ссылке переменных для суммы и для количества элементов. Сумма имеет тип double, а счётчик (count) — тип int.  В основной программе продемонстрировать использование на различных коллекциях и типах элементов

Часть 2. Матрицы

Двумерные прямоугольные массивы («матрицы») удобно моделировать с помощью массивов указателей:

int ** mat = new int *[rows]; // будущая матрица из rows строк

Каждый элемент mat[i] данного массива — это указатель, его следует инициализировать в цикле, присвоив ему результат new int [cols], где cols — желаемое количество столбцов матрицы.

Обращение к (ij)-му элементу матрицы выглядит так: mat[i][j]. Для обхода матрицы, также, как в случае обычного массива, можно использовать указатели.

Освобождать память из под матрицы необходимо в обратном порядке: сначала в цикле освобождается память для каждой строки: delete [] mat[i]. А затем освобождается память самого массива указателей matdelete [] mat. Эту процедуру следует оформить в виде функции с одним аргументом — rows (количество строк) — см. задачу 3 ниже.

  1. Определите функцию создания матрицы заданных размеров, все элементы которой равны заданному числу:

    int ** createMatrix(int rows, int cols, int value = 0);

    Значение по умолчанию 0 для параметра value должно быть указано только в заголовочном файле; в cpp-файле заголовок содержит три параметра в обычном виде.
    Значение по умолчанию говорит о том, что функцию можно вызвать с двумя аргументами, тогда значением параметра value будет число 0.

  2. Определите функцию заполнения матрицы заданных размеров случайными числами с заданными пределами для значений элементов:

    void fillRandomMatrix(int ** mat, int rows, int cols, int minValue = -10, int maxValue = 10);
  3. Создайте функцию печати матрицы:

    void printMatrix(int ** mat, int rows, int cols);
  4. Создайте функцию освобождения памяти, занятой матрицей:

    purgeMatrix(int ** mat, int rows);
  5. Создайте функцию, которая меняет местами i-й и j-й столбец матрицы.

  6. Даны две матрицы одинакового размера. Посчитайте их сумму, создав для этого новую матрицу.

Убедитесь, что в основной программе вы не забыли освободить память от использовавшихся матриц.