Лабораторная работа №3. Массивы и векторы

Перед тем, как начать выполнение лабораторной, следует скачать заготовки и добавить их в свой проект. (обратите внимание на подключенные заголовочные файлы, на указатели и способ обхода массивов в файлах Lesson3.h и Lesson3.cpp. Также обратите внимание на объявление динамического массива в main.cpp)

Решения всех задач следует оформлять функциями в отдельном файле Lesson3.cpp. Функция main() должна демонстрировать вызов созданных функций. В такой схеме, очевидно, потребуется использование заголовочного файла. Для вывода на консоль элементов массива используем функцию-шаблон void printTheArray(T * a, int n, char delimiter = ' ')

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

Массивы

  1. void firstNOdd(int * a, int n); Дано целое число N (> 0) и адрес целочисленного массива длины N. Заполнить массив первыми N положительными нечётными числами: 1, 3, 5, … . Условным оператором не пользоваться.

  2. void firstNFibonacci(int * a, int n); Дано целое число N (> 0) и адрес целочисленного массива длины N. Заполнить массив первыми N числами Фибоначчи: \[ F_1=1,\,F_2=1,\, .... \, F_N=F_{N-1}+F_{N-2} \]

  3. int isArithmeticProgression(const int * a, int n);  Дан целочисленный массив размера N. Проверить, образуют ли его элементы арифметическую прогрессию. Если образуют, вернуть разность прогрессии, если не образуют - вернуть 0.

  4.  int quantityBeforeMinimal(const T * a, int n) Дан массив размера N. Найти количество элементов перед первым минимальным. Продемонстрировать его использование на массиве, заполненном случайными целыми числами и на массиве, заполненном случайными вещественными числами

    Указание. Для проверки работы используем две перегруженные функции  fillTheArrayWithRandomNumbers. В функции main() следует объявить массив, заполнить его случайными числами, вывести на консоль и продемонстрировать результат работы функции.

Векторы

Перед тем, как приступить, ознакомьтесь с материалами: Векторы на сайте cplusplus.com, Векторы на сайте cppreference.com
  1. Реализовать функцию-шаблон 

    template<class T>
    void DoubleVec(vector<T> &vec)
    , которая удваивает длину вектора и заполняет его вторую половину элементами из первой (используем  size(), push_back())

    Подсказка. Для цикла по элементам вектора используем циклы типа for: for (size_t i = 0; i < size; i++) или for (auto x : vec) (vec - имя вектора)
  2. Даны два вектора A и B одного размера. Вернуть вектор, сформированный по следующему правилу: каждый его элемент равен максимальному из элементов векторов A и B с тем же индексом.

    Указание Реализуем в виде шаблона
    template<class T>
    vector<T> zipVectors(const vector<T> & a, const vector<T> & b)
  3. Дан целочисленный вектор A. Записать в вектор B все числа из массива A, которые имеют в десятичной записи цифру 2.

    Указание 1: функция должна возвращать размер вектора B:

    int filterElemsWithDigitTwo(const vector<int> &a, vector<int> &b);

    Указание 2: в реализации функции воспользоваться функцией, которая проверяет, имеет ли данное целое в своей десятичной записи данную цифру:

    bool hasDigit(int n, int digit = 2);

    Её следует реализовать самостоятельно.

  4. Дан целочисленный вектор. Вычислить количество нечётных чисел в данном векторе, а также количество положительных чисел в нём

  5. Дан целочисленный вектор. Найти индекс его первого чётного элемента