- •Процедуры и функции
- •Процедуры
- •Пример Вызов процедуры InpInt для ввода k целых чисел в массив m.
- •Функции
- •Формальные и фактические параметры
- •Параметры-значения Параметры-значения передаются основной программой в подпрограмму через стек в виде их копий. Сам параметр программы подпрограммой измениться не может.
- •Параметры-переменные
- •Этот вариант лучше предыдущего, так как в стеке не создается копия исходного массива, что улучшает быстродействие и экономит память.
- •Локализация имен
- •Пример Структура вложенной программы.
- •Основное правило Паскаля
- •Допустимые вызовы процедуры
- •Совместимость и преобразование типов данных
- •Параметры-массивы и строки открытого типа
- •Процедурные типы
- •Проблема совместимости
- •Рекурсия
- •Побочный эффект
- •Рекурсивная функция
- •Стеки для локальных переменных и параметров
- •Реализация стеков параметров в Паскале
Процедуры и функции
В языке Паскаль существуют подпрограммы двух видов: процедуры и функции. Структура подпрограммы аналогична структуре всей программы. Имя подпрограммы обязательно. Заканчивается подпрограмма end; .
Подпрограмма должна быть описана (объявлена) до того, как она будет вызвана (использована) в программе или другой подпрограмме.
Все параметры, используемые в подпрограмме, делятся на локальные и глобальные. Первые объявлены внутри подпрограммы и доступны только ей самой. Вторые объявлены в программе и доступны как программе, так и всем её подпрограммам.
Обмен информацией между основной программой и подпрограммой может осуществляться только с помощью глобальных параметров.
Глобальные параметры могут использоваться в подпрограмме двояким образом:
-
непосредственное обращение к глобальным параметрам (по имени, идентификатору);
-
использование механизмов формальных параметров.
Процедуры
Процедура предназначена для выполнения некоторой законченной последовательности действий. Начинается с заголовка, он обязателен. Состоит из зарезервированного слова procedure, за ним следует имя процедуры, далее в круглых скобках - список формальных параметров.
procedure <имя процедуры> (<список формальных параметров>);
Пример
type
tarr=array [1..100] of integer;
procedure InpInt( var mas:tarr; n:integer);
var
i: integer ; { локальный параметр}
begin
writeln(‘введите ’,n,’ целых чисел’);
for i:=1 to n do
read(mas[i]);
end;
Для вызова процедуры из основной программы или другой подпрограммы следует записать оператор, состоящий из имени процедуры и списка фактических параметров. Они должны совпадать по количеству и типам с формальными параметрами процедуры.
Пример Вызов процедуры InpInt для ввода k целых чисел в массив m.
InpInt(m, k);
k-параметр целого типа, m-массив типа tarr.
Функции
Функции предназначены для вычисления какого-либо параметра. Отметим два основных отличия от процедуры
-
заголовок состоит из зарезервированного слова function, за ним в круглых скобках – список формальных параметров, затем через двоеточие записывается тип функции - тип возвращаемого параметра;
функция может возвращать параметры следующих типов: любого порядкового, любого вещественного, стандартного string, любого указателя, в том числе тип Pchar.
-
в теле функции хотя бы раз имени функции должно быть присвоено значение.
Пример Функция вычисления факториала числа n.
function factorial (n: Byte): longint;
var fact:longint;
i:byte;
begin
fact:=n;
for i:=n-1 downto 2 do
fact:=fact*i;
factorial:=fact;
end;
Для вызова функции из основной программы или другой подпрограммы следует в выражении, где необходимо использовать значение функции, указать имя функции со списком фактических параметров, которые должны совпадать по количеству и типам с формальными параметрами функции.
Пример
Part: =sqr (t)/factorial (i),
где
sqr (t) – вызов стандартной функции возведения в квадрат с фактическим параметром t;
factorial (i) - вызов функции, вычисляющей факториал с фактическим параметром i.