Процедуры и функции, определенные пользователем
Процедура и функция пользователяначинаются с заголовков вида, соответственно:
Procedure<имя процедуры> [(<параметры>)];
Function<имя функции> [(<параметры>)] : <тип результата>;
Возвращаемое значение формируется одной из равнозначных команд: <имя функции>: = <значение> или Result:=<значение>.
Предопределенная переменная Result может быть использована в качестве операнда (Result:=X+Y; Result:=Result*C).
Для выхода из подпрограммы используется команда Exit.
Параметры в заголовке указываются в виде списка объявлений переменных через запятую, и они могут быть структурированы (массивами, записями, множествами). Передача параметров производится по значению, по ссылке, в виде константы или как выходной параметр.
Параметры, переданные по значению (параметры‑значения), не могут быть изменены процедурой, функцией, а параметры, переданные по ссылке, называются параметрами‑переменными и могут изменить свое значение в подпрограмме. Они описываются в заголовке процедуры, функции после слова Var.
Параметры-константы описываются после слова Const.При попытке изменить значение аргумента в подпрограмме будет выдано компилятором сообщение об ошибке.
Выходной параметр описывается после слова Out. Он похож на параметр‑переменную, но не требует исходного значения от аргумента, при этом память, занимаемая аргументом, очищается. Подпрограмма формирует значение этого аргумента.
Не типизированный параметр не содержит указание типа, что означает возможность обработки подпрограммой аргумента любого типа. В этом случае в подпрограмме должны применяться операции приведения (преобразования) типов (п.1.2.9).
Пример. Procedure P(Var X); Begin Real (X):=Real (X)+2.1; End;
Для не типизированного параметра нельзя передавать в качестве аргумента число или не типизированную числовую константу.
Обращение к процедуре или к функции имеет вид:
<имя процедуры или функции> [(<список аргументов через запятую>)]
Параметр с умалчиваемым значением задает значение, которое принимается при отсутствии аргумента в команде вызова подпрограммы. После объявления такого параметра в заголовке подпрограммы указывается знак равенства и константное выражение. Такие параметры должны быть последними в списке параметров, и, если один аргумент не указан, то не указываются и все оставшиеся.
Пример:
Fuction Nalog (X : Double, Nds : Double=0.2, Imuh : Double=0.01) : Double;
... N:=Nalog(V); //вызов функции с указанием только 1 аргумента вместо 3.
// Ошибочным будет вызов функции вида: N:=Nalog(V,,0.02).
Перегрузка подпрограмм. Если определить несколько одноименных подпрограмм с различным числом или типами параметров и в конце заголовков указать слово Overload, то компилятор автоматически вызовет ту подпрограмму, которая соответствует данным аргументам.
Пример двух функции с различными типами параметров:
Function Add (X, Y: Real) : Real; Overload; Begin Result:=X+Y; End;
Function Add (X, Y: Integer) : Integer; Overload; Begin Result:=X+Y; End;
A=Add (1.3,2.1); //вызов первой функции с вещественными параметрами
A=Add (1,2); //вызов второй функции с целочисленными параметрами
Правила использования параметров и аргументов:
1.Количество неумалчиваемых параметров и аргументов совпадает.
2.Длины строк могут не совпадать, если указана директива {$V‑}.
3.Если типы параметров и аргументов не совпадают, то обязательно указать типы параметров в заголовке.
4.В заголовке можно использовать и указатели.
5.Параметрами могут быть открытые массивы (п.1.1.4.1).
6.Параметры типов массивов, строк и записей должны быть предварительно определены через типы пользователя, например:
Type Atype=Array [1..10] Of Real;//объявление типа массив из 10 вещ.чис.
Intype=String[15]; Outtype=String[30]; //объявление типов строк
Procedure S (A:Atype); //заголовок процедуры с параметром типа массив
Function St (S:Intype):OutType;//строковая функция с параметром строки
Пример программы возведения числа в степень:
Program Demo; //заголовок основной программы
Var Z : Integer; K : Real; //объявление переменных
Function Step (F:Real, Exp: Integer) : Real; //заголовок функции Step
Var C: Integer; T: Real; //объявление переменных функции
Begin T:=F; For C:=2 To Abs(Exp) Do T:=T*F; //цикл умножения
If Exp<0 Then Result:=1/T Else Result:=T; //формирование результата
End; //окончание тела функции
Begin Writeln (Step (2, 3),Step(5,4)) End. //операторы основной программы
Рекурсивные программы в ходе выполнения обращаются сами к себе.
Примеррекурсивной функции Factor вычисления факториала:
Procedure TForm1.Button1Click(Sender: TObject);//основная процедура
Function Factor (A:Integer) : Integer; //заголовок функции Factor
Begin If A=1 Then Result:=1 Else Result:=A*Factor(A‑1)End; //функция
Begin Label1.Caption:=IntToStr(Factor(10))end;//основная функция‑вывод10!
Предварительное описание программы. Допускается описание процедуры или функции в конце основной программы. В этом случае перед разделом операторов основной программы указывается:
<заголовок процедуры>; Forward;
Сама процедура будет описана позже без указания параметров.
Модули
Модуль ‑ это автономно компилируемая программная единица, включающая в себя различные компоненты раздела описаний (типы, константы, переменные, процедуры и функции, классы, операторы).
Модуль имеет структуру:
Unit<имя модуля>; //заголовок модуля
Interface
<интерфейсная часть>
Resourcestring //не обязательный
<строки ресурсов>
Implementation//не обязательный
<исполняемая часть>
Initialization//не обязательный
<инициирующая часть>
Finalization//не обязательный
<завершающая часть>
End. //окончание тела модуля
Заголовок модуля состоит из зарезервированного слова UNIT и следующего за ним имени модуля. Это имя должно совпадать с именем исходного текста. Имя модуля служит для его связи с другими модулями и основной программой. Эта связь устанавливается специальным предложением: Uses<список имен модулей через запятую>.
Имя модуля можно указывать в виде:
<имя модуля> [In ‘<имя файла с модулем>.pas’]
Интерфейсная часть содержит списки подключаемых модулей, объявления всех глобальных объектов модуля (типов, констант, переменных, подпрограмм), которые должны стать доступными для других модулей, обращающихся к данному модулю. Для глобальных подпрограмм указывается только их заголовок.
Строки ресурсов содержат описания строк ресурсов (п.1.3.1.2).
Исполняемая часть содержит списки подключаемых модулей, объявления локальных констант, переменных, типов, тексты подпрограмм, метки, если они используются в инициирующей части. Описанию подпрограммы, объявленной в интерфейсной части модуля, в исполняемой части должен предшествовать заголовок, в котором можно опускать список параметров (и тип результата для функции), так как они уже описаны в интерфейсной части.
Инициирующая часть содержит операторы, которые выполняются до передачи управления основной программе. Например, в них могут инициализироваться переменные, открываться файлы.
Завершающая часть содержит операторы, выполняемые один раз при любом нормальном или аварийном завершении программы. Эта часть запрещена, если отсутствует инициирующая часть.
Пример создания модуля Cmplx с процедурами сложения и вычитания комплексных чисел:
Unit Сmplx; //имя модуля
Interfac e //интерфейсная часть с объявлением типов и процедур
Type complex = record re, im : real; end; //объявления типа
Procedure ADDC (x, у : сomplex; var z: complex ); //объявление процедуры
Procedure SUBC (x, у : сomplex; var z: complex );//объявление процедуры
Implementation //исполнимая часть с текстами процедур
Procedure ADDC; begin z.re: =x.re+y.re; z.im:= x.im+y.im; end;//процедура
Procedure SUBC; begin z.re:= x.re‑y.re; z.im: =x.im‑y.im; end;//процедура
End. //окончание модуля
Компилятор
Дата добавления: 2016-03-22; просмотров: 921;