Подпрограммы
Функции
Процедуры
Параметры и аргументы
Модули
В этой главе мы расскажем о принципах описания функций и процедур 1языка Object
Pascal. Вы узнаете, чем отличается параметр подпрограммы от аргумента и научитесь
сами создавать процедуры и функции. В конце главы мы рассмотрим понятие модуля.
Подпрограммы
Подпрограмма - это небольшая законченная программа, состоящая из операторов
и команд языка и оформленная специальным образом.
Подпрограммы используются для сокращения объема программы и могут |вызываться
из любого места основной программы. Уменьшение объема Программы достигается
за счет того, что в программах часто имеются оди-рнаковые участки кода, которые
можно вынести в подпрограмму и вызывать в нужных местах программы.
По своей структуре подпрограмма аналогична обычной программе, но блок luses
в подпрограмме отсутствует. Подпрограмма также имеет некоторые отличия в оформлении
заголовка.
Прежде чем работать с подпрограммой, ее необходимо описать.
При описании и вызове подпрограммы записываются имя подпрограммы, список и значения
параметров (аргументов), которые передаются данной подпрограмме для работы,
а также действия, выполняемые этой подпрограммой.
В качестве параметров функции могут выступать любые описанные в ней переменные.
Параметры используются для передачи данных из основной программы в подпрограмму.
Однако подпрограмма может не иметь параметров.
В модулях. Kylix имеется несколько десятков стандартных подпрограмм, которые
могут вызываться без предварительного их описания.
Все подпрограммы в языке Object Pascal делятся на две группы:
процедуры;
функции.
Главным отличием функции от процедуры является то, что функция может возвращать
под своим именем какое-либо значение. Процедура этого делать не может.
Для досрочного выхода из подпрограммы и передачи управления основной программы
достаточно вызвать процедуру Exit. Подпрограммы допускается вызывать из других
подпрограмм.
Функции
Функции - это подпрограммы, которые могут возвращать под своим именем результирующее
значение. Типичным примером функции может быть функция sin(x). Запись:
A:"Sin'(x);
позволяет вызвать функцию вычисления синуса числа х и вернуть результат под
именем функции, а затем присвоить его переменной А.
Описание функции состоит из двух частей: заголовка и блока. Заголовок функции
имеет следующий вид:
Function имя функции (параметры) : тип результата;
Имя функции однозначно идентифицирует данную функцию и используется оля ее вызова
из основной программы.
Параметры - это необязательная часть функции, содержащая список переменных,
которые передаются в функцию из основной программы.
Тип результата - показывает, какой тип будет иметь результат выполнения функции.
Тип результата может быть любым, за исключением файлового.
Блок функции - это программный блок, состоящий, как минимум, из одногo оператора
присваивания:
Имя функции := результат выполнения функции;
или
Result := результат выполнения функции;
Данная операция присваивания (как первая, так и вторая) присваивает ре-ультирующее
значение, которое вернет функция при возврате в основную программу. Например:
function WF: Integer;
begin
WF .:= 17;
end;
и
function WF: Integer;
begin
Result := 17;
end;
Вызов обеих функций приведет к одному и тому же результату. Данная функция всегда
будет возвращать значение 17.
Вызов функции осуществляется по ее имени и списку аргументов, заключенных в
круглые скобки после имени функции. Все аргументы должны быть совместимы по
типу с параметрами, указанными в заголовке функции.
В качестве примера рассмотрим описание функции нахождения максимального значения
среди элементов одномерного массива (листинг 4.1). В качестве параметров в функцию
будем передавать имя массива и количество его элементов.
Листинг 4.1 описание функции MAX
function Max (A: array of Real; N: Integer): Real;
var
X: Real;
I: Integer;
begin
X := A[0];
for I := 1 to N - 1 do
if X < A[ I ] then X := A[ I ] ;
Max := X;
end;
Вызов данной функции может выглядеть так:
М := Мах (В, 12) ;
При этом переменная м должна иметь тип Real, массив в - тоже Real, a вторым
параметром должно быть целое число (в нашем примере 12). Таким образом, вызов
данной функции при этих параметрах поместит в переменную м самое большое значение
из всех, хранящихся в элементах одномерного 12-элементного массива в.
Процедуры
Процедура - это обыкновенная подпрограмма, которая не возвращает никакого значения
под своим именем.
Описание процедуры также состоит из двух частей: заголовка и Заголовок процедуры
имеет следующий вид:
Procedure имя процедуры (параметры) ;
Имя процедуры должно быть уникальным и должно однозначно идентифицировать процедуру.
Параметры процедуры являются необязательными и служат для передачи каких-либо
данных из основной программы в процедуру.
Блок процедуры содержит операторы и команды языка Object Pascal. Блок процедуры
может быть пустым.
Вызов процедуры происходит по ее имени и списку аргументов, заключенных в круглые
скобки.
Рассмотрим пример описания процедуры. Создадим процедуру, которая треобразует
целое число в строку (листинг 4.2). Для этого в процедуру потребуется передавать
два параметра - целое число и строку, в которую будет записан результат.
Листинг 4.2 Описание процедуры NumString
prdcecture NumString (N: Integer; var S: string);
var
V: Integer;
begin
V := Abs(N);
S:='';
repeat
S := Chr(V mod 10 + Ord('O')) + S;
V ;= V div 10;
unti1 V = 0;
if N < 0 then S := '-' + S;
end;
Для вызова данной процедуры можно в любом месте основной программы поступить
следующим образом:
NumString (17, MyString);
В результате выполнения данного оператора, который называется операто-зм/вызова
процедуры, в строковую переменную с именем MyString будет омещено значение "17".
Параметры и аргументы
Параметры - это элементы подпрограммы, которые используются при описании блока
подпрограммы.
Аргументы - это элементы, которые указываются при вызове подпрограмм. Они замещаются
соответствующими параметрами подпрограммы.
В качестве параметров могут выступать:
значения;
константы;
переменные.
Параметрами могут быть элементы абсолютно любого типа.
Все параметры разделяются на группы, в зависимости от того, чем они являются:
параметры-значения;
параметры-константы;
параметры-переменные.
Параметры-значения - это параметры, перед которыми в заголовке под-цюграммы
не стоит слово var или const. За параметрами-значениями через двоеточие ставится
их тип. Например:
function Max(A: array of Real; N: Integer): Real;
3десь массив А и переменная N являются параметрами-значениями. Параметры-значения
рассматриваются компилятором как локальные переменные, которые присутствуют
только внутри подпрограммы. Все изменения этих параметров происходят только
внутри подпрограммы и никак не влияют на значения соответствующих имч аргументов.
Параметры-константы - это параметры, перед которыми в заголовке подпрограммы
стоит слово const. За параметрами-константами через двоеточие ставится их тип.
Например:
procedure MyProcl(const X: Integer);
Здесь единственный параметр х является параметром-константой. Значение параметра-константы
в теле подпрограммы изменить нельзя. Параметры-константы применяются для того,
чтобы запретить нежелательные изменения параметров в подпрограмме. Кроме того,
использование параметров-констант позволяет компилятору создать более эффективный
код.
Параметры-переменные - это параметры, перед которыми в заголовке подпрограммы
стоит слово var. За параметрами-переменными через двоеточие ставится их тип.
Например:
procedure MyProc2(var a,b:char; с,d:string);
В этом примере параметры а и ь являются параметрами-переменными.
Параметры-переменные используются, когда необходимо передать значение из подпрограммы
в основную программу. При этом все изменения параметра внутри подпрограммы приводят
к аналогичным изменениям соответствующего аргумента.
Указание типов параметров обязательно лишь для параметров-значений. Для других
видов параметров тип можно не указывать. В таком случае параметры считаются
нетипизированными. Например:
function MyFunc(var a,b; const c,d): Integer;
В данном примере параметры а, ь, с и d являются нетипизированными. При вызове
такой подпрограммы программист может использовать в качестве аргументов элементы
любого типа.
Модули
Кроме рассмотренных выше программ и подпрограмм, язык Object Pascal позволяет
создавать так называемые модули.
Модуль (unit) - предназначен для записи в него различных элементов, таких как
подпрограммы, переменные, константы и др.
Модуль не может быть запущен на исполнение как программа. Чтобы использовать
модуль в программе, его необходимо подключить. Для этого имя модуля указывается
в разделе uses основной программы.
Рис. 4.1. Форма приложения
Для каждой формы приложения Kylix создается новый модуль. Например, р при первоначальном
запуске среды вы видите на экране форму с именем Forml (рис. 4.1) и модуль формы
с именем Unitl.pas (рис. 4.2).
Рис. 4.2, Модуль Unit1 .pas
Рассмотрим состав модуля более подробно:
unit имя модуля;
interface // Начало раздела интерфейса uses // Список используемых модулей
Const // Раздел объявления констант type // Раздел объявления типов
var // Раздел объявления переменных
//Заголовки процедур
// Заголовки функций
implementation // Раздел реализации
uses // Список используемых модулей
const // Раздел объявления констант
type // Раздел объявления типов
var // Раздел объявления переменных
// Описание процедур
// Описание функций
initialization // Раздел инициализации
// Операторы и команды
finalization // Раздел завершения
//Операторы и команды
end.
Первый раздел - раздел интерфейса, который является как бы "лицом"
данного модуля. В нем размещены описания модулей, используемых данным одулем,
а также объявляются типы, константы, переменные, функции и роцедуры, описываются
идентификаторы, являющиеся доступными всем одулям и программам, использующим
данный модуль. Заметим, что для ункций и процедур в данном разделе записываются
только их заголовки. Непосредственно процедуры и функции размещены в следующем
разделе - разделе реализации.
В разделе реализации, кроме процедур и функций, описываются типы, константы,
переменные, а также модули, которые используются только в этом модуле, а за
его пределами не видны. Кроме того, в данном разделе разме-аются директивы компилятора
- служебные команды среды разработки.
Последние два раздела не являются обязательными. В разделе инициализации вмещаются
операторы и команды, которые должны выполняться в начале работы программы, подключающей
эти модули.
При наличии раздела инициализации в модуле может присутствовать раздел вершения.
В данном разделе находятся операторы и команды, которые выполняются при завершении
работы программы.