Лекция 9. Массивы и константы
Здесь вы познакомитесь с массивами и константами, а также научитесь пользоваться репозиторием Delphi, в котором хранятся шаблоны и мастера для многих форм различного вида и назначения. Применение нового материала на практике.
Массивы
Немного сложная, но, безусловно, необходимейшая тема в программировании. Массив – это формальное объединение нескольких однотипных переменных в одну. То есть, массив рассматривается как одна переменная, он имеет одно имя, но на самом деле там имеется несколько переменных одного типа. Массивы, как и переменные, объявляются в разделе переменных var, и имеют такой синтаксис:
Имя_переменной : array [диапазон значений] of Тип_переменных_в_массиве;
Пример:
var
a : Integer; //переменная целого типа
b : array [1..10] of Integer; //массив целого типа
begin
Обратите внимание, что диапазон значений в массиве указывается произвольно, между первой и последней цифрой нет пробелов, но обязательны две точки. Пример диапазона может быть и таким: [5..7], какие цифры назначать – решать Вам. Обычно в практике приходится начинать диапазон с 1 или с 0, в зависимости от ситуации.
Обращение к отдельному разделу массива такое:
a := 5;
b[1] := a;
b[2] := b[1]+2;
То есть, сразу после имени массива ставятся квадратные скобки, внутри которых указывают индекс – номер элемента в массиве. Подобный массив можно воспринимать как таблицу с одной строкой и несколькими ячейками:
Рис. 9.1. Представление массива в виде таблицы
Поскольку в приведенном примере объявлен массив целых чисел типа Integer, каждой ячейке (элементу) массива будет выделено по 4 байта памяти, каждый такой элемент соответствует обычной переменной такого же типа. Подобные массивы называются одномерными. С многомерными и динамическими массивами мы познакомимся позже.
Как уже упоминалось, массивы могут быть любого типа:
var
a : array [0..3] of String;
b : array [1..5] of Real;
c : array [10..20] of Boolean;
Обработка массива
Массивы удобно использовать там, где приходится обрабатывать большое количество однотипных данных. Возьмем гипотетический пример: нужно перевести данные от 1 до 100 американских миль в привычные нам километры. Поскольку мы точно знаем, что у нас будет 100 элементов, можно воспользоваться массивом, а для его обработки удобней всего использовать цикл for:
var
i : Byte; //счетчик для for
a : Array [1..100] of Real; //массив для полученных данных
begin
for i := 1 to 100 do
a[i] := i * 1,609;
Что мы имеем в данном примере? При первом проходе цикла for счетчик i имеет значение 1, следовательно, в строке
a[i] := i * 1,609;
мы обращаемся к первому (a[1]) элементу массива, и присваиваем ему значение i, умноженное на 1,609 километров. Следовательно, в элемент массива a[1], который соответствует одной миле, попадает значение 1,609 километров. При втором проходе цикла i уже равен 2, значит, в элемент a[2] уйдет значение 2 * 1,609, то есть 3,218. И так далее, до конца массива. В дальнейшем, обратившись к нужному элементу массива, мы сможем узнать, скольким километрам будет равно данное количество миль:
ShowMessage('23 мили = ' + FloatToStr(a[23]) + ' километра');
Из приведенного выше примера вы можете почерпнуть полезный прием программирования: в качестве индекса массива можно указывать не только целое число, но и счетчик цикла, или значение любой переменной целого типа. Однако при программировании цикла следует соблюдать осторожность: если указать индекс, который не входит в диапазон значений массива, произойдет ошибка. Так, если бы мы попытались выполнить код
for i := 0 to 100 do
a[i] := i * 1,609;
то получили бы ошибку, так как уже при первом проходе мы обратились бы к элементу a[0], которого не существует.
Константы
Константы – это такие же, как переменные, ячейки оперативной памяти, значение которых нельзя изменить. То есть, вы однажды указали значение константы, и в дальнейшем обращаетесь к ней, как к обычной переменной, но присвоить ей другое значение уже не сможете. Константы удобно использовать, когда вы будете неоднократно обращаться к одному и тому же значению. Тип константы указывать не нужно, компилятор сам подбирает для нее подходящий тип. Константы описываются в разделе const, который всегда должен описываться перед разделом var:
procedure MyProc;
const
pi = 3.14;
MessageError = 'Текст сообщения об ошибке';
var
a : Integer;
b : String;
begin
...
end;
Константы, особенно глобальные, удобно использовать там, где вы работаете с каким-то определенным значением. Если в дальнейшем это значение поменяется, нет необходимости скрупулезно менять код во всей программе, достаточно изменить значениеконстанты. К примеру, вы производите расчет оклада, основываясь на сумме, соответствующей минимальной заработной плате. В таком случае не грех объявить константу MinZarPlat и присвоить ей текущее значение минимальной зарплаты.
В процессе расчета вам приходится умножать это значение на количество минимальных зарплат. Допустим, некто Сидоров имеет оклад, равный 5-ти минимальным зарплатам. В момент расчета вы умножаете 5 не на сумму минимальной зарплаты, а на константуMinZarPlat, которая и содержит нужное значение. А если через месяц или год сумма минимальной зарплаты изменится, то вам останется только заменить значение вашей константы на новое, не меняя при этом остального кода. Удобно, не правда ли?