Вы находитесь на странице: 1из 8

Министерство образования республики Молдова

Технический университет Молдовы


Кафедра «Автоматика и информационные технологии»

Отчёт

Лабораторная работа № 3
Тема: Обработка двумерных массивов на языке Си

Выполнил студент гр. TI-210 Кизицки М.


Проверил Брынзан Л.

Кишинёв 2020
Содержание
Цель работы……………………………………………………………………………………..3
Задание…………………………………………………………………………………………..3
Краткие факты об одномерных массивах в языке Си………………………………………...3-4
Реализация кода программы…………………………………………………………………....4-6
Вывод……………………………………………………………………………………………6
Список литературы……………………………………………………………………………..7
Листинг программы…………………………………………………………………………….8

2
Цель работы
Изучение возможностей и средств языка Си для программирования алгоритмов с использованием
двумерных массивов.

Задание
Дана целочисленная прямоугольная матрица. Определить номер первого из столбцов, содержащих
хотя бы один нулевой элемент.
Характеристикой строки целочисленной матрицы назовем сумму ее отрицательных четных
элементов. Переставляя строки заданной матрицы, расположить их в соответствии с убыванием
характеристик.

Краткие факты о двумерных массивах языке Си


Данный отчёт строится на основе использования двумерных массивов в языке Си. Вместо того,
чтобы по отдельности выполнять массу действий были созданы двумерные массивы. Для
представления набора однотипных данных используются массивы, являющиеся наряду с циклами
фундаментальным инструментом программирования. Массивы позволяют избегать дублирования
кода и разрабатывать компактные, понятные и красивые программы.
Для наиболее полного использования возможностей массивов они должны применяться в
комбинации с циклами, поэтому для успешного освоения данной темы необходимо уверенно
владеть работой с циклами.
Стандартом языка Си определены многомерные массивы. Простейшая форма многомерного
массива — двумерный массив.
Двумерные массивы представляют как матрицу, состоящую из строк и столбцов.
При объявлении массива должна быть выделена область памяти, достаточная для хранения всех
его элементов последовательно друг за другом.
Массивы объявляются так: int A[10];
При этом будет выделена память в объеме sizeof(int)*10 байт, а A — это идентификатор массива,
означающий адрес начала выделенной области.
Зарезервированная память для хранения 10 элементов типа int до ее инициализации будет
заполнена непредсказуемым мусором. Поэтому элементы массива, как и переменные, нужно перед
использованием обязательно инициализировать.
Особенность передачи массивов в функции в языке Си в том, что передается не сам массив, а
адрес массива, который хранится в локальном указателе на него.
Это можно сделать по-разному, но результат будет одинаковый:

Рисунок 1 – Передача адреса массива 3


Массив просто передается в функцию по имени (а его имя — это адрес первого элемента), а также
указывает параметр, который сообщает функции количество элементов, содержащихся в массиве:
show_array(little_numbers, 5);
Как и объекты любых других типов, указатели могут быть собраны в массив. Для передачи
массива указателей в функцию используется тот же метод, что и для любого другого массива: имя
массива без индекса записывается как формальный параметр функции. Например, следующая
функция может принять массив A в качестве аргумента:

Рисунок 2 – Принятие функцией массив А в качестве аргумента.


Необходимо помнить, что A — это не указатель на целые, а указатель на массив указателей на
целые. Поэтому параметр A нужно объявить как массив указателей на целые. Нельзя объявить A
просто как указатель на целые, потому что он представляет собой указатель на указатель.
В языке Си обращение к элементу массива — это прямое обращение к области памяти по адресу
элемента, который вычисляется по его индексу, и интерпретируется в соответствии с типом
массива. Отсюда и опасность бесконтрольного выхода за границы массива.

Реализация программы
Программа, разработанная для данного отчёта, представляет собой комбинации массива с
циклами, что позволяет полностью раскрыть все возможности массива, необходимые для
выполнения задания.
В начале происходит подключение заголовочных файлов, а также директив процессора.
Директива #define заменяет все вхождения <идентификатора> в исходном файле на <текст>,
следующий в директиве за <идентификатором>. Этот процесс называется макроподстановкой,
<идентификатор> заменяется лишь в том случае, если он представляет собой отдельную лексему.
Например, если <идентификатор> является частью строки или более длинного идентификатора,
он не заменяется. Если за <идентификатором> следует <список параметров>, то директива
определяет макроопределение с аргументами.

Листинг 1 – объявление заголовочных файлов и директив 4


Впоследствии объявляется функция main и массив array.

Листинг 2 – Объявление функции, массива и его заполнение.


Далее происходит выполнение первой части задания через двойной цикл for и цикл if (так как это
двумерный массив и для правильной работы программы необходим счётчик не только для строки
(как происходило в одномерных массивах), но и для столбцов.

Листинг 3 – Поиск номера первого из столбцов, который содержит 0


Также в коде программы осуществляется подсчёт характеристики, заданной условием задания.
Это реализуется двойным циклом for и циклом if (который хранит в себе условия: чётности числа,
принадлежности к той или иной строке, а также отрицательность числа. Полученные значения
присваиваются переменным для дальнейшего взаимодействия с данными значениями, так как
далее будет проходить сортировка в порядок убывания через XOR (Исключающее ИЛИ или как
его называют, XOR устанавливает бит, если соответствующие биты в операндах отличаются.)

Листинг 4 – Подсчёт характеристики строки


5
Листинг 5 – Сортировка в порядке убывания через XOR.
Выполняется проверка на соответствие значения характеристики и элемента отсортированных
элементов для того, чтобы был осуществлён вывод строк в порядке убывания их характеристик.
Цепочка if-else-if (вместо 9 циклов if) используется для того, чтобы избежать ошибок в работе
кода и задать верную последовательность действий.

Листинг 6 – Вывод отсортированных по характеристикам строк.


Код проекта доступен по ссылке: https://github.com/tischina/lab3/blob/main/lab3.c
Вывод
В ходе данной работы была создана программа, которая в сочетании двумерных массивов и
циклов выполняет различные манипуляции с элементами цикла. Из нереализованных
функциональностей, которые в дальнейшем следует добавить, можно выделить следующие
возможности. Во-первых, необходимо провести оптимизацию программы связанную с
сокращением количества переменных, используемых в коде программы. Во-вторых, следует учесть
недостатки циклов, которые были использованы для осуществления манипуляций со строками и в
дальнейшем избавиться от возможных ошибок.

6
Список литературы
1. “Язык Си: учебник и практический курс для начинающих” [электронный ресурс] : К.
Поляков 1995-2009.
2. «Алгоритмы и структуры данных» = «Algoritms and data structure» Вирт Н. — М.: Мир,
1989. — 360 стр

7
Приложение 1.
Исходный код программы.