Формальные и фактические параметры
Формальные параметрызадаются при объявлении подпрограммы,фактические параметры– при вызове подпрограммы. Типы фактических параметров должны быть идентичны типам формальных параметров. Их число должно быть равно числу формальных параметров, должен совпадать и порядок следования фактических параметров с порядком записи формальных. Механизм передачи данных через формальные параметры реализуется с использованием специальной области памяти –стека. По умолчанию размер стека установлен 16384 байта. Можно изменить объем стека в настройках среды Delphi.
Параметры-значения
Синтаксис задания параметров-значений
В этом случае для фактического параметра создается копия в стеке. При вызове подпрограммы на месте параметра-значения может стоять выражение, совместимое по типу с формальным параметром. В подпрограмме его значение измениться не может. Входные параметры, задают как параметры-значения. Передавать в подпрограмму массивы в виде параметров значений нецелесообразно, так как расходуется лишняя память – в стеке создается дополнительная копия массива.
Параметры-переменные
Синтаксис задания параметров-переменных
<секция форм. параметров-переменн.>::=var<имя><,<имя>>:<имя типа>
При использовании в подпрограммах параметров-переменных в стеке выделяются ячейки для размещения адресов фактических параметров. В отличие от параметров-значений, в подпрограмме значения параметров-переменных могут изменяться. Так как фактические параметры в этом случае передаются по адресу, любое изменение параметра-переменной внутри подпрограммы фиксируется в фактическом параметре. Выходные параметры задают как параметры-переменные.
Параметры-константы
Входные параметры могут передаваться в подпрограмму как параметры-константы. Синтаксис задания параметров-констант
<секция форм. парам. констант>::= const<имя><,<имя>>:<имя типа>
Параметры-константы введены для того, чтобы ключевое слово varсохранить за выходными параметрами, а входной параметр мог передаваться по адресу. Компилятор сам определяет, что передавать по адресу, а что как копию. Например, простые переменные передаются как копии, а массивы – по адресу. Изменить параметры-константы внутри подпрограммы нельзя. Вместо параметров-констант можно подставлять выражения, как и для параметров-значений.
ПроцедураExit
Эту процедуру используют для досрочного выхода из подпрограммы.
Пусть задан массив вещественных чисел. Найти первый отрицательный элемент в этом массиве
type mass= array[1..100] of real;
function Minus(const a1: mass):real;
for i:=1 to High(a1) do
if a1[i]<0 then begin Result:=a1[i]; Exit end
Процедурные типы
В Паскале допускается использование в качестве параметров процедур и функций других процедур и (или) функций. Формальный параметр-процедура (функция) задается в виде заголовка той процедуры (функции), имя которой может быть задано в качестве фактического параметра – при этом имя такой процедуры (функции) и ее формальные параметры выбираются достаточно произвольным образом. В качестве параметров нельзя использовать процедуры (функции), фактические параметры которых вызываются по имени, т.е. параметрами таких процедур могут быть только параметры-значения. Это ограничение снижает гибкость использования процедур, но повышает надежность программ.
Применение процедурных типов требует установления специального дальнегомеханизма компилирования программы, который можно задать, поместив в начало программы директиву компилятору<$F+>.
Пример.
type f1= function (x: real):real;
functionfr(x: real):real;
begin fr:=x-cos(x) end;
functionfg(x: real):real;
begin fg:=x*x+sin(x) end;
functionSUM (f:f1;m,k:integer):real;
vari : integer; r : real;
begin r:=0; for i:=m to k do r:=r+f(i); sum:=r end;
Количество и тип формальных и фактических параметров должны в точности совпадать
Формальные параметры описываются в заголовке процедуры и определяют тип и место подстановки фактических параметров. Формальные параметры делятся на два вида: параметры-переменные и параметры-значения.
Параметры-переменные отличаются тем, что передними стоит служебное слово Var. Они используются тогда, когда необходимо, чтобы изменения значений формальных параметров в теле процедуры приводили к изменению соответствующих фактических параметров.
Параметры-значения отличаются тем, что перед ними слово Var не ставится. Внутри процедуры можно производить любые действия с параметрами-значениями, но все изменения никак не отражаются на значениях соответствующих фактических параметров, то есть какими они были до вызова процедуры, такими же и останутся после завершения ее работы.
Все переменные программы делятся на глобальные и локальные. Глобальные переменные объявляются в разделе описаний основной программы. Локальные переменные объявляются в процедурах и функциях. Таким образом, локальные переменные «живут» только во время работы подпрограммы.
Пример. Составить программу для вычисления а n : целые числа а и n (n>=0) вводятся с клавиатуры. (составить процедуру для вычисления степени целого числа).
Program ex;
var a, n: integer;
Procedure Degree(x,y: integer; var st: longint);
var i: integer;
Begin
for i:=1 to y do st:=st*x;
end;
Begin
writeln(‘введите два числа — основание и показатель степени’);
End.
Процедура названа именем Degree. В скобках записан список формальных параметров, то есть перечислены переменные с указанием их типа. Используем три параметра: первый — основание степени, то есть число, которое надо возвести в степень; второй — показатель степени, третий — результат. Первые два формальных параметра — параметры значения, третий — параметр-переменная, и перед ним указано слово var. Все они описаны как целые (x и y — переменные типа integer, st — Longint, так как степенная функция быстро возрастает).
После заголовка процедуры идут разделы описаний. В нашем примере имеется только раздел описания переменных, в котором описывается одна переменная i (счетчик цикла).
Далее идет тело процедуры. Оно начинается служебным словом Begin и заканчивается служебным словом End, после которого стоит точка с запятой (в конце программы после последнего End ставится точка). В теле процедуры вычисляется степень числа x с помощью цикла For.
В программе процедуры и функции описываются после раздела описания переменных программы, но до начала ее основной части, то есть до Begin, начинающего эту часть программы.
. Процедура вызывается как оператор, состоящий из имени процедуры. В круглых скобках записываются фактические параметры. В нашем примере формальные параметры x, y и st принимают значения фактических параметров a, n и s соответственно. После завершения работы процедуры переменные a и n сохранят те же значения, что и при вызове, а s получит новое значение.
Пример 2: Используя процедуру для вычисления степени числа, найти значение выражения: y=a4x 4 + a3x 3 + a2x 2 + a1x + a0
var a: array[0..4] of integer;
Procedure Degree(xx,n: integer; var st: longint);
var i: integer;
Begin
for i:=1 to n do st:=st*xx;
end;
Begin
write(‘введите значение переменной х ‘); readln(x);
writeln(‘введите массив коэффициентов’);
for i:=0 to 4 do begin write(‘a[‘,i,’]=’); readln(a[i]); end;
Пример 3. Просуммировать различные части массива.
var a: array [1..100] of integer; sa1, sa2,sa3: integer;
procedure summa(a:array [1..100] of integer; k,m:integer; var s:integer);
for i:=k to m do s:=s+a[i];
for t:=1 to 100 do
write(‘введите очередной элемент массива ‘);
Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:
Об этом полезно знать:
Оптимизм, скептицизм, агностицизм Общая характеристика неклассической теории познания Сегодня можно говорить о кризисе классической гносеологии.
Пример решения задач Задача 1. Построить график рыночного равновесия на холодильники в магазине за день. Определите равновесную цену (Pе) и равновесный.
Понятие мышления, виды, операции и формы мышления Мышление – социально-обусловленный, неразрывно связанный с речью психический процесс поисков и открытия нового, т.
Переменный ток. Его характеристики Электрическим током называют направленное движение заряженных частиц.
Условия развития творческих способностей Для развития творчества детям необходимы определенные знания, навыки и умения, способы деятельности, которыми они сами, без помощи.
Формальные и фактические параметры
При описании подпрограммы используются формальные параметры, которые по сути являются локальными переменными. Но они обеспечивают обмен значениями между основной программой и подпрограммами. При вызове подпрограммы из основной программы используются фактические параметры, которые подставляются на место формальных параметров. Именно эти фактические параметры при выполнении подпрограммы замещают все вхождения в подпрограмму необходим для настройки данной подпрограммы на конкретные фактические параметры.
Связь фактических и формальных параметров:
· число формальных и фактических параметров должно быть одинаково;
· соответствие параметров устанавливается слева направо;
· соответствующие формальные и фактические параметры должны совпадать по типу;
· при задании фактических параметров необходимо учитывать, как были описаны формальные параметры – как параметры-значения или как параметры-переменные (var-параметры).
Параметры-значения
Передаются основной программой в подпрограмму в виде копии (через стек) и, следовательно, в случае каких-либо действий любые изменения в подпрограмме произойдут с копией параметров и никак не отразятся на собственных параметрах программы.
Параметры-значения указываются в заголовке программы своим именем и, через двоеточие – типом. Тип может быть любым.
Если параметров-значений одного типа несколько, то их можно перечислить через запятую, а затем через двоеточие указать общий тип. Отдельные группы параметров отделяются друг от друга точкой с запятой.
Параметры-переменные (var-параметры)
При передаче параметров-переменных в подпрограмме фактически через стек передаются не сами значения, а адреса, по которым эти значения хранятся. Следовательно, подпрограмма имеет прямой доступ к этим переменным и может их изменить (подпрограмма в этом случае работает непосредственно с сегментом данных).
Параметр-переменная указывается в заголовке программы аналогично параметру-значению, но перед именем параметра записывается служебное слова var. Действие слово var распространяется до ближайшей точки с запятой.
ЗАМЕЧАНИЕ: Особенности var-параметров: фактические параметры при вызове должны быть обязательно переменными. Нельзя использовать константы или выражения.
writeln(`введите исходные числа`);
С клавиатуры вводится два целых числа 10 и 20. Далее эти числа передаются процедуре Dec1, где они уменьшаются на 5 единиц каждое. Один из параметров передается как параметр-переменная, другой – как параметр-значение. Результаты выводятся на экран.
уменьшенные 5 15
результирующие 5 20
Уменьшение параметра «у» внутри процедуры не вызвало изменения параметра «у» в основной программе, так как этот параметр описан в заголовке процедуры как параметр-значение. Изменение параметра «х» внутри процедуры привело к изменению параметра «х» в основной программе, так как этот параметр описан в заголовке процедуры как параметр-переменная.
ЗАМЕЧАНИЕ: Именно поэтому var-параметры используются для связи подпрограмм с внешним миром. Подпрограмма с помощью var-параметров передает результаты своей работы вызывающей ее основной программе. В распоряжении программиста есть еще один способ связи подпрограммы с основной программой – через глобальные переменные, однако такой способ может привести к многочисленным ошибкам. При использовании var параметров по вызову процедуры сразу видно, какую именно переменную изменяет процедура. Однако не следует злоупотреблять использованием как глобальными переменными, так и var параметрами, ибо это затрудняет понимание и отладку программы.
Запишите, какие значения формальных и фактических параметров должны совпадать.
Как быстро выучить стихотворение наизусть? Запоминание стихов является стандартным заданием во многих школах.
Как научится читать по диагонали? Скорость чтения зависит от скорости восприятия каждого отдельного слова в тексте.
Как быстро и эффективно исправить почерк? Люди часто предполагают, что каллиграфия и почерк являются синонимами, но это не так.
Как научится говорить грамотно и правильно? Общение на хорошем, уверенном и естественном русском языке является достижимой целью.