# C: Отчёт по третьей лабораторной работе ## Оглавление. [[_TOC_]] ## Задача 1. ### Условие. По матрице получить одномерный массив, присвоив его k-тому элементу значение 1, если элементы k-ой строки образуют монотонную последовательность, и значение 0 иначе. ### Решение. Разбил задачу на следующие модули: - `matrix.h` - работа с матрицей - `input_matrix_size` - ввод размеров матрицы - `input_array` - ввод массива (строки) - `input_matrix` - ввод матрицы - `output_matrix` - вывод мартрицы - `untils.h` - дополнительные функции - `process_matrix` - обработка матрицу, по условию - `is_monotonic_sequence` - проверка массива на монотонность - `is_preserves_sequence` - проверка массива на неубывание - `is_reverses_sequence` - проверка массива на невозрастание ### Возникшие проблемы. Возникли вопросы к определению монотонной последовательности, а именно, является ли монотонность без уточнения строгой или не строгой. Обратился к [Википедии]( https://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D0%BD%D0%BE%D1%82%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C), где нашёл четкое определение. > Монотонная последовательность — это последовательность, элементы которой с увеличением номера не убывают, или, наоборот, не возрастают. ### Тестирование. Для удобства тестирования изменил работу Makefile. Написал тесты и произвёл тестирование программы. Проверяю покрытие тестами. ``` $ make test gcc -Wall -Wextra -Werror -O0 -Wvla -std=c99 -pedantic -fprofile-arcs -ftest-coverage -o test.out ./main.c ./matrix.c ./untils.c ./test.out < ./tests/in_1.txt > temp.out; ./test.out < ./tests/in_2.txt > temp.out; ./test.out < ./tests/in_3.txt > temp.out; ./test.out < ./tests/in_4.txt > temp.out; gcov ./main.c; gcov ./matrix.c; gcov ./untils.c; File 'main.c' Lines executed:100.00% of 14 Creating 'main.c.gcov' File 'matrix.c' Lines executed:71.43% of 35 Creating 'matrix.c.gcov' File 'untils.c' Lines executed:92.59% of 27 Creating 'untils.c.gcov' rm -rf temp.out ``` Не удалось достичь 100% покрытия кода. Рассмотрим вывод утилиты `gcov`. Не покрыты тестами только участки кода, отвечающие за проверку нулевых указателей и функция вывода матрицы `output_matrix`. Данная функция мне понадобится в следующих задачах. ## Задача 2. ### Условие. Преобразовать исходную матрицу следующим образом: удалить из нее все столбцы, содержащие по крайней мере одно число, в записи которого встречается заданная цифра (при вводе данных сначала вводится матрица, затем цифра). ### Решение. Разбил задачу на следующие модули: - `matrix.h` - работа с матрицей - `input_matrix_size` - ввод размеров матрицы - `input_array` - ввод массива (строки) - `input_matrix` - ввод матрицы - `output_matrix` - вывод мартрицы - `output_array` - вывод массива (строки) - `remove_col_matrix` - удаление столбца матрицы - `untils.h` - дополнительные функции - `process_matrix` - обработка матрицу, по условию - `input_digit` - ввод числа и его проверка - `contain_digit` - проверка на вхождение разрадя в число ### Тестирование. Написал тесты и произвёл тестирование программы. Проверяю покрытие тестами. ``` $ make test gcc -Wall -Wextra -Werror -O0 -Wvla -std=c99 -pedantic -fprofile-arcs -ftest-coverage -o test.out ./main.c ./matrix.c ./untils.c ./test.out < ./tests/in_1.txt > temp.out; ./test.out < ./tests/in_2.txt > temp.out; ./test.out < ./tests/in_3.txt > temp.out; ./test.out < ./tests/in_4.txt > temp.out; ./test.out < ./tests/in_5.txt > temp.out; ./test.out < ./tests/in_6.txt > temp.out; gcov ./main.c; gcov ./matrix.c; gcov ./untils.c; File 'main.c' Lines executed:100.00% of 17 Creating 'main.c.gcov' File 'matrix.c' Lines executed:84.78% of 46 Creating 'matrix.c.gcov' File 'untils.c' Lines executed:92.31% of 26 Creating 'untils.c.gcov' rm -rf temp.out ``` Не удалось достичь 100% покрытия кода. Рассмотрим вывод утилиты `gcov`. Не покрыты тестами только участки кода, отвечающие за проверку нулевых указателей и проверку на корректность удаляемого столбца в функции `remove_col_matrix` ## Задача 3. ### Условие. Упорядочить строки матрицы по убыванию их наименьших элементов. ### Решение. В данной задаче важно обратить внимание, что алгоритм сортировки должен быть устойчивым. Решил реализовать алгоритм сортировки вставками. Разбил задачу на следующие модули: - `matrix.h` - работа с матрицей - `input_matrix_size` - ввод размеров матрицы - `input_array` - ввод массива (строки) - `input_matrix` - ввод матрицы - `output_array` - вывод массива (строки) - `output_matrix` - вывод мартрицы - `swap_rows_matrix` - обмен строк матрицы - `untils.h` - дополнительные функции - `sort_rows_matrix` - сортировка строк - `min_element` - находит минимальный элемент в массиве (строке) - `is_greater_row` - сравнение строк для сортировки ### Тестирование. Написал тесты и произвёл тестирование программы. Проверяю покрытие тестами. ``` $ make test gcc -Wall -Wextra -Werror -O0 -Wvla -std=c99 -pedantic -fprofile-arcs -ftest-coverage -o test.out ./main.c ./matrix.c ./untils.c ./test.out < ./tests/in_1.txt > temp.out; ./test.out < ./tests/in_2.txt > temp.out; ./test.out < ./tests/in_3.txt > temp.out; ./test.out < ./tests/in_4.txt > temp.out; ./test.out < ./tests/in_5.txt > temp.out; gcov ./main.c; gcov ./matrix.c; gcov ./untils.c; File 'main.c' Lines executed:100.00% of 14 Creating 'main.c.gcov' File 'matrix.c' Lines executed:84.44% of 45 Creating 'matrix.c.gcov' File 'untils.c' Lines executed:94.74% of 19 Creating 'untils.c.gcov' rm -rf temp.out ``` Не удалось достичь 100% покрытия кода. Рассмотрим вывод утилиты `gcov`. Не покрыты тестами только участки кода, отвечающие за проверку нулевых указателей ## Задача 4. ### Условие. Поменять местами элементы, расположенные в показанной на рисунке области (первая строка меняется с последней, вторая – с предпоследней и т.д.). Элементы, расположенные на главной и побочных диагоналях, включены в обмен. ![](images/lab_03/task4.1.png) ### Решение. Разбил задачу на следующие модули: - `matrix.h` - работа с матрицей - `input_matrix_size` - ввод размеров матрицы - `input_array` - ввод массива (строки) - `input_matrix` - ввод матрицы - `output_array` - вывод массива (строки) - `output_matrix` - вывод мартрицы - `untils.h` - дополнительные функции - `process_matrix` - обработка матрицу, по условию ### Тестирование. Написал тесты и произвёл тестирование программы. Проверяю покрытие тестами. ``` $ make test gcc -Wall -Wextra -Werror -O0 -Wvla -std=c99 -pedantic -fprofile-arcs -ftest-coverage -o test.out ./main.c ./matrix.c ./untils.c ./test.out < ./tests/in_1.txt > temp.out; ./test.out < ./tests/in_2.txt > temp.out; ./test.out < ./tests/in_3.txt > temp.out; ./test.out < ./tests/in_4.txt > temp.out; ./test.out < ./tests/in_5.txt > temp.out; ./test.out < ./tests/in_6.txt > temp.out; gcov ./main.c; gcov ./matrix.c; gcov ./untils.c; File 'main.c' Lines executed:100.00% of 16 Creating 'main.c.gcov' File 'matrix.c' Lines executed:83.78% of 37 Creating 'matrix.c.gcov' File 'untils.c' Lines executed:88.89% of 9 Creating 'untils.c.gcov' rm -rf temp.out ``` Не удалось достичь 100% покрытия кода. Рассмотрим вывод утилиты `gcov`. Не покрыты тестами только участки кода, отвечающие за проверку нулевых указателей ## Задача 4. ### Условие. Поменять местами элементы, расположенные в показанной на рисунке области (первая строка меняется с последней, вторая – с предпоследней и т.д.). Элементы, расположенные на главной и побочных диагоналях, включены в обмен. ### Решение. Разбил задачу на следующие модули: - `matrix.h` - работа с матрицей - `input_matrix_size` - ввод размеров матрицы - `input_array` - ввод массива (строки) - `input_matrix` - ввод матрицы - `output_array` - вывод массива (строки) - `output_matrix` - вывод мартрицы - `untils.h` - дополнительные функции - `process_matrix` - обработка матрицу, по условию ### Тестирование. Написал тесты и произвёл тестирование программы. Проверяю покрытие тестами. ``` $ make test gcc -Wall -Wextra -Werror -O0 -Wvla -std=c99 -pedantic -fprofile-arcs -ftest-coverage -o test.out ./main.c ./matrix.c ./untils.c ./test.out < ./tests/in_1.txt > temp.out; ./test.out < ./tests/in_2.txt > temp.out; ./test.out < ./tests/in_3.txt > temp.out; ./test.out < ./tests/in_4.txt > temp.out; ./test.out < ./tests/in_5.txt > temp.out; ./test.out < ./tests/in_6.txt > temp.out; gcov ./main.c; gcov ./matrix.c; gcov ./untils.c; File 'main.c' Lines executed:100.00% of 16 Creating 'main.c.gcov' File 'matrix.c' Lines executed:83.78% of 37 Creating 'matrix.c.gcov' File 'untils.c' Lines executed:88.89% of 9 Creating 'untils.c.gcov' rm -rf temp.out ``` Не удалось достичь 100% покрытия кода. Рассмотрим вывод утилиты `gcov`. Не покрыты тестами только участки кода, отвечающие за проверку нулевых указателей ## Задача 5. ### Условие. Элементы матрицы, сумма цифр которых больше 10, поместить в одномерный массив (в порядке просмотра матрицы по строкам), циклически сдвинуть элементы этого массива влево на три позиции, и вернуть элементы из массива в матрицу в том же порядке, в котором они помещались в массив. Если в матрице нет чисел, сумма цифр которых больше 10, на экран ничего выводить не нужно, функция main должна вернуть код ошибки ### Решение. Разбил задачу на следующие модули: - `matrix.h` - работа с матрицей - `input_matrix_size` - ввод размеров матрицы - `input_array` - ввод массива (строки) - `input_matrix` - ввод матрицы - `output_array` - вывод массива (строки) - `output_matrix` - вывод мартрицы - `untils.h` - дополнительные функции - `process_matrix` - обработка матрицу, по условию - `is_filtered` - проверка на элемент, сумма цифр которых больше 10 - `array_rotate_left` - циклический сдвиг влево на одну позицию ### Тестирование. Написал тесты и произвёл тестирование программы. Проверяю покрытие тестами. ``` $ make test gcc -Wall -Wextra -Werror -O0 -Wvla -std=c99 -pedantic -fprofile-arcs -ftest-coverage -o test.out ./main.c ./matrix.c ./untils.c x./test.out < ./tests/in_1.txt > temp.out; ./test.out < ./tests/in_2.txt > temp.out; ./test.out < ./tests/in_3.txt > temp.out; ./test.out < ./tests/in_4.txt > temp.out; ./test.out < ./tests/in_5.txt > temp.out; gcov ./main.c; gcov ./matrix.c; gcov ./untils.c; File 'main.c' Lines executed:100.00% of 14 Creating 'main.c.gcov' File 'matrix.c' Lines executed:83.78% of 37 Creating 'matrix.c.gcov' File 'untils.c' Lines executed:89.74% of 39 Creating 'untils.c.gcov' rm -rf temp.out ``` Не удалось достичь 100% покрытия кода. Рассмотрим вывод утилиты `gcov`. Не покрыты тестами только участки кода, отвечающие за проверку нулевых указателей