Содержание:
Процедуры и функции
Отличие от стандартного Паскаля: значение присваивается в Result
.
function Add(a,b:real):real; begin Result:= a + b; end; |
Или:
function Add(a,b:real):real:= a + b; |
Или же функция может выступать в качестве процедуры (нежелательный вариант):
function Add(a,b:real):= a + b; begin print(Add(2,8)); end; |
Выполнение:
function SP(a,b: real):=(a*b,2*(a+b)); begin print(SP(2,3)); end; |
Короткие процедуры:
procedure p:=write(1); |
procedure p(a, b: real):= if a<b then print(a) else print(b); |
Использование модуля
Функции и процедуры принято помещать в пользовательские модули.
Для модуля создается отдельный файл, например, MyUnit.pas, в котором прописывается код функции или процедуры:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Unit MyUnit; {название модуля} interface {раздел служит для объявления используемых ниже функций и процедур} function MyFunc(x:real):real; procedure MyPr(x:real); implementation {реализация функций и процедур} function MyFunc(x:real):real; begin ... end; procedure MyPr(x:real); begin ... end; end. |
В файле с основной программой:
1 2 3 4 5 | Uses MyUnit; var ... begin ... end. |
Тестирование процедур и функций
Все созданные процедуры принято тестировать. Для этого существует стандартная функция Assert:
function Add(a,b:integer):integer; begin Result:= a + b; end; begin Assert(Add(2,3)=(2+3), 'Тест не прошел'); print (Add(4,6)); end. |
Первый параметр функции Assert должен быть истинным, второй параметр — сообщение об ошибке. Если первый параметр оказывается ложным (т.е. функция работает неверно), то будет сгенерированно исключение и выведено сообщение об ошибке из второго параметра.
Обобщенные функции (Generic-функции)
Не всегда удобно, когда мы указываем конкретный тип аргументов функции или конкретный тип возвращаемого функцией значения.
Есть понятие обобщенной функции, в которой не указано к какому типу будут относиться ее аргументы или возвращаемое ею значение:
Подпрограмма образуется из обобщенной подпрограммы подстановкой конкретных типов в качестве параметров.
Запись такой функции выглядит так:
function MyFunc<T>(a:T):T; begin ... end; |
В данном примере и аргумент и значение функции имеют изначально неопределенный тип.
Еще пример с обобщенной функцией.
Решение задач
IsitDigit(D)
, которая возвращает истину, если целое число D
является цифрой (одноразрядное число, то есть D
лежит в диапазоне 0–9). В основной программе вывести значение этой функции для N
(N ≥ 0
) данных чиселВыполнение:
1 2 3 4 5 6 7 8 9 10 11 | function IsitDigit<T>(d:T):boolean; begin var ch:=[0..9]; if d in ch then result:=true else result:=false; end; begin var n:=readInteger('введите число > 0'); assert (n>0,'число должно быть > 0'); print(IsitDigit(n)); end. |
AddToRightDigit(I, N)
, которая возвращает целое число, полученное «дописыванием» к целому положительному числу N
справа цифры I
(I
— входной параметр целого типа, лежащий в диапазоне 0–9
, N
— входной положительный параметр целого типа).Выполнение:
1 2 3 4 5 6 7 8 9 10 | function AddToRightDigit(i,n:integer):integer; begin var str:=n.ToString+i; result:=str.ToInteger; end; begin var n :=readInteger ('введите число'); var i :=readInteger('введите постфикс'); print(AddToRightDigit(i,n)) end. |
IfNine(I)
, которая возвращает целое число, полученное следующим образом: если среди цифр числа имеется цифра 9, то перед числом добавляется («дописывается») I
(I
— входной параметр целого типа). АSred(X, Y)
, вычисляющую среднее арифметическое X
и Y
Выполнение:
1 2 3 4 5 6 | function ASred(x,y:real):=(x+y)/2; begin var x:= readReal('введите x'); var y:= readReal('введите y'); println('результат средн. арифм: ',ASred(x,y)); end. |
GSred(X, Y)
, вычисляющую среднее геометрическое двух положительных вещественных чисел X
и Y
.