Массивы

Lazarus IDE: Основы программирования в Windows 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));

Статья получилась больше, чем я ожидал. Но надеюсь, у вас хватило терпения дочитать её до конца...


Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

Яндекс.Метрика