3.1 Общая структура Паскаль – программы
____________________________________________________________________
y:= 2.8; n:= 10;
end; begin
x:= 1; y:= 1; n:= 1;
writeln('x= ', x:0:2, ' y= ', y:0:2, ' n= ', n); example(x, y, n);
writeln('x= ', x:0:2, ' y= ', y:0:2, ' n= ', n);
writeln(UTF8ToConsole('Нажмите любую клавишу'));
readkey;
end.
Как видите, после вызова процедуры значения переменных x, y, n не изменились.
В предыдущих двух примерах мы использовали передачу параметров по значению.
Передача параметров по ссылке
Другая ситуация при передаче параметров по ссылке. В этом случае изме-
нение параметра внутри функции (процедуры) влечет за собой и изменение значения переменной в вызывающей программе. Для передачи параметра по ссылке нужно перед именем параметра в заголовке указать ключевое слово var. Рассмотрим предыдущий пример, но передадим параметры x и n по ссыл-
ке.
program parameters;
{$mode objfpc}{$H+}
uses
156
Глава 3 Более сложные элементы языка
____________________________________________________________________
CRT, FileUtil;
var
x, y: real;
n: integer;
{Объявление процедуры с параметром}
procedure example(var x: real; y: real; var n: integer); begin
x:= 1.5; y:= 2.8; n:= 10;
end; begin
x:= 1; y:= 1; n:= 1;
writeln('x= ', x:0:2, ' y= ', y:0:2, ' n= ', n); example(x, y, n);
writeln('x= ', x:0:2, ' y= ', y:0:2, ' n= ', n);
writeln(UTF8ToConsole('Нажмите любую клавишу'));
readkey;
end.
Здесь уже значения переменных x и n изменились!
Передача параметров-констант
Если при передаче параметров по значению внутри функции (процедуры)
их значения можно изменять, то при передаче параметров как констант внутри функции или процедуры их вообще невозможно изменить. При попытке их из-
157
3.1 Общая структура Паскаль – программы
____________________________________________________________________
менения компилятор выдаст ошибку. Для передачи параметра как константы нужно перед именем параметра задать ключевое слово const.
program parameters; {$mode objfpc}{$H+} uses
CRT, FileUtil; var
x, y: real; n: integer;
{Объявление процедуры с параметром}
procedure example(var x: real; y: real;
const n: integer);
begin
x:= 1.5;
y:= 2.8;
{Попытка изменить параметр-константу}
//n:= 10; // здесь, если убрать комментарий, компилятор укажет на ошибку end;
begin x:= 1; y:= 1; n:= 1;
writeln('x= ', x:0:2, ' y= ', y:0:2, ' n= ', n); example(x, y, n);
writeln('x= ', x:0:2, ' y= ', y:0:2, ' n= ', n);
writeln(UTF8ToConsole('Нажмите любую клавишу'));
readkey;
end.
158
Глава 3 Более сложные элементы языка
____________________________________________________________________
3.1.1.5 Процедуры завершения
Для досрочного завершения функции или процедуры, а также основной программы применяются специальные процедуры exit и halt. Если exit
выполняется в функции (процедуре), то ее выполнение немедленно прекраща-
ется, даже если не все операторы были выполнены и управление передается вы-
зывающей программе (функции, процедуре). Далее будет выполняться сле-
дующий за вызовом этой функции (процедуры) оператор. Если exit выполня-
ется в основной программе, то работа программы завершается и управление пе-
редается операционной системе.
Процедура halt сразу завершает работу программы и передает управле-
ние операционной системе. Чаще всего halt используют для аварийного за-
вершения программы.
3.2. Еще раз о типах данных
До сих пор при составлении программ мы использовали всего три типа данных – целый, вещественный и логический, к тому же использовали не все их возможности. Однако в Паскале имеется очень широкий набор типов данных,
причем язык предусматривает создание пользовательских типов данных. Здесь мы дадим классификацию типов данных в Паскале и рассмотрим некоторые из них.
3.2.1 Классификация типов данных
Все типы в Паскале подразделяются на стандартные и пользовательские типы. Пользовательские типы создаются на основе стандартных. При описании пользовательских типов используется ключевое слово type.
159
3.2 Еще раз о типах данных
____________________________________________________________________
К стандартным типам относятся:
целый;
вещественный;
символьный;
логический.
Кроме того, все типы можно разделить на категории:
простые;
строковые;
даты и времени;
структурированные;
указатели;
объекты;
классы;
варианты.
Простые типы, в свою очередь, делятся на порядковые и вещественные.
Порядковый тип характеризуется тем, что каждому его значению можно поста-
вить в соответствие целое число – его порядковый номер в совокупности зна-
чений. Например, для целого типа само значение числа является его порядко-
вым номером. Для логического типа значению true соответствует 1, а значе-
нию false соответствует 0.
3.2.1.1 Целый тип
Кроме уже знакомого нам типа integer, в Паскале имеются и другие це-
лочисленные типы. Они различаются диапазоном представления целого числа в памяти компьютера (размером выделяемой памяти) и способом представления числа (со знаком или без знака). В таблице 3.1 приведены важнейшие характе-
ристики целочисленных типов данных (напоминаю, что мы рассматриваем язык применительно к компилятору Free Pascal).
160