50
Заочная школа программирования
Урок 20: Параметры проедур и функций
В языке Паскаль как процедура, так и функция могут иметь список параметров. Каждый из параметров процедуры*) изображается внутри описания процедуры некоторым именем, называемым формальным параметром. Формальный параметр играет роль обозначения, позволяющего описать ту последовательность действия, которое мы хотим применить при различных выполнениях процедуры к различным фактическим величиным. Эти величины задаются в операторе вызова процедуры или в обработении к функции в виде списка фактических параметров,лина которой совпадает с длиной списка формальных параметров. Между формальными и фактическими параметрами устанавливается простое позиционное соответствие: первый фактический параметр соответствует первому формальному, второй — второму и т. д. Каждый форматный параметр проедуры осмыслен только внутри данной процедуры. В начале выполнения процедуры формальный параметр связывает с величиным, заданной соответствующим фактическим параметром и существует вне этой процедуры.
В Паскале имеется четыре вида параметров: параметры-значения, параметры-переменные, параметры-проедуры и параметры-функции. Вид того или иного параметра проедуры задается в ее заголовке (см. урок 16).
*) Все, что здесь и ниже говорится о параметрах процедуры, полностью переносится на параметры функции.
Параметры-значения
Параметры-значения описываются диаграммой:
Параметр-значение процедуры является ее локальной переменной (о локальных и глобальных именах в Рапире см. Урок 7). Формальный параметр представляет эту переменную в пределах описания процедуры. Фактический параметр в этом случае должен быть выражением того же типа, что и переменная, обозначаемая соответствующим форматным параметром. В момент вызова процедуры происходит вычисление этого выражения, и полученное значение присваивается переменной в качестве начального значения. В дальнейшем при выполнении процедуры эта переменная ничего не отличается от других локальных переменных этой процедуры.
Понск наиболее общо делитель двух целых положительных чисел может быть осуществлен с помощью следующей функции:
function nod(x, y:integer):integer;
{0≤y≤X}
begin if y=0
then nod:=x
else nod:=nod(x,x mod y)
end;
Задание 20.1. Имеется следующие описание функции:
function a(x,y:integer):integer;
{x≥0,y≥0}
begin if x=0
then a:=y+1
else if y=0
then a:=a(x-1,1)
else a:=a(x-1,a(x,y-1))
end;
Определять максимальное число экземпляров параметра x, одновременно существующих при выполнении обращения a (2,2).
Параметры-переменные
Диаграмма, описывающая параметры-переменные, имеет вид:
51
В этом случае фактический параметр должен быть переменной заданного типа, а формальный параметр служит обозначением этой переменной во все время данного выполнения процедуры. Если в фактическом параметре имеются индексы, то они вычисляются в момент вызова процедуры.
Параметр-переменная необходимо во всех случаях, когда параметр используется для представления результата процедуры или функции.
В программах сортировок, расматривающихся во втором номере «Кванта», уже использовался такой вид параметров.
Пусть имеются следующие описания:
var k:integer;
b:array [1...100]of real;
procedure max(var i:integer);
{1≤i<100}
var j:integer;
begin
for j:=i+1 to 100 do
if b[i]<b[j]then i:=j
end;
Тогда после выполнения операторов k:=20; max(k) переменной k будет присвоен индекс наиболее элемента из b[20], b[21], ..., b[100].
Задание 20.2. Можно ли использовать процедур
procedure заменa(var x,y:integer);
var z:integer;
begin
z:=x;
x:=y;
y:=z
end
для обмена значениями у любых двух переменных целого типа? Например, помещается ли значение у переменных k и a[20] после вызова замена (k, a [k+1]), если это его выполнения к было равно 19?
Задание 20.3. Пусть имеются описания
type табличца=array[1..2,1..2] of integer;
procedure умножение(var x,y,z:tabличца);
begin
z[1,1]:=x[1,1]*y[1,1]+x[1,2]*y[2,1];
z[1,2]:=x[1,1]*y[1,2]+x[1,2]*y[2,2];
z[2,1]:=x[2,1]*y[1,1]+x[2,2]*y[2,1];
z[2,2]:=x[2,1]*y[1,2]+x[2,2]*y[2,2]
end;
и даны три таблицы
a = (1 1) , b = (2 2) , c = (3 3) .
Определить вид таблицы a, b и c после каждого из вышеов:
умножение (a, b, c), умножение (a, b, a), умножение (a, b, b). Что произойдет при этих же вызовах, если параметры x и y сделать параметрами значениями? Что будет, если и z становится параметром-значением?
Параметры-процедуры и параметры-функции
Диаграммы, описывающие параметры-процедуры и параметры-функции, имеют вид:
function function(экспilon, a,b:real;
function f:real):real;
{f(x) — вещественная функция с одним параметром типа real. Функция непрерывна в интервале a≤x≤b и имеет в точках а и b значения разных значений}
var c:real; d:boolean;
begin
if f(a)>0 then
begin c:=a; a:=b; c:=b end;
d:=true;