Перейти к основному содержимому

5.16. Справочник по Pascal

Разработчику Архитектору Инженеру

Справочник по Pascal

Общая структура программы

Программа на Pascal состоит из заголовка, блока описаний и исполняемого блока.

program ИмяПрограммы;

{ Раздел описаний }
uses
Модуль1, Модуль2;

const
Константа1 = Значение1;
Константа2 = Значение2;

type
Тип1 = Определение1;
Тип2 = Определение2;

var
Переменная1: Тип1;
Переменная2: Тип2;

{ Подпрограммы }
procedure ИмяПроцедуры(Параметры);
begin
{ Тело процедуры }
end;

function ИмяФункции(Параметры): ТипРезультата;
begin
{ Тело функции }
ИмяФункции := Значение;
end;

{ Основной блок }
begin
{ Инструкции программы }
end.

Элементы структуры

  • program — объявляет имя программы. Необязательный элемент в некоторых диалектах.
  • uses — подключает модули или библиотеки. Располагается сразу после заголовка.
  • const — определяет именованные константы.
  • type — определяет пользовательские типы данных.
  • var — объявляет переменные.
  • begin ... end. — основной исполняемый блок программы. Завершается точкой.

Комментарии

Pascal поддерживает два вида комментариев:

  • { Это комментарий }
  • (* Это тоже комментарий *)

Комментарии могут быть вложены в другие комментарии только в формате { }.


Типы данных

Простые (скалярные) типы

Целочисленные типы

ТипДиапазон значенийРазмер (байт)
ShortInt-128 .. 1271
Byte0 .. 2551
SmallInt-32768 .. 327672
Word0 .. 655352
Integer-2147483648 .. 21474836474
LongInt-2147483648 .. 21474836474
Cardinal0 .. 42949672954
Int64-2^63 .. 2^63 - 18
QWord0 .. 2^64 - 18

В классическом Pascal доступны только Integer, Byte, Word, ShortInt, LongInt. Остальные — расширения Object Pascal.

Вещественные типы

ТипДиапазонЗначащие цифрыРазмер (байт)
Real2.9e-39 .. 1.7e3811–126
Single1.5e-45 .. 3.4e387–84
Double5.0e-324 .. 1.7e30815–168
Extended3.4e-4932 .. 1.1e493219–2010
Comp-2^63+1 .. 2^63-119–208
Currency-922337203685477.5808 .. 922337203685477.580719–208

В Turbo Pascal основной тип — Real. В современных реализациях чаще используют Double.

Логический тип

  • Boolean — принимает значения True или False.
  • Размер: 1 байт.
  • Также существуют ByteBool, WordBool, LongBool — для совместимости с API.

Символьный тип

  • Char — один символ ASCII (0..255).
  • Размер: 1 байт.
  • Для Unicode используется WideChar (2 байта) в Object Pascal.

Перечислимые типы

Определяются явно:

type
Color = (Red, Green, Blue);
Season = (Winter, Spring, Summer, Autumn);

Значения упорядочены. К ним применимы функции Ord, Pred, Succ.

Интервальные (ограниченные) типы

type
Age = 0..120;
Digit = '0'..'9';
SmallIndex = 1..10;

Интервальные типы ограничивают допустимые значения базового типа.


Структурированные типы

Массивы (array)

Объявление:

var
A: array[1..10] of Integer;
B: array[0..99] of Real;
C: array['a'..'z'] of Char;

Многомерные массивы:

var
Matrix: array[1..5, 1..5] of Integer;
Cube: array[1..3, 1..3, 1..3] of Real;

Индексы могут быть любого порядкового типа (целые, перечислимые, символьные).

Строки (string)

  • В классическом Pascal: string[0..255] — ограниченная строка длиной до 255 символов.
  • Первый байт хранит длину строки.
  • В Object Pascal: AnsiString, UnicodeString, WideString, ShortString.

Пример:

