Бегун.Рекомендую - рекламодателю
Здесь может быть ваша реклама
|

 Глава 4. Подпрограммы и модули
Глава 4. Подпрограммы и модули


В этой главе мы расскажем о принципах описания функций и процедур 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.

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


 

 

 
MKPortal©2003-2008 mkportal.it
MultiBoard ©2007-2009 RusMKPortal