В этой главе мы расскажем о принципах описания функций и процедур 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.
Первый раздел - раздел интерфейса, который является как бы "лицом" данного модуля. В нем размещены описания модулей, используемых данным одулем, а также объявляются типы, константы, переменные, функции и роцедуры, описываются идентификаторы, являющиеся доступными всем одулям и программам, использующим данный модуль. Заметим, что для ункций и процедур в данном разделе записываются только их заголовки. Непосредственно процедуры и функции размещены в следующем разделе - разделе реализации. В разделе реализации, кроме процедур и функций, описываются типы, константы, переменные, а также модули, которые используются только в этом модуле, а за его пределами не видны. Кроме того, в данном разделе разме-аются директивы компилятора - служебные команды среды разработки. Последние два раздела не являются обязательными. В разделе инициализации вмещаются операторы и команды, которые должны выполняться в начале работы программы, подключающей эти модули. При наличии раздела инициализации в модуле может присутствовать раздел вершения. В данном разделе находятся операторы и команды, которые выполняются при завершении работы программы.