ТЕОРЕТИЧЕСКАЯ ЧАСТЬ. В языке программирования С заложены средства для задания последовательностей упорядоченных данных [1]
В языке программирования С заложены средства для задания последовательностей упорядоченных данных [1]. Такие последовательности называются массивами. В массивах должны быть упорядочены данные одного и того же типа. Рассмотрим массивы с целыми и вещественными типами данных, т. е. типы int, float или double. Массивы данных могут быть одномерными (векторами размера 1× n или n × 1), двухмерными (матрицами размера n × m) или многомерными (размера n × m × p ¼). В частности, для векторов и матриц в приведенной записи первый индекс означает количество строк, а второй (число или буква) – количество столбцов. Для названия массива может быть использована переменная, состоящая из букв (буквы), букв с цифрами, букв с цифрами и знаком подчеркивания и т. д. в соответствии с правилами объявления переменных, принятых в языке С. Если размерность массива меньше, чем требуется, то компилятор не выдаст сообщения об ошибке. Выход за границы массивов должен отслеживать только сам программист.
5.1. Одномерные массивы Одномерный массив – это список связанных однотипных переменных. Общая форма его записи: тип имя_массива[размер]; В приведенной записи элемент тип объявляет базовый тип массива. Количество данных, которые будут храниться в массиве с именем имя_массива, определяется элементом размер [2]. В языке С индексация массива начинается с нуля. Например, если размер массива определен величиной 10, то в нем можно хранить 10 элементов с индексацией 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Доступ к отдельному элементу массива осуществляется с помощью индекса. Индекс описывает позицию элемента внутри массива. Все массивы занимают смежные ячейки памяти, т. е. элементы массива в памяти расположены последовательно друг за другом. Ячейка памяти с наименьшим адресом относится к первому элементу массива, а с наибольшим – к последнему. Для одномерных массивов общий размер в байтах вычисляется по формуле всего байт = размер типа в байтах × количество элементов. В языке С нельзя присвоить один массив другому. Для передачи элементов одного массива другому присвоение необходимо выполнить поэлементно.
5.2. Двухмерные массивы, матрицы
Двухмерный массив представляет собой список одномерных массивов. Общая форма записи: тип имя_массива[размер1] [размер2]; В приведенной записи размер1 означает количество строк двухмерного массива, а размер2 – количество столбцов. В двухмерном массиве позиция любого элемента определяется двумя индексами. Индексы каждого из размеров массива начинаются с нуля. Место хранения для всех элементов массива определяется во время компиляции. Память, выделенная для хранения массива, используется в течение всего времени его существования. Для двухмерных массивов общий размер в байтах вычисляется по формуле всего байт = число строк × число столбцов × размер типа в байтах
5.3. Многомерные массивы
Общая форма записи многомерного массива: тип имя_массива[размер1] [размер2]¼ [размерN]; Индексация каждого размера начинается с нуля. Элементы многомерного массива располагаются в памяти в порядке возрастания самого правого индекса. Поэтому правый индекс будет изменяться быстрее, чем левый (левые). При обращении к многомерным массивам компьютер много времени затрачивает на вычисление адреса, так как приходится учитывать значение каждого индекса [2]. Следовательно, доступ к элементам многомерного массива происходит значительно медленнее, чем к элементам одномерного. В связи с этим многомерные массивы используются значительно реже, чем одно, или двухмерные. Для многомерных массивов общий размер в байтах вычисляется по формуле всего байт = размер1× размер2× ¼× размерN × размер типа в байтах Очевидно, многомерные массивы способны занять большой объем памяти, а программа, которая их использует, может очень быстро столкнуться с проблемой нехватки памяти. Для определения размера типа в байтах применяется функция sizeof(), которая возвращает целое число. Например, sizeof(float). 5.4. Инициализация массивов В языке С массивы при объявлении можно инициализировать [2]. Общая форма инициализации: тип имя_массива[размер1] ¼ [размерN] = {список_значений}; В список_значений входят константы, разделенные запятыми. Типы констант должны быть совместимыми с типом массива. Пример инициализации одномерного массива: int A[5] = {1, 2, 3, 4, 5}; При этом A[0] = 1, A[1] = 2 и т. д. При инициализации многомерного массива для улучшения наглядности элементы инициализации каждого измерения можно заключать в фигурные скобки. Пример инициализации двухмерного массива: int MN[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; Массив MN[3][4] – это матрица, у которой 3 строки и 4 столбца. Для многомерных массивов инициализацию можно также проводить с указанием номера инициализируемого элемента. Пример инициализации трехмерного массива: int XYZ[2][3][4] = { { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }, { {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24} } }; Как видно, массив XYZ содержит два блока, каждый из которых есть матрица размера 3 × 4, т. е. состоящая из 3 строк и 4 столбцов. В языке С возможна инициализация безразмерных массивов. Например, для одномерного массива int A[ ] = {1, 2, 3, 4, 5}; В многомерном массиве размер самого левого измерения также можно не указывать. В частности, для инициализации массива MN[3][4] допустима следующая запись: int MN[][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; При инициализации многомерных массивов необходимо указать все данные (размерности) за исключением крайней слева размерности. Это нужно для того, чтобы компилятор смог определить длину подмассивов, составляющих массив, и выделить необходимую память. Рассмотрим пример безразмерной инициализации для трехмерного массива целых чисел: int XYZ[][3][4] = { { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }, { {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24} } }; Вывод трехмерного массива на консоль (дисплей) можно выполнить по следующей программе.
|