var
S: string[20];
T: string; // неограниченная (в Object Pascal)

Операции:

  • Length(S) — длина строки.
  • S[i] — i-й символ.
  • + — конкатенация.
  • Copy(S, start, count) — подстрока.
  • Pos(sub, S) — позиция подстроки.
  • Delete(S, index, count) — удаление.
  • Insert(sub, S, index) — вставка.

Записи (record)

Группировка разнородных данных:

type
Person = record
Name: string[30];
Age: Integer;
Height: Real;
end;

var
P: Person;

Доступ к полям: P.Name, P.Age.

Вложенные записи:

type
Address = record
Street: string[50];
City: string[30];
end;

Employee = record
Info: Person;
WorkAddress: Address;
end;

Множества (set)

Коллекция значений порядкового типа (до 256 элементов):

type
CharSet = set of Char;
DigitSet = set of 0..9;
ColorSet = set of (Red, Green, Blue);

var
Vowels: CharSet;
Digits: DigitSet;

Операции:

  • + — объединение
  • * — пересечение
  • - — разность
  • in — проверка принадлежности

Пример:

Vowels := ['a', 'e', 'i', 'o', 'u'];
if 'a' in Vowels then ...

Файлы (file)

Типизированные файлы:

var
F: file of Integer;

Нетипизированные:

var
F: file;

Текстовые файлы:

var
F: text;

Операции:

  • Assign(F, 'filename.txt') — связывание с файлом
  • Reset(F) — открытие для чтения
  • Rewrite(F) — открытие для записи
  • Read(F, x) / Write(F, x)
  • Close(F)
  • Eof(F) — признак конца файла
  • Seek(F, n) — позиционирование

Операторы

Присваивание

x := 5;
name := 'Alice';

Условные операторы

if

if условие then
оператор1
else
оператор2;

Блоки:

if x > 0 then
begin
WriteLn('Положительное');
x := x * 2;
end
else
WriteLn('Не положительное');

case

case Day of
1: WriteLn('Понедельник');
2: WriteLn('Вторник');
3..5: WriteLn('Рабочий день');
6, 7: WriteLn('Выходной');
else
WriteLn('Неверный день');
end;

Выражение в case должно быть порядкового типа.

Циклы

for

for i := 1 to 10 do
WriteLn(i);

for i := 10 downto 1 do
WriteLn(i);

Переменная цикла должна быть порядкового типа.

while

while x < 100 do
begin
x := x + 1;
WriteLn(x);
end;

repeat ... until

repeat
ReadLn(x);
until x > 0;

Тело выполняется хотя бы один раз.


Процедуры и функции

Объявление

procedure PrintMessage(Msg: string);
begin
WriteLn(Msg);
end;

function Square(x: Integer): Integer;
begin
Square := x * x;
end;

Параметры

  • Значение (по умолчанию): procedure P(x: Integer); — копия.
  • Переменная: procedure P(var x: Integer); — передача по ссылке.
  • Константа: procedure P(const s: string); — защита от изменения.
  • Открытые массивы (в Object Pascal): procedure P(arr: array of Integer);

Рекурсия

function Factorial(n: Integer): Integer;
begin
if n = 0 then
Factorial := 1
else
Factorial := n * Factorial(n - 1);
end;

Встроенные функции и процедуры

Математические

  • Abs(x) — модуль
  • Sqr(x) — квадрат
  • Sqrt(x) — квадратный корень
  • Sin(x), Cos(x), Arctan(x)
  • Exp(x) — e^x
  • Ln(x) — натуральный логарифм
  • Trunc(x) — целая часть (вещественное → целое)
  • Round(x) — округление
  • Frac(x) — дробная часть
  • Int(x) — целая часть как вещественное число

Работа с типами

  • Ord(x) — порядковый номер (для порядковых типов)
  • Chr(n) — символ по коду
  • Pred(x), Succ(x) — предыдущее/следующее значение
  • High(x), Low(x) — верхняя/нижняя граница типа или массива

