- •Процедуры и функции
- •Процедуры
- •Пример Вызов процедуры InpInt для ввода k целых чисел в массив m.
- •Функции
- •Формальные и фактические параметры
- •Параметры-значения Параметры-значения передаются основной программой в подпрограмму через стек в виде их копий. Сам параметр программы подпрограммой измениться не может.
- •Параметры-переменные
- •Этот вариант лучше предыдущего, так как в стеке не создается копия исходного массива, что улучшает быстродействие и экономит память.
- •Локализация имен
- •Пример Структура вложенной программы.
- •Основное правило Паскаля
- •Допустимые вызовы процедуры
- •Совместимость и преобразование типов данных
- •Параметры-массивы и строки открытого типа
- •Процедурные типы
- •Проблема совместимости
- •Рекурсия
- •Побочный эффект
- •Рекурсивная функция
- •Стеки для локальных переменных и параметров
- •Реализация стеков параметров в Паскале
Формальные и фактические параметры
Формальные параметры указывают, с какими параметрами следует обращаться к этой подпрограмме (количество, их последовательность, типы). Они задаются в заголовке подпрограммы в виде списка формальных параметров. Список разбит на группы, разделенные точками с запятыми. В группу вкладываются однотипные параметры одной категории.
Все формальные параметры разбиты на 4 категории:
-
параметры-значения (в основной программе эти параметры подпрограммой не меняются);
-
параметры-переменные (эти параметры подпрограмма может изменить в основной программе);
-
параметры-константы (только в Borland Pascal 7.0);
-
параметры-процедуры и параметры-функции (процедурного типа).
Для каждого формального параметра следует указать имя и, как правило, тип.
Для параметра-переменной или параметра-константы – его категории. Имена параметров могут быть любыми, они могут совпадать с именами объектов программы.
В этом случае параметр основной программы с таким именем становится недоступным для непосредственного использования подпрограммой. Тип формального параметра может быть любым, но в заголовке подпрограммы нельзя вводить новый тип.
Пример
Неправильно:
function max (a: array [1..00] of real):real;
Правильно:
type
tArr = array [1..100] of real;
function max(a:tArr):real;
При обращении к подпрограмме формальные параметры заменяются на соответствующие им фактические параметры программы или подпрограммы.
Параметры-значения Параметры-значения передаются основной программой в подпрограмму через стек в виде их копий. Сам параметр программы подпрограммой измениться не может.
Параметр-значение указывается в заголовке подпрограммы своим именем и - через двоеточие – типом. Значение его может быть любым, кроме файлового типа. Если значений одного типа несколько, то их можно объединить в одну группу, перечислив их имена через запятую, а затем указать их общий тип. Отдельные группы отделяются друг от друга точкой с запятой.
Пример
procedure inp(max, min :real; n :word);
function mult(x,y :integer)real;
В качестве фактического параметра на месте параметра-значения при вызове подпрограммы может выступать любое выражение совместимого для присваивания типа, не содержащее файловую компоненту.
Пример
inp(abs(7),-abs(t), 2*k);
m:=mult(x+y, x-y);
Пример Функция вычисления максимального элемента массива.
В основной программе определен тип-массив, переменная этого типа и переменная целого типа.
type
tArr = array[1..100] of integer;
var
massiv : tArr;
maxim :integer;
function max(mas:tArr; n: byte): integer; {Описание функции}
var ma:integer;
i:byte;
begin
ma:=mas[1];
for i:=2 to N do
if ma<mas[i] then ma:=mas[i];
max:=ma
end;
Тогда возможно
maxim:=max(massiv, 5);
Будет определено максимальное число из пяти первых чисел массива massiv и записано в переменную maxim.
Подпрограмма может работать только с массивами типа tArr. Для массива другого типа требуется создать аналогичную подпрограмму. При работе подпрограммы в стеке будет создана копия исходного массива, что ведёт к уменьшению быстродействия.