Недавно мы рассказали про язык Delphi — где применяется, что интересного и где он востребован. Теперь перейдём к практике и посмотрим на Delphi изнутри — как он устроен и как на нём программировать. Возможно, уже через пару часов вы начнёте реализовывать свою мечту — писать собственную программу складского учёта.
👉 Если вы проходили «Паскаль» в школе, то вы вряд ли узнаете что-то новое. В этом сила Delphi — это очень простой в освоении язык с поддержкой ООП и почти всех современных парадигм программирования.
В Delphi после каждого оператора ставится точка с запятой. Пропускать её нельзя — это будет ошибка и программа не запустится.
Комментарии
Чтобы поставить комментарий в Delphi, раньше использовали только фигурные скобки. Сейчас для комментариев кроме них можно ставить круглую скобку со звёздочкой или два слеша подряд, но с одной стороны:
{ Это комментарий }
(* Это тоже комментарий
на несколько строк *)
// А вот этот комментарий действует только до конца строки
При этом если после { или (* без пробела идёт знак доллара, то это уже не комментарий, а директива компилятору. Это значит, что мы можем переопределить стандартное поведение на то, которое нам нужно, например выключить проверку выхода значений переменной за границы диапазонов:
{$RANGECHECKS OFF}
А так мы превратим нашу программу в консольную, чтобы вся работа шла в командной строке:
{$APPTYPE CONSOLE}
Переменные
Для описания переменной используют ключевое слово var
:
var
X: Integer; // переменная целого типа
in, out: string; // две переменных строкового типа
result: Double; // переменная вещественного (дробного) типа
Без слова var сразу использовать переменную не получится: компилятор обязательно проверит, объявили ли вы её заранее или нет. Это сделано для контроля над оперативной памятью.
Ввод и вывод данных с клавиатуры
Чаще всего в Delphi делают программы с графическим интерфейсом, где есть поля ввода и кнопки. В этом случае данные получают оттуда, используя свойства разных компонентов. Но если нужно организовать ввод-вывод в консоли, то для этого используют такие команды:
write('Введите координаты X и Y: '); // выводим на экран строку
read(x,y); // считываем переменные x и y
После выполнения каждой команды курсор остаётся на той же строке:
write('Привет!');
write('Это журнал «Код».');
// на экране будет надпись в одну строчку и без пробела: Привет!Это журнал «Код».
Чтобы перенести курсор на новую строку после ввода или вывода, к команде добавляют в конец Ln:
writeLn('Привет!');
writeLn('Это журнал «Код».');
// Привет!
// Это журнал «Код».
Присваивание и сравнение
В отличие от большинства языков программирования, в Delphi оператор присваивания выглядит как двоеточие со знаком равно:
var x: integer;
...
x:=10;
Если вы видите в коде такое, то почти всегда это будет программа на Delphi или Pascal. Сравнение тоже выглядит не так как везде — одинарный символ равенства, как в математике:
:= ← присваивание
= ← сравнение
== ← а вот такого в Delphi нет
Остальные математические команды и операторы сравнения работают как обычно. Логические сравнения пишутся словами:
not ← НЕ
or ← ИЛИ
and ← И
Операторные скобки (составной оператор)
Во многих других языках границы функций, команд в условии и прочие границы обозначаются фигурными скобками, например в JavaScript: function fn() {...}.
А вот в Delphi такие границы задаются отдельными словами begin
и end
и называются операторными скобками, или составным оператором. Они используются для обозначения границ подпрограмм и там, где язык разрешает ставить только одну команду. Чтобы обойти это ограничение, используют операторные скобки. Простой пример:
if a > b then
begin
что-то полезное
end
else
begin
что-то другое полезное
end
Начало и конец основной программы тоже заключают в операторные скобки.
Условный оператор if
Классический оператор проверки условий, работает так же, как и в других языках:
if <условие> then
<оператор 1>
else
<оператор 2>;
Часть с else — необязательная, если она не нужна, то её можно не писать:
if <условие> then
<оператор 1>;
Так как после then можно ставить только один оператор, то, чтобы поставить больше, используют те самые операторные скобки:
if A > B then
begin
C := A;
writeLn('Первое число больше второго');
writeLn('Останавливаем проверку');
end
else
C := B;
Вкладывать условные операторы можно друг в друга сколько угодно.
Оператор множественного выбора case
Если нам нужно выбрать что-то одно сразу из нескольких вариантов, лучше использовать оператор выбора case
, который работает так:
- Оператор получает переменную, с которой будет работать, и несколько вариантов её значений.
- Затем по очереди проверяет, совпадает ли очередное значение со значением переменной.
- Как только находится совпадение — выполняется соответствующий оператор, и case на этом заканчивается.
- Если ничего не совпало — то компьютер просто переходит дальше или выполняет то, что написано после else.
Вот как это может выглядеть в коде:
Write('Введите сегодняшнее число');
ReadLn(Day);
case Day of // начинается оператор множественного выбора
1..10: Writeln('Это начало месяца');
11..20: Writeln('Это середина месяца');
21..31: WriteLn('Это конец месяца');
else Writeln('Нет такого дня недели'); // что мы делаем, если ничего не подошло
end; // закончился оператор множественного выбора
Цикл с предусловием for
Особенность этого цикла в том, что мы в нём задаём не условие окончания, а чёткое количество шагов:
for <параметр цикла> := <значение 1> to <значение 2> do <оператор>;
Перевод:
for i := 0 to 99 do что-то полезное;
Логика такая:
- Нам нужно заранее объявить переменную цикла (написать как в JS let i = 1 — не получится).
- Этой переменной мы присваиваем начальное значение и указываем конечное.
- На каждом шаге цикла значение переменной будет автоматически увеличиваться на единицу.
- Как оно превысит конечное значение — цикл остановится.
Выведем числа от 1 до 10:
var I: Integer;
...
for I := 1 to 10 do Writeln(I);
Если нам нужно идти наоборот, в сторону уменьшения значения переменной, то вместо to используют downto:
var I: Integer;
...
// выведем числа в обратном порядке, от 10 до 1
for I := 10 downto 1 do Writeln(I);
Циклы с предусловием и постусловием
Эти циклы работают так же, как и в других языках программирования, поэтому освоиться в них будет проще.
Цикл с предусловием — это когда сначала проверяется условие цикла, и если оно верно, то цикл выполняется до тех пор, пока оно не станет ложным. В общем виде такой цикл выглядит так:
while <условие> do
<оператор>;
Выведем с его помощью числа от 1 до 10 (обратите внимание на операторные скобки):
var I: Integer;
...
I:=1;
while I < 11 do
begin
writeLn(I);
I++;
end;
Цикл с постусловием работает наоборот: он сначала выполняет тело цикла, а потом проверяет условие. Операторные скобки в нём не ставятся, потому что границы цикла задаются самими командами цикла:
repeat
<оператор 1>;
...
<оператор N>;
until <условие>;
Если условие становится истинным — цикл останавливается. Особенность такого цикла в том, что он выполнится как минимум один раз, прежде чем проверится условие.
var I: Integer;
...
I:=1;
repeat
writeLn(I);
I++;
until I > 10
Процедуры
В Delphi есть отдельный класс подпрограмм, которые называются процедурами. Если сильно упростить, то процедура — это функция, которая не возвращает никакого значения. Процедуры удобно использовать для организации логических блоков, например в одну процедуру вынести приветствие пользователя, в другую — отрисовку интерфейса, в третью — отправку данных на сервер. Все процедуры обязательно должны быть объявлены до начала основной части программы.
В общем виде объявление процедуры выглядит так:
procedure <имя> ( <список параметров, если они нужны> ) ;
const ...; // раздел констант
type ...; // раздел типов
var ...; // раздел переменных
begin // начало процедуры
<операторы>
end; // конец процедуры
Если какой-то раздел в процедуре не нужен, его можно пропустить. Сделаем процедуру, которая будет приветствовать пользователя и спрашивать его имя:
var name: string;
procedure hello; // объявляем процедуру
begin
writeln('Привет! Как тебя зовут? ');
readLn(name);
end;
begin // начало основной программы
hello; // вызываем процедуру
end.
В нашем примере имя пользователя попадёт в глобальную переменную name — доступ к глобальным переменным возможен из любого места программы.
Функции
Функции в Delphi работают точно так же, как и во всех остальных языках программирования. Единственное, о чём нужно помнить, — мы должны заранее определить, какой тип данных вернёт нам функция.
Для примера сделаем функцию возведения в степень: мы передаём в неё два числа, а оно возводит первое в нужную степень:
function power(x, y: double): double;
begin
result := Exp(Y * Ln(X)); // возвращаем результат работы функции
end;
begin // начало основной программы
Writeln('5 в степени 6 равно ', power(5, 6));
Readln; // ждём нажатия любой клавиши и выходим из программы
end.
Что теперь
Надевайте фланелевую рубашку, заваривайте чай в пакетике, подключайте мышку к порту PS/2 и садитесь программировать. Вам снова 16 лет, на завтра нет домашки, а в кармане свежая карточка на 500 мегабайт интернета.