Файл: Основы программирования на языке Pascal (Вариант 15).pdf
Добавлен: 02.04.2023
Просмотров: 297
Скачиваний: 2
Вслед за заголовком процедур/функций вместо тела может помещаться ключевое слово forward, это делается в том случае, если описание процедуры/функции располагается в программе после её вызова, и связано с
поддерживаемой в Паскале возможностью компиляции программы за один проход.
Стандартные математические функции и процедуры Паскаля
- Математические функции
|
Наименование функции |
Тип аргумента |
Тип значения |
Результат вычисления |
|
Abs(x) |
Целый вещественный |
Целый вещественный |
Абсолютное значение «х» |
|
Sin(x) |
Вещественный |
Вещественный |
Синус «х» рад. |
|
Cos(x) |
Вещественный |
Вещественный |
Косинус «х» рад. |
|
Arctan(x) |
Вещественный |
Вещественный |
Арктангенс «х» |
|
Sqrt(x) |
Вещественный |
Вещественный |
Квадратный корень из «х» |
|
Sqr(x) |
Целый вещественный |
Вещественный |
Значение «х» в квадрате |
|
Power(x) |
Вещественный |
Вещественный |
Значение «а» в степени «х» |
|
Exp(x) |
Вещественный |
Вещественный |
Значение «е» в степени «х» |
|
Ln(x) |
Вещественный |
Вещественный |
Натуральный логарифм «x» (х>0) |
|
Frac(x) |
Вещественный |
Вещественный |
Дробная часть «х» |
|
Int(x) |
Вещественный |
Вещественный |
Целая часть «х» |
|
Random |
- |
Вещественный |
Случайное число (0<=y<1) |
|
Random(x) |
Word |
Word |
Случайное число (0<=y<x) |
|
Succ(c) |
Порядковый |
Порядковый |
Следующий за «с» символ |
|
Pred(x) |
порядковый |
Порядковый |
Предшествующий «с» символ |
- Математические процедуры
|
Наименование функции |
Тип аргумента |
Тип значений |
Результат вычисления |
|
Inc(x) |
Целый |
Целый |
Увеличивает «x» на 1 |
|
Dec(x) |
Целый |
Целый |
Уменьшает «х» на 1 |
|
Inc(x, n) |
Целый |
Целый |
«х» на n (x:=x+n) |
|
Dec(x,n) |
Целый |
Целый |
«х» на n (x:=x-n) |
- Процедуры преобразования типов переменных
|
Наименование функции |
Тип аргумента |
Тип значения |
Результат вычисления |
|
Str(x, s) |
x - целый или вещественный |
s - строковый |
Последовательность символов «s» из цифр числа «х» |
|
Val(s, v, cod) |
s - строковый |
v - целый или вещественный cod - целый |
Двоичная форма числа последовательности «s» cod=0 (код ошибки) |
- Функции преобразования типов переменных
|
Наименование функции |
Тип аргумента |
Тип значения |
Результат вычисления |
|
Trunc(x) |
Вещественный |
LongInt |
Целая часть «х» |
|
Round(x) |
Вещественный |
LongInt |
Округление «х» до целого |
|
Odd(x) |
Целый |
логический |
Возвращает True, если «х» нечетное число |
|
Chr(x) |
Byte |
Char |
Символ ASCII кода «х» |
|
Ord(x) |
Char |
Byte |
ASCII код символа «х» |
Модули
До появления связных модулей в их современном виде некоторые реализации Паскаля поддерживали модульность за счёт механизма включения заголовочных файлов, похожего на механизм #include в языке Си:
с помощью специальной директивы, оформляемой в виде псевдокомментария, например, {$INCLUDE "файл"}, содержимое указанного файла прямо включалось в текст программы в исходном, текстовом виде. Таким образом, можно было разделить программный код на множество фрагментов, для удобства редактирования, но перед компиляцией они автоматически объединялись в один файл программы, который в итоге и обрабатывался компилятором. Такая реализация модульности примитивна и имеет множество очевидных недостатков, поэтому она была быстро заменена.
Современные реализации языка Паскаль (начиная с UCSD Pascal) поддерживают модули. Программные модули могут быть двух видов: модуль главной программы, который, как обычно, начинается с ключевого слова program и тело которого содержит код, запускаемый после загрузки программы в память, и вспомогательных модулей, содержащих типы, константы, переменные, процедуры и функции, предназначенные для использования в других модулях, в том числе в главном модуле.
Структура
Общая структура подключаемого модуля на Паскале выглядит следующим образом:
unit UnitName1;
interface
...
implementation
...
begin {может отсутствовать - используется, если необходимо поместить операторы инициализации}
...
end.
Возможен также ещё один вариант:
unit UnitName2;
interface
...
implementation
...
initialization
...
finalization
....
end.
Возможен еще один вариант:
unit UnitName2;
interface
...
implementation
...
initialization
...
finalization
....
end.
В отличие от главной программы, файл модуля начинается с ключевого слова UNIT, за которым следует имя модуля и точка с запятой. Современные реализации, как правило, требуют, чтобы имя модуля совпадало с именем файла исходного кода, в котором этот модуль содержится. Модуль содержит три секции: интерфейсную секцию, секцию реализации и тело модуля.
Интерфейсная секция идёт первой, начинается с ключевого слова INTERFACE и заканчивается в том месте модуля, где начинается секция реализации или тело. В интерфейсной секции объявляются те объекты (типы, константы, переменные, процедуры и функции — для них помещаются заголовки), которые должны быть доступны извне модуля. При этом допускается частичное объявление типов: они могут объявляться без указания структуры, одним только именем. При использовании такого типа во внешней программе допускается объявление переменных и параметров этого типа, присваивание значений, но невозможно получить доступ к деталям его реализации. Процедуры и функции в интерфейсной секции объявляются в виде форвардов — заголовков с параметрами, но без тела. Состав интерфейсной секции модуля таков, что его достаточно для генерации кода, использующего данный модуль. Переменные, объявленные в интерфейсной секции, являются глобальными, то есть существуют в единственном экземпляре и доступны во всех частях программы, использующих данный модуль.
Секция реализации следует за интерфейсной и начинается с ключевого слова IMPLEMENTATION. В нём располагаются описания процедур и функций, объявленных в интерфейсной секции, а также описания типов,
констант, переменных, процедур и функций, которые необходимы для реализации интерфейсных процедур и функций. Описание процедуры или функции, объявленной в интерфейсной секции, должно иметь в точности такой же заголовок, как в объявлении. В теле могут использоваться другие процедуры и функции данного модуля, объявленные как в интерфейсной части, так и в секции реализации. Переменные, объявленные в секции реализации, являются, по сути, глобальными (то есть существует только один экземпляр каждой такой переменной на всю программу), но доступны они только из процедур и функций, описанных в секции реализации данного модуля, а также из его тела. Если в интерфейсной секции есть сокращённые объявления типов, то эти типы должны быть полностью описаны в секции реализации.
Тело модуля начинается находящимся на верхнем уровне вложенности ключевым словом BEGIN. Тело содержит программный код, который выполняется один раз при загрузке модуля. Тело может применяться для инициализации, присваивания начальных значений переменным модуля, выделения ресурсов для его работы и так далее. Тело модуля может отсутствовать. В ряде реализаций Паскаля, например, в Delphi, вместо тела модуля могут применяться две секции (также необязательные) — INITIALIZATION и FINALIZATION. Они располагаются в конце модуля, после соответствующего ключевого слова. Первая — секция инициализации, содержит код, который должен быть выполнен при загрузке модуля, вторая секция финализации, код, который будет выполнен при выгрузке модуля. Секция финализации может выполнять действия, обратные инициализации удалять объекты из памяти, закрывать файлы, освобождать выделенные ресурсы.
Модуль заканчивается ключевым словом END с точкой.
Использование
Чтобы использовать модуль, главная программа или другой модуль должны импортировать данный модуль, то есть содержать объявление о его использовании. Это объявление делается с помощью инструкции подключения модулей, представляющей собой ключевое слово USES, за которым через запятую следуют имена модулей, которые требуется подключить. Инструкция подключения должна следовать непосредственно за заголовком программы, либо после ключевого слова INTERFACE, если подключение производится в модуле.
Модули, подключённые в интерфейсной секции, могут использоваться во всём модуле — и в секции реализации, и в теле. Но секция реализации может иметь собственную инструкцию подключения (она следует за ключевым словом IMPLEMENTATION), содержащую имена подключаемых модулей, которые отсутствуют в интерфейсной секции, но нужны для секции реализации. Одним из поводов использования отдельного списка подключения для раздела реализации является ситуация, когда два или более модуля используют друг друга. Чтобы не возникали циклические ссылки в объявлениях использования таких модулей, по крайней мере, один из них должен подключать другой в секции реализации.
Любые объявленные в интерфейсных секциях модулей объекты можно использовать в программе там, где эти модули подключены. Имена импортированных из подключённых модулей объектов остаются теми же самыми, и их можно использовать непосредственно. Если два или более подключённых модуля имеют объекты, называемые одинаково, и компилятор не может их различить, то при попытке использования такого
объекта будет выдана ошибка компиляции — неоднозначное задание имени. В этом случае программист должен применять квалификацию имени — указать имя в формате «<имя_модуля>.<имя_объекта>».
Проблемы могут возникнуть, если появляется необходимость использования в программе двух разных одноимённых модулей. Если модули доступны только в откомпилированном виде (то есть поменять их имена невозможно), оказывается невозможным их одновременный импорт. Стандартного решения такой коллизии на уровне языка не существует, но конкретные компиляторы могут предлагать те или иные способы её обхода,
в частности, средства назначения псевдонимов импортируемым модулям и прямого указания, какой модуль из какого файла брать.
Компиляция и компановка
Модули спроектированы в расчёте на обеспечение раздельной компиляции — компилятор не должен компилировать импортированные модули для того, чтобы откомпилировать модуль, который их использует.
Однако чтобы правильно компилировать модуль, компилятор должен иметь доступ к секции интерфейса всех используемых им модулей. Существует два разных, иногда совмещаемых подхода к организации такого доступа.
- Модули компилируются в бинарные файлы специального формата (у каждого компилятора своего), в которых сохранена подробная информация об объектах, объявленных в интерфейсной секции, также может содержаться созданный при компиляции модуля объектом языке, но использует при этом только интерфейсную секцию модуля. Если библиотечный модуль поставляется в откомпилированном виде (без полных исходных текстов), то вместе с бинарным файлом идёт урезанный файл исходного кода модуля, содержащий только интерфейсную секцию. Компилятору этого достаточно, чтобы правильно обрабатывать обращения из использующих модулей, а на этапе сборки программы компоновщик просто включает в программу бинарный файл.
Загрузка и выгрузка модулей
Для нормальной работы модуля может потребоваться выполнить некоторые действия до начала его использования: инициализировать переменные, открыть нужные файлы, выделить память или другие ресурсы. Всё это может быть сделано в теле модуля, либо в секции инициализации. Действия, обратные инициализации, делаются в секции финализации.