При описании процедуры указывается список формальных параметров. Каждый параметр является локальным, к нему можно обращаться только в пределах данной процедуры. Фактические параметры, которые передаются процедуре при обращении к ней. Количество и типы формальных и фактических параметров должны совпадать.
Параметры могут иметь любой тип, включая структурированный. В Pascal различают два метода передачи параметров:
· по значению;
· по ссылкам.
9.3.1 Параметры – значения
Изменение формальных параметров не влечет за собойизменения фактических параметров. Это основная причина использования таких параметров, так как позволяет устранить несанкционированное изменение собственного параметра программы. Однако передать информацию из подпрограммы в основную программу с помощью таких параметров также нельзя. Параметр-значение указывается в заголовке подпрограммы своим именем и через двоеточие – типом.
Procedure Konc(A,B,C:Integer;D:Real);
Function Doc(S1,S2:Real):Real;
Запись
Procedure Okl((M:array[1..12] Of Integer); - ошибочна
Необходимо тип переменной определить ранее в разделе описания типов блока:
Type Massiv=array[1..12] Of Integer;
Procedure Okl((M:Massiv);
Пример. Функция вычисления максимального элемента в массиве.
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;
Теперь, например, для определения максимального числа из первых пяти чисел массива Massiv и записи его в переменную Maxim можно записать оператор:
Maxim:=Max(Massiv,5);
9.3.2 Параметры - переменные
Любое изменение формального параметра означает изменение фактического параметра. Для описания параметров-переменных служит слово Var. Действие слова Var распространяется до ближайшей точки с запятой, т.е. в пределах одной группы.
Procedure MaxMin(A:Tarr; Var Max,Min: Real; C:Integer);
Max, Min – параметры-переменные, A,C – параметры-значения.
Пример. Функция вычисления максимального элемента в массиве.
Function Max(Var 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;
При такой передаче параметра, возможно его нежелательное изменение.
Демонстрационный пример.
Var
A, B: Byte;
K, N: Integer;
I1,I2,J1,J2:Integer;
Procedure WW1;
Begin
A:=A+4; {Глобальная переменная}
End;
Procedure WW2(Var R,T:integer); {Процедура передает в программу значения R,T}
Begin {R,T- параметры-переменные}
R:=555;
T:=666;
End;
Procedure WW3(R1,R2:integer; Var X1,X2:Integer); {R1,R2-принимает}
Begin {X1,X2-передает}
X1:=R1+R2;
X2:=R1*R2;
End;
Begin
A:=9;
WriteLn(A:5);
WW1;
WriteLn(A:5);
WW2(K,N); {в K,N содержатся результаты работы процедуры WW2}
WriteLn(K:5,N:5);
J1:=23; J2:=178;
WW3(I1,I2,J1,J2); {Значения I1,I2 передаются в процедуру}
WriteLn(J1:5,J2:5); {J1,J2 – принимаются из процедуры}
End.
Задания для самостоятельной работы
1. Вычислить арифметическое выражение Y=A*B-tgA . Использовать функцию для:
· вычисления функции tg;
· умножения двух чисел, используя только операцию сложения.
2. Длины отрезков заданы координатами концов. Найти самый длинный отрезок. Для нахождения длины отрезка использовать функцию.
3. Дан массив целых чисел, состоящий из 10 элементов. Заполнить его с клавиатуры. Найти:
· сумму отрицательных элементов. Сумму отрицательных элементов передать в основную программу, используя параметр-переменную.
· количество тех элементов, значения которых положительны и не превосходят заданного числа А. Значение А задать в основной программе, в процедуру передать это значение;
· номер последней пары соседних элементов с разными знаками.
Массив заполнить в основной программе, в процедуры массив передать. Обработку элементов массива произвести в отдельных процедурах.
4. Дан массив целых чисел, состоящий из 10 элементов. Заполнить его с клавиатуры. Найти:
· сумму элементов, имеющих нечетное значение;
· вывести индексы тех элементов, значения которых больше заданного числа А. Значение А задать в основной программе, в процедуру передать это значение;
· количество положительных элементов, кратных К. (К вводится с клавиатуры). Количество положительных элементов передать в основную программу, используя параметр-переменную.
Массив заполнить в основной программе, в процедуры массив передать. Обработку элементов массива произвести в отдельных процедурах.
5. Дано n целых чисел. Найти среди них число, у которого приведенная ниже характеристика имеет максимальное значение:
· сумма цифр;
· первая цифра;
· количество делителей;
· сумма всех делителей.
Вычисление данных значений произвести с использованием функций.
6. Дано n целых чисел. Написать программу подсчета чисел, в записи которых нет цифры 8. при этом требуется использовать функцию вида
Function Yes8(x:LongInt):Boolean;
Ответ: 729.
7. Составить программу перестановки значений переменных a, b, c в порядке возрастания, т.е. так, чтобы a<=b<=c.