Введение в программирование на 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, которая и содержит нужное значение. А если через месяц или год сумма минимальной зарплаты изменится, то вам останется только заменить значение вашей константы на новое, не меняя при этом остального кода. Удобно, не правда ли?

Пройденный материал на практике

Создадим немного глупый, но использующий все новые возможности проект. Создайте новый проект, переименуйте форму в fMain, а в свойстве Caption укажите "Случайные числа". Сохраните проект в новую папку. Проект назовите RandomNum.

Установите на форму Memo, удалите из него весь текст. Ниже – кнопку с названием "Генерировать".

(рис 9.2) Окончательный вид формы

В обработчике нажатий на кнопку впишем такой текст:

procedure TfMain.Button1Click(Sender: TObject);
const
    MaxValue = 1000;  //записываем максимальный размер случайных чисел
var
    a : array [1..100] of Integer; //массив целых чисел из 100 элементов
    i : integer;  //счетчик для for
    s : String;  
begin
    //вначале очистим Memo:
    Memo1.Clear;
    //Заполняем случайными числами от 0 до MaxValue-1 массив a:
    for i := 1 to 100 do
       a[i] := Random(MaxValue); 
    //данные из массива добавляем сначала в строковую переменную, затем в Memo:
    s := '';
    for i := 1 to 100 do
       s := s + IntToStr(a[i]) + ',   ';
    Memo1.Lines.Add(s);

end;

В результате выполнения этого кода мы получим строку s, в которой через запятую будут перечислены 100 случайных чисел от 0 до 999.

Оператор цикла repeat...until

Мы уже знаем условный цикл while, изучим еще один. Синтаксис цикла несложный:

repeat <тело цикла> until <условие>;

Если цикл while имел предусловие, то цикл repeat имеет постусловие, которое выполняется после тела цикла. Есть еще отличие – цикл while выполняется до тех пор, пока условие истинно, а цикл repeat будет выполняться, пока условие ложно. В цикле while, если условие изначально ложно, тело цикла никогда не будет выполняться. Repeat выполнит тело цикла по крайней мере, один раз. Затем оператор проверяет условие, и если оно ложно, выполняет тело цикла еще раз, и так до тех пор, пока <условие> не вернет истину. Еще одно замечание: зарезервированные слова repeat..until работают как скобки begin...end, поэтому в теле цикла может быть сколько угодно инструкций, которые уже не нужно заключать в begin..end. Пример:

i := 3;
repeat 
   i := i + 1;
   ShowMessage('i = ' + IntToStr(i));
until i > 10;

Форма About средствами Delphi

Форму About вовсе не обязательно разрабатывать самостоятельно, Delphi уже предоставляет нам такую форму. Нужно будет лишь изменить текст, и при необходимости, картинку.

В предыдущем проекте, где мы выводили случайные числа, создайте главное меню. В этом меню создайте пункты "Файл – Выход" и "Справка – О программе".

Выберите команду "File – New – Other". Откроется окно репозитария, своеобразной коллекции шаблонов и мастеров для создания нужного окна. Это окно имеет множество вкладок, в которых окна и шаблоны разбиты по тематикам. Перейдем на вкладку Forms и выберем шаблон "About box". Сразу же переименуем форму в fName, а свойству Caption новой формы присвоим текст "О программе". Форма имеет вполне законченный дизайн, осталось только вписать нужный текст в компоненты Label и при необходимости, сменить картинку.

В первой label напишем: "Product Name: RandomNums". Во второй: "Version: 1.0". Имейте в виду, что в мировом сообществе принято давать номера версий программ от 1.0 и выше. Если в следующей версии произошли незначительные изменения, назовите версию 1.1, потом 1.2 и так далее. Иногда даже указывают три цифры: 1.0.1, 1.0.2 и выше, решать вам. Если изменения значительные, практически у вас получилась другая программа, тогда называйте версию 2.0.

В третьей Label напишите "Copyright: свое ФИО". Этот раздел указывает, кто имеет авторское право на продукт. В четвертой Label находится раздел Comments. Здесь нужно очень коротко и по существу написать, что делает ваша программа, для чего она предназначена. Вы можете перевести все на русский язык. Вместо "Product Name" напишите "Программа". "Version" замените на "Версия". "Comments" замените на "Комментарии". А вот слово "Copyright" переводить не нужно, именно таким образом принято указывать авторское право в мировом сообществе.

Если вы сделали форму до конца, сохраните ее и пропишите в раздел uses главной формы. Далее в меню главной формы щелкните дважды по подразделу "О программе" и создайте там обработчик вызова новой формы.

Вернуться к учебному плану