Массивы

Что делать, чтобы стать программистом Что делать, чтобы стать программистом

Многие сегодня хотят стать программистами. Хотят. Но ничего не делают для этого. Не делают даже простых вещей. Не хотят даже прочитать книжку из 10 страниц. В итоге так и остаются никем. Потому что мечты не сбываются никогда. Сбываются только планы… Подробнее...

Массив - это набор элементов (компонентов), которые имеют одинаковый тип данных. Причём этот тип данных может быть как простым, так и сложным.

Элементы массива в памяти компьютера расположены друг за другом. Получить доступ к отдельному элементу массива можно по индексу этого элемента.

Любой массив имеет фиксированный размер. Таким образом, размерность массива - это количество индексов, необходимое для однозначного доступа к элементу массива.

Массив может быть как одномерным, так и многомерным. Например, таблица - это двухмерный массив (строки таблицы - это одна размерность массива, столбцы таблицы - вторая). Разумеется, таблицу можно представить как два одномерных массива. Но легче работать с одним массивом, нежели с двумя.

Наиболее часто используются одномерные и двухмерные массивы. Реже - трёхмерные. Массивы с большей размерностью я использовать не рекомендую (особенно новичкам), так как это чревато большим количеством труднонаходимых ошибок.

В качестве индекса массива может использоваться переменная. Эта переменная должна обязательно иметь порядковый тип.

Некоторые языки программирования и средства разработки имеют в своём арсенале динамические массивы, то есть массивы не с фиксированной, а с неопределённой размерностью.

Зачем нужны массивы? Ответ простой - для удобства (как, впрочем, и все языковые конструкции). Во многих случаях работать с массивом данных более удобно, чем с отдельными переменными.

Синтаксис массива в Паскале:

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

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