Работа со строками

  • Length(s)
  • Copy(s, i, n)
  • Pos(sub, s)
  • Concat(s1, s2, ...)
  • UpCase(c) — преобразует символ в верхний регистр (только латиница)

Работа с файлами

  • Assign(f, name)
  • Reset(f), Rewrite(f), Append(f)
  • Close(f)
  • Eof(f), Eoln(f)
  • Read(f, x), ReadLn(f, x)
  • Write(f, x), WriteLn(f, x)
  • Seek(f, n), FileSize(f), FilePos(f)

Преобразования

  • Str(x, s) — число → строка
  • Val(s, x, code) — строка → число (code = 0 при успехе)

Управление памятью (динамические структуры)

В классическом Pascal динамическое выделение ограничено указателями и записями.

type
PNode = ^TNode;
TNode = record
Data: Integer;
Next: PNode;
end;

var
P: PNode;
begin
New(P); // выделение памяти
P^.Data := 42;
Dispose(P); // освобождение
end;

Указатели:

  • ^ — разыменование
  • @ — взятие адреса

Модули

Модуль — автономная единица кода, содержащая объявления типов, констант, переменных, процедур и функций, которые можно использовать в других программах или модулях.

Структура модуля

unit ИмяМодуля;

interface

{ Объявления, доступные другим модулям }
uses
ДругойМодуль1, ДругойМодуль2;

const
PI = 3.14159;

type
TPoint = record
X, Y: Real;
end;

procedure DrawLine(P1, P2: TPoint);
function Distance(P1, P2: TPoint): Real;

implementation

{ Реализация процедур и функций }
procedure DrawLine(P1, P2: TPoint);
begin
{ ... }
end;

function Distance(P1, P2: TPoint): Real;
begin
Distance := Sqrt(Sqr(P2.X - P1.X) + Sqr(P2.Y - P1.Y));
end;

initialization
{ Код, выполняемый при загрузке модуля }

finalization
{ Код, выполняемый при выгрузке модуля }

end.

Разделы модуля

  • interface — публичный интерфейс. Всё, что объявлено здесь, видно извне.
  • implementation — реализация. Здесь пишутся тела процедур и функций.
  • initialization — необязательный блок, выполняется один раз при подключении модуля.
  • finalization — необязательный блок, выполняется при завершении программы.

Подключение модулей

В программе:

program Test;
uses
Crt, Graph, MyUtils;
begin
{ ... }
end.

Порядок в uses важен: если модуль A использует модуль B, то B должен быть указан до A или в его interface-разделе.


Директивы компилятора

Директивы управляют поведением компилятора. Они заключаются в фигурные скобки с символом $.

Часто используемые директивы

ДирективаНазначение
{$APPTYPE CONSOLE}Указывает, что приложение — консольное (Object Pascal)
{$R+} / {$R-}Включает/отключает проверку диапазонов массивов
{$Q+} / {$Q-}Включает/отключает проверку переполнения целых
{$I+} / {$I-}Включает/отключает проверку ввода-вывода
{$G+}Включает 32-битный код (Turbo Pascal)
{$M min, max}Устанавливает размер стека и кучи
{$DEFINE DEBUG}Определяет условный символ
{$IFDEF DEBUG} ... {$ENDIF}Условная компиляция

Пример условной компиляции:

{$IFDEF DEBUG}
WriteLn('Отладочная информация');
{$ENDIF}

Обработка ошибок

Классический Pascal не имеет встроенной системы исключений. Обработка ошибок осуществляется через:

  • Проверку кодов возврата (например, IOResult после операций ввода-вывода)
  • Использование {$I-} и последующую проверку IOResult

Пример:

{$I-}
Assign(F, 'data.txt');
Reset(F);
{$I+}
if IOResult <> 0 then
WriteLn('Ошибка открытия файла')
else
begin
{ работа с файлом }
Close(F);
end;

В Object Pascal (Delphi, Free Pascal) доступна полноценная обработка исключений через try ... except и try ... finally.


Сравнение реализаций Pascal

ХарактеристикаTurbo Pascal (1980–1990)Free PascalDelphi (Object Pascal)
Поддержка ООПНетДаПолная
ИсключенияНетДаДа
UnicodeНетОграниченнаяПолная
МногопоточностьНетЧерез APIДа
GUI-библиотекиBGI (графика)LCLVCL / FireMonkey
Совместимость с CНизкаяВысокаяСредняя
Активная разработкаПрекращенаДаДа

Для учебных целей часто используется Free Pascal с IDE Lazarus, так как он бесплатен, кроссплатформен и совместим с Turbo Pascal на уровне базового синтаксиса.


Примеры использования

Пример 1: Работа с массивом

program ArrayExample;
var
A: array[1..5] of Integer;
i, Sum: Integer;
begin
for i := 1 to 5 do
A[i] := i * i;

Sum := 0;
for i := 1 to 5 do
Sum := Sum + A[i];

WriteLn('Сумма квадратов: ', Sum);
end.

Пример 2: Рекурсия — вычисление НОД

function GCD(a, b: Integer): Integer;
begin
if b = 0 then
GCD := a
else
GCD := GCD(b, a mod b);
end;

Пример 3: Запись и файл

type
TStudent = record
Name: string[30];
Score: Integer;
end;

var
F: file of TStudent;
S: TStudent;
begin
Assign(F, 'students.dat');
Rewrite(F);
S.Name := 'Иванов';
S.Score := 85;
Write(F, S);
Close(F);
end.

Советы по стилю и читаемости

  • Используйте осмысленные имена переменных: Counter, TotalPrice, а не i, x.
  • Разделяйте логические блоки пустыми строками.
  • Комментируйте сложные алгоритмы.
  • Объявляйте одну переменную на строку.
  • Выравнивайте begin/end вертикально.
  • Избегайте глубокой вложенности — выносите логику в процедуры.
  • Используйте константы вместо магических чисел: MaxStudents = 100;
  • При работе со строками проверяйте длину перед доступом к символам.

Специфические особенности

Порядковые типы

Любой тип, значения которого можно пронумеровать целыми числами, называется порядковым. К ним относятся:

  • Все целочисленные типы
  • Boolean
  • Char
  • Перечислимые типы
  • Интервальные типы

К порядковым типам применимы функции:

  • Ord(x)
  • Pred(x)
  • Succ(x)
  • Low(T)
  • High(T)

Совместимость типов

Pascal строго типизирован. Присваивание возможно только между совместимыми типами. Например:

var
a: Integer;
b: Real;
begin
a := 5;
b := a; // допустимо: Integer → Real
a := b; // ошибка: Real → Integer без явного преобразования
a := Trunc(b); // правильно
end;

Явное преобразование типов осуществляется через функции (Trunc, Round) или приведение указателей (в продвинутых случаях).


Зарезервированные слова

Полный список ключевых слов Pascal (базовый набор):

and, array, begin, case, const, div, do, downto, else, end,
file, for, function, goto, if, in, label, mod, nil, not, of,
or, packed, procedure, program, record, repeat, set, then,
to, type, until, var, while, with

В Object Pascal добавляются:

class, constructor, destructor, inherited, override, virtual,
property, published, try, except, finally, raise, and many more

Ограничения классического Pascal

  • Максимальная длина строки — 255 символов.
  • Массивы имеют фиксированный размер на этапе компиляции.
  • Нет динамических массивов (в классическом варианте).
  • Нет встроенной поддержки строковых операций вроде ToLower.
  • Нет многопоточности.
  • Нет исключений.
  • Нет пространств имён.

Эти ограничения снимаются в современных реализациях (Free Pascal, Delphi).