Массивы
Lazarus IDE: Основы программирования в Windows
Несмотря на то, что всё потихоньку уходит в сеть, программирование для настольных компьютеров остаётся востребованным. И будет таковым ещё долго. Ну а самая распространённая операционная система для настольных компьютеров – это по-прежнему Windows. Поэтому любой программист, даже если он собирается стать веб-разработчиком, должен знать хотя бы основы создания программ для Windows. Подробнее... |
Массив - это набор элементов (компонентов), которые имеют одинаковый тип данных. Причём этот тип данных может быть как простым, так и сложным.
Элементы массива в памяти компьютера расположены друг за другом. Получить доступ к отдельному элементу массива можно по индексу этого элемента.
Любой массив имеет фиксированный размер. Таким образом, размерность массива - это количество индексов, необходимое для однозначного доступа к элементу массива.
Массив может быть как одномерным, так и многомерным. Например, таблица - это двухмерный массив (строки таблицы - это одна размерность массива, столбцы таблицы - вторая). Разумеется, таблицу можно представить как два одномерных массива. Но легче работать с одним массивом, нежели с двумя.
Наиболее часто используются одномерные и двухмерные массивы. Реже - трёхмерные. Массивы с большей размерностью я использовать не рекомендую (особенно новичкам), так как это чревато большим количеством труднонаходимых ошибок.
В качестве индекса массива может использоваться переменная. Эта переменная должна обязательно иметь порядковый тип.
Некоторые языки программирования и средства разработки имеют в своём арсенале динамические массивы, то есть массивы не с фиксированной, а с неопределённой размерностью.
Зачем нужны массивы? Ответ простой - для удобства (как, впрочем, и все языковые конструкции). Во многих случаях работать с массивом данных более удобно, чем с отдельными переменными.
Синтаксис массива в Паскале:
var ИмяМассива : array[0..15] of ТипДанных;
Здесь ИмяМассива - это имя переменной, связанной с этим массивом. ТипДанных - это тип данных элементов массива. Пример:
var M1 : array[0..15] of byte;
Здесь мы объявили массив с именем М1, который содержит 16 элементов типа byte с индексами от 0 до 15. первый элемент массива имеет индекс 0, второй - индекс 1 и так далее.
Работать с отдельным элементом массива можно так:
var m : byte;
M1[0] := 100;
m := M1[0];
Здесь мы сначала в первый элемент массива записываем значение 100, а потом в переменную m записываем значение первого элемента массива. Догадайтесь, какое значение будет в переменной m после этого))).
Но понять всю прелесть использования массивов вы сможете только тогда, когда попробуете обработать все элементы массива в цикле. Например, так:
for i := 0 to 15 do M1[i] := i;
for i := 0 to 15 do Write(M1[i], ' ');
Надеюсь, не надо объяснять, что делает этот код. А теперь представьте, сколько бы строк кода вам пришлось написать, если бы то же самое вы делали с помощью обычных переменных.
Двухмерный массив объявляется так:
M2 : array[1..4, 1..2] of byte;
Это будет матрица (или таблица) 4х2. То есть такой массив имеет некоторое количество строк (в нашем примере 4) и некоторое количество столбцов (в нашем примере 2). Того же результата можно достичь, если объявить массив массивов:
M2e : array[1..4] of array[1..2] of byte;
Здесь новичкам обычно трудно сообразить, что со всем этим “многомерьем” делать. Ну ничего, привыкайте. Первый массив - это строки таблицы. Второй - это столбцы. То есть каждый элемент первого массива содержит массив array[0..1]. Таблица (матрица), представленная нашим примером, выглядит так:
Строка 1, Столбец 1 | Строка 1, Столбец 2 |
Строка 2, Столбец 1 | Строка 2, Столбец 2 |
Строка 3, Столбец 1 | Строка 3, Столбец 2 |
Строка 4, Столбец 1 | Строка 4, Столбец 2 |
Таким образом,
М2[1, 1] - это ячейка 1.1 (первая строка, первый столбец)
М2[1, 2] - это ячейка 1.2 (первая строка, второй столбец)
М2[2, 1] - это ячейка 2.1 (вторая строка, первый столбец)
и так далее.
Если вы попробуете использовать, например, М2[1, 3], то компилятор выдаст предупреждение, так как столбца 3 в нашем массиве не существует. Однако будьте осторожны! В некоторых средствах разработки программа при этом будет создана (зависит от настроек среды)! И вы можете получить ошибку, которую в последствии будет трудно обнаружить.
А теперь пример использования нашего двухмерного массива:
//Заполняем массив for i := 1 to 4 do for j := 1 to 2 do M2[i, j] := i * 10 + j; //Выводим массив на экран for i := 1 to 4 do for j := 1 to 2 do Write(M2[i, j], ' ');
Как видите, здесь мы используем ДВЕ индексных переменных (i и j) и вложенные циклы. Как работают вложенные циклы - попробуйте догадаться сами. Если не получится - задайте вопрос в разделе ВОПРОСЫ. Этот раздел я стараюсь проверять хотя бы раз в день.
Надеюсь, с этим кодом вы разобрались. Или хотя бы запустили его и посмотрели, что он делает. А он выводит двухмерный массив на экран. Но вывод выполняется в одну строку. И это не очень удобно для двухмерного массива. Ведь обычно в таких массивах представлены матрицы (таблицы). То есть удобнее воспринимать информацию, если она будет выводиться в виде таблицы. В нашем случае хотелось бы получить 4 строки и 2 столбца.
Попробуйте решить эту задачу самостоятельно. А если у вас не получится, то вот один из вариантов решения:
for i := 1 to 4 do for j := 1 to 2 do case j of 1 : Write(M2[i, j], ' '); 2 : WriteLn(M2[i, j], ' '); end;
Это решение не является универсальным, так как его сложно применить к массивам с другой размерностью (с другим количеством столбцов). Но зато оно простое. И во многих случаях его можно использовать.
const k = 8; //Количество столбцов var i, j : byte; M2f : array[1..4] of array[1..k] of byte; //Заполняем массив for i := 1 to 4 do for j := 1 to k do M2f[i, j] := i * 10 + j; //Выводим таблицу for i := 1 to 4 do for j := 1 to k do case j of k : WriteLn(M2f[i, j], ' '); else Write(M2f[i, j], ' '); end;
Изучите внимательно этот пример и найдите все участки кода, где используется константа k. Дальше, надеюсь, вы разберётесь с этим кодом самостоятельно.
Ну и напоследок добавлю, что для определения индексов массива можно использовать уже известные нам по первым урокам стандартные функции Low и High. Например, так:
WriteLn('Индекс первого элемента М1 : ', Low(M1));
WriteLn('Индекс последнего элемента М1 : ', High(M1));
Статья получилась больше, чем я ожидал. Но надеюсь, у вас хватило терпения дочитать её до конца...