Если параметры процедуры относятся к файловому типу они могут быть
В заголовке процедуры или функции может содержаться список параметров, которые представляют собой идентификаторы переменных и служат для обмена значениями между подпрограммой и вызывающей её программной единицей. При этом в описании подпрограммы, поскольку оно включается в тексте программы один раз, имена параметров выбираются определённым образом и безотносительно к именам переменных, используемых в других частях программы. Такие параметры, имена которых указаны в заголовке подпрограммы, называются формальными.
С другой стороны, при каждом новом обращении к подпрограмме в неё могут передаваться значения разных переменных. Такие переменные, имена которых подставляются в операторы вызова подпрограммы при фактическом обращении к ней, называются фактическими параметрами.
Список формальных параметров может отсутствовать. В том случае, если он есть, то в нём должны быть перечислены имена формальных параметров и их типы.
Формальные параметры могут включать в себя:
4. Параметры-массивы и параметры-строки;
5. Нетипизированные параметры-переменные;
6. Процедурные типы:
В свою очередь, формальные параметры делятся на входные и выходные параметры. К выходным параметрам относятся параметры-переменные, а остальные параметры следует отнести к входным параметрам подпрограмм.
Рассмотрим несколько формальных параметров.
Параметры-значения
где q1, q2, . qn – имена параметров.
Например, (q1, q2 : real); (q1: integer; q2: real);
Параметры-переменные определяют выходные данные процедуры (результаты обработки данных), которые передаются в основную программу.
Для выделения выходных переменных перед ними ставится слово Var.
(var t1, t2, . tn: ); или
где t1, t2, tn – параметры-переменные.
Например, (var t1: real; var t2, t3: integer);
Параметры-константы
(const t1, t2, . tn: ); или
(const t1: ; const t2: ; .. const tn: );
где t1, t2, tn – параметры-константы.
Например, (const t1: real; const t2, t3: integer);
Пример 8.1.Procedure MyProc(var a : Real; b : integer; const c: char);
Здесь, a – параметр-переменная, b – параметр-значение, c – параметр-константа.
Параметры-процедуры и параметры-функции. Это параметры, которые сами являются процедурами или функциями.
Между формальными и фактическими параметрами должны быть следующие соответствия:
1. количество параметров;
2. порядок следования входных и выходных параметров;
Для того чтобы понять, в каких случаях использовать тот или иной тип параметров, рассмотрим, как осуществляется замена формальных параметров на фактические в момент обращения к подпрограмме.
Если параметр определён как параметр-значение, то перед вызовом подпрограммы это значение вычисляется, полученный результат копируется во временную память и передаётся подпрограмме. Даже если в качестве фактического параметра указано простейшее выражение в виде переменной или константы, всё равно подпрограмме будет передана лишь копия переменной (константы). Любые возможности изменения в подпрограмме параметра-значения никак не воспринимаются вызывающей программой, так как в этом случае изменяется копия фактического параметра.
Если параметр определён как параметр-переменная, то при вызове подпрограммы передаётся сама переменная, а не её копия (фактически в этом случае подпрограмме передаётся адрес переменной). Изменение параметра-переменной приводит к изменению самого фактического параметра в вызывающей программе.
В случае параметра-константы в подпрограмму также передаётся адрес области памяти, в которой располагается переменная или вычисленное значение. Однако компилятор блокирует любые присваивания параметру-константе нового значения в теле подпрограммы.
Формальные параметры подпрограммы указывают, с какими параметрами следует обращаться к этой подпрограмме (количество параметров, их последовательность, типы). Они задаются в заголовке подпрограммы в виде списка формальных параметров, разбитого на группы, разделенные точками с запятыми. В группу формальных параметров включаются однотипные параметры одной категории.
- параметры-значения (эти параметры в основной программе подпрограммой не меняются);
- параметры-переменные (эти параметры подпрограмма может изменить в основной программе);
- параметры-константы (используются только в версии 7.0);
- параметры-процедуры и параметры-функции (т. е. процедурного типа).
Для каждого формального параметра следует указать имя и, как правило, тип, а в случае параметра-переменной или параметра-константы - его категорию. Имена параметров могут быть любыми, в том числе и совпадать с именами объектов программы. Необходимо лишь помнить, что в этом случае параметр основной программы с таким именем становится недоступным для непосредственного использования подпрограммой. Тип формального параметра может быть практически любым, однако в заголовке подпрограммы нельзя вводить новый тип. Например, нельзя писать
function Max(A: arrayt1..100] of Real): Real;
Чтобы правильно записать этот заголовок, следует в основной программе ввести тип-массив, а затем использовать его в заголовке:
type tArr = arrayt1..100] of Real; function Max(A: tArr): Real;
При обращении к подпрограмме формальные параметры заменяются на соответствующие фактические вызывающей программы или подпрограммы.
10.3.1. Параметры-значения
Параметры-значения передаются основной программой в подпрограмму через стек в виде их копий и, следовательно, собственный параметр программы подпрограммой измениться не может.
Параметр-значение указывается в заголовке подпрограммы своим именем и через двоеточие - типом. Тип параметра-значения может быть любым за исключением файлового.
Если параметров-значений одного типа несколько, их можно объединить в од ну группу, перечислив их имена через запятую, а затем уже указать общий тип Как отмечалось выше, отдельные группы параметров отделяются друг от точкой с запятой.
Пример.
procedure Inp(Max, Min: Real; N: Word);
function Mult(X, Y: Integer): Real;
В качестве фактического параметра на месте параметра-значения при вызове подпрограммы может выступать любое выражение совместимого для присваивания типа (см. п. 9.3), не содержащее файловую компоненту, например:
Inp(Abs(Z), -Abs(T), 2 * К);
M:=Mult(X + Y, X - Y);
MA:=Max(B, 5);
Пример. Функция вычисления максимального элемента в массиве. Пусть в основной программе определен тип-массив, массив этого типа и переменная целого типа
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[l];
for i := 2 to N do
if Ma
Теперь, например, для определения максимального числа из первых пяти чисел массива Massiv и записи его в переменную Maxim можно записать оператор:
Maxim : = Max(Massiv,5); /p>
Следует иметь в виду, что подпрограмма может работать только с массивами типа tArr. Для массивов другого типа придется создавать другую аналогичную подпрограмму. Кроме того, при работе подпрограммы в стеке будет создана копия исходного массива, что приводит к уменьшению быстродействия и заполнению стека излишней информацией.
10.3.2. Параметры-переменные
При передаче параметров-переменных в подпрограмму фактически через стек передаются их адреса в порядке, объявленном в заголовке подпрограммы. Следовательно, подпрограмма имеет доступ к этим параметрам и может их изменять.
Параметр-переменная указывается в заголовке подпрограммы аналогично параметру-значению, но только перед именем параметра записывается зарезервированное слово var. Действие слова var распространяется до ближайшей точки с запятой, т. е. в пределах одной группы.
Пример.
procedure MaxMin(A: tArr; var Max, Min: Real; N: Word);
Здесь Max, Min - параметры-переменные, А и N - параметры значения.
Тип параметров-переменных может быть любым, включая и файловый.
При вызове подпрограммы на месте параметра-переменной в качестве фактического параметра должна использоваться переменная идентичного типа (см. п. 9.1). Так, если формальный параметр имеет тип, определенный следующим образом:
type tArr = array[1..100] of Integer;
то и фактический параметр должен быть переменной или типизированной константой типа tArr.
Пример. Функция вычисления максимального элемента в массиве. Модифицируем подпрограмму примера п. 10.3.1, используя в качестве первого параметра параметр-переменную:
function Max(var Mas: tArr; N: Byte): Integer;
var Ma: Integer;
i: Byte;
begin
Ma := Mas[l];
for i := 2 to N do
if Ma
Этот вариант лучше предыдущего тем, что в данном случае в стеке не создается копия исходного массива, что улучшает быстродействие и экономит память. Однако при такой передаче параметра возможно его нежелательное изменение (такой вариант передачи параметра допустим только в таких небольших подпрограммах, как в данном примере, когда программист может проконтролировать отсутствие несанкционированного изменения параметра). Недостаток же, связанный с тем, что подпрограмма может работать только с одним типом массивов, остается.
10.3.3. Параметры-константы
Часто в качестве параметра в подпрограмму следует передать ту или иную переменную, но изменять ее подпрограмма не должна. В этом случае нежелательно передавать этот параметр как параметр-переменную. Можно его передать как параметр-значение, однако, если эта переменная имеет большой размер (массив, запись и т. д.), то копия такого параметра займет большую часть стека и даже может его переполнить. Это же приводит и к уменьшению быстродействия программы. В этой ситуации параметр лучше передать как параметр-константу. Такой параметр, если он структурированного типа, передается своим адресом, не предусматривается защита от его изменения. Использовать параметр-константу можно только в версии 7.0.
Параметр-константа указывается в заголовке подпрограммы аналогично параметру-значению, но перед именем параметра записывается зарезервированное слово const. Действие слова const распространяется до ближайшей точки с запятой, т. е. в пределах одной группы.
Пример.
function NewString(const S: string): string;
Тип параметра-значения может быть любым за исключением файлового.
При вызове подпрограммы на месте параметра-переменной в качестве фактического параметра можно использовать любое выражение совместимого для присваивания типа (см. п. 9.3), не содержащего файловую компоненту.
Параметр-константу нельзя передавать в другую подпрограмму в качестве фактического параметра.
Пример. Функция вычисления максимального элемента в массиве. В примере п. 10.3.1 используем в качестве первого параметра параметр-константу:
function Max(const Mas: tArr; N: Byte): Integer;
var Ma: Integer;
i: Byte;
begin
Ma := Mas[l];
for i := 2 to N do
if Ma
10.3.4. Параметры без типа
В Turbo Pascal можно использовать параметры-переменные и параметры-константы без указания типа. В этом случае фактический параметр может быть переменной любого типа, а ответственность за правильность использования того или иного параметра возлагается на программиста.
Пример.
function Equal(var Paraml, Param2; Len: Word): Boolean;
Здесь Param1, Param2 - параметры-переменные без типа (вместо них можно использовать, например, любые переменные простого типа, типа-массив, типа-запись и т. д.); Len - параметр-значение.
Следует иметь в виду, что параметр без типа внутри подпрограммы типа не имеет и его перед использованием следует преобразовать к конкретному типу, применяя идентификатор соответствующего типа так, как это указывалось в п. 9.4, при этом полученный результат может быть любого размера.
Пример. Функция вычисления максимального элемента в массиве. Рассмотрим другой вариант подпрограммы примера п. 10.3.1, используя в качестве первого параметра параметр-переменную без типа:
function Max(var Mas; N: Byte): Integer;
type
tArray = array[1..Maxint] of Integer;
var Ma: Integer;
i: Byte;
begin
Ma := tArray(Mas)[1];
for i := 2 to N do
if Ma
В этом случае в качестве первого передаваемого параметра можно использовать любой массив (и не только массив), так что подпрограмма становится более универсальной. Тем не менее здесь необходимо передавать в качестве второго параметра фактический размер информации, что не очень удобно.
10.3.5. Массивы и строки открытого типа
В версии 7.0 можно в качестве параметров-переменных использовать массивы 1 и строки открытого типа, у которых не задаются размеры. В качестве фактического параметра в этом случае можно использовать массив или строку любого ра- 1 змера, однако массив должен состоять из тех же компонент, что и компоненты j открытого массива. Такие параметры введены для того, чтобы подпрограмма мо- ] гла обрабатывать массив или строку любого размера. Фактический размер массива в этом случае может быть определен с помощью функции High (см, j п. 16.1). Открытый массив задается как и обычный массив, но только без указания типа индекса. Следует иметь в виду, что индексация элементов открытого массива всегда начинается с нуля, а максимальный индекс элемента равен значению функции High.
Пример. Функция вычисления максимального элемента в массиве. Рассмотрим вариант подпрограммы примера п. 10.3.1, используя в качестве передаваемого параметра массив открытого типа:
function Max(var Mas: array of Integer): Integer;
var Ma: Integer;
i: Byte;
begin
Ma := Mas[0];
for i := 1 to High(Mas) do
if Ma
В этом примере в подпрограмму передается только один параметр и она может работать с любым одномерным массивом целых чисел. Однако следует иметь в виду, что при работе подпрограммы для открытого массива в стеке опять-таки создается его копия, что может его переполнить.
Разновидность открытого массива - открытая строка, которая может задаваться либо с помощью стандартного типа OpenString, либо с помощью типа string и использования ключа компилятора (см. п. 17.7.1), например заголовок процедуры, заполняющей каким-либо символом строку, может иметь вид:
procedure FillChar(var Str: OpenString; Ch: Char);
($p+)
procedure FillChar(var Str: string; Ch: Char);
10.3.6. Параметры-процедуры и параметры-функции
Передаваемым параметром может быть также параметр-процедура или параметр-функция, т. е. параметр процедурного типа. Фактически этот параметр является параметром-значением, т. к. записывается без зарезервированного слова var.
В качестве фактического параметра в этом случае используется соответствующая процедура или функция, имеющая необходимое количество параметров требуемых типов.
Для параметров-процедур и параметров-функций существуют те же правила, что и для других переменных процедурного типа: подпрограммы должны компилироваться с ключом <$F+) или иметь директиву far, не должны быть стандартными подпрограммами, не должны объявляться внутри других подпрограмм, не иметь директив inline или interrupt.
Пример. Программа, печатающая таблицы сложения и умножения двух целых чисел в заданном диапазоне.
program EXAMPLE15;
type
Func = function(X, Y: Integer): Integer;
($F+)
function Add(X, Y: Integer): Integer;
begin
Add := X + Y
end;
function Multiply(X, Y: Integer): Integer;
begin
Multiply := X * Y
end;
procedure PrintTable(A, B: Integer; Operation: Func);
var
i, j: Integer;
begin
for i := 1 to A do
begin
for j := 1 to В do
Write(Operation(i, j): 5);
WriteLn
end;
WriteLn
end;
begin
PrintTable(10, 10, Add);
PrintTable(10, 10, Multiply)
end.
Что будет напечатано в результате выполнения представленных операторов?
p^:=3; q^:=2;
p^:=q^;
if p=q then p:=nil else if p^=q^ then q:=p;
if p=q then q^:=5;
writeln (p^);
Введите число.
Question13
Какое значение будет выведено на экран после выполнения программы?
type dvig = (vverh, vniz, vpravo, vlevo);
var x, y: dvig; t: (vpered, nazad); k: integer;
begin
k:=ord(nazad)+ord(vpravo);
writeln (k);
end.
Введите слово, словосочетание или символьно-цифровое выражение.
Question14
Для установки требуемого шрифта в графическом режиме используют процедуру:
Выберите все верные ответы (может быть несколько или один).
Question15
Процедура delete (var S: string; P: integer; N: integer) выполняет < ; > < ; ; >символов строки < ; ; >, начиная с позиции < ; ; >.
Выберите все верные ответы (может быть несколько или один).
Выберите все верные ответы (может быть несколько или один).
Дан фрагмент программы:
b:=8; k:=1; a:=2;
Repeat
k:=k*a;
Until k Введите слово, словосочетание или символьно-цифровое выражение.
Обмен данными между программой и подпрограммой осуществляется, как правило, через аппарат формальных и фактических параметров.
Параметры процедуры или функции могут быть следующего вида:
· параметры-процедуры и параметры-функции.
Параметры-значения и параметры-переменные
Параметры-значенияиспользуются для определения исходных данных процедуры и аргументов функции, в списке формальных параметров перечисляются через запятую с обязательным указанием их типа. Параметры-переменныеиспользуются для определения результатов выполнения процедуры и в списке формальных параметров помещаются после служебного слова Var. Например, в заголовке процедуры
Procedure Prс(x, y: real; Var z: real; Var n: integer);
переменные x, y являются параметрами-значениями, а z, n – параметрами-переменными. В заголовке функции параметры-переменные обычно не используются, так как вычисляемое значение функции возвращается не через параметры.
При описании формальных параметров следует соблюдать следующие общие правила:
· Если несколько формальных параметров имеют один и тот же тип, имя типа можно указать один раз на всю группу, перечислив параметры через запятую.
· Слово Varнеобходимо указывать для каждой группы параметров-переменных.
· Тип формального параметра может быть стандартным или ранее объявленным типом, в заголовке подпрограммы нельзя вводить новые типы, тип формального параметра может быть указан с помощью имени типа,стандартного или объявленного ранее:
Type
massiv = array[1..100] of real;
FunctionMax(z : massiv) : real;
· Компоненты записи не могут подставляться на место формальных параметров-переменных.
· Файловые переменные должны соответствовать параметрам-переменным.
В качестве фактического параметра-значения может быть использовано выражение соответствующего типа, в частном случае - константа или переменная. При вызове подпрограммы вычисляется значение фактического параметра, полученный результат копируется во временную память и передается подпрограмме. В процессе выполнения подпрограммы параметр-значение может изменяться, но эти изменения никак не воспринимаются вызывающей программой, так как изменяется копия. Поэтому параметры-значения нельзя использовать для возврата результатов выполнения процедуры!
Фактический параметр-переменная может быть только переменной или типизированной константой соответствующего типа. При обращении к процедуре осуществляется передача адреса фактического параметра. Следовательно, подпрограмма имеет доступ непосредственно к фактическому параметру и может его изменять. Поэтому параметры-переменные используют для определения результатов работы процедуры, а также в случаях, когда параметр одновременно является входным и выходным. Сравните результаты выполнения двух программ:
Program P1; Program P2 ;
k:integer; k:integer;
Procedure Izm(k:integer); Procedure Izm(Var k:integer);
Программа P1 выведет значение 0, программа P2 – значение 1, так как для формального и фактического параметров в Р1 используются различные ячейки памяти, а в Р2 – одни и те же.
Пример 8.10.Рассмотрим процедуру сортировки одномерного массива действительных чисел x1, x2, …, xn в порядке убывания значений его элементов. Формальный параметр процедуры x, определяющий имя массива, должен быть параметром-переменной, так как он играет роль одновременно входного и выходного параметра: первоначально x представляет исходный массив чисел, после выполнения процедуры это массив элементов, расположенных в порядке убывания их значений. Формальный параметр n – размер массива является входным и определен как параметр-значение.
massiv = array [1..Nmax] of real;
Procedure Sort(n : integer; Var x : massiv);
for i := 1 to n-1 do
for j := i+1 to n do
Параметры-константы
Обсудим случай, когда в качестве исходных данных в подпрограмму передается переменная структурированного типа, например имя массива. Определение ее как параметра-значения приведет при работе подпрограммы к созданию копии исходного массива. Можно определить ее как параметр-переменную, в этом случае копия исходного массива не создается, что повышает быстродействие и экономит память. Однако при такой передаче параметра/массива возможно его нежелательное изменение в подпрограмме. В этой ситуации параметр/массив лучше определить как параметр-константу; такой параметр, если он структурированного типа, передается своим адресом, но при этом предусматривается защита от его изменения в подпрограмме.
Параметр-константаописывается в заголовке подпрограммы аналогично параметру-значению, но после служебного слова Const. При вызове подпрограммы в качестве фактического параметра-константы можно использовать любое выражение соответствующего типа, в частном случае константу или переменную.
Пример 8.11.Рассмотрим функцию нахождения максимального элемента в массиве вещественных чисел z1, z2, . , zn.
massiv = array [1..Nmax] of real;
Function Max(n : integer; Const z : massiv) : real;
for i := 2 to n do
End;
В функции Max в качестве аргументов определены параметры z, n, представляющие собой имя массива и его размер; результат вычислений – значение максимального элемента в массиве возвращается как значение функции.
Параметр-константу нельзя передавать в другую подпрограмму в качестве фактического параметра!
Параметры открытого типа
В качестве формального параметра-переменной можно использовать массивы открытого типа, без указания их размера (типа индекса). Соответствующий фактический параметр в этом случае может быть одномерным массивом любого размера, состоящим из элементов того же типа, что и элементы открытого массива. Фактический размер массива может быть определен в подпрограмме с помощью функции High, вычисляющей максимальный индекс элемента, или передан в подпрограмму в качестве параметра. Индексация элементов открытого массива начинается с нуля!
Пример 8.12.Рассмотрим функцию нахождения максимального элемента в массиве вещественных чисел z1, z2, . zn, используя в качестве параметра массив открытого типа.
Function Max(Var z : array of real) : real;
for i := 1 to High(z) do
End;
В этом примере функция имеет только один параметр – имя массива и может работать c одномерным массивом вещественных чисел любого размера. Размер фактического параметра (массива) определяется значением функции High. Однако следует иметь в виду, что при работе функции для открытого массива во временной памяти создается его копия.
Разновидность открытого массива – открытая строка, которая может задаваться либо с помощью стандартного типа OpenString, либо с помощью типа String и использования директивы компилятора .
Параметры без типа
Тип формального параметра-переменной и параметра-константы можно не указывать. В этом случае соответствующий фактический параметр может быть переменной любого типа. Ответственность за правильность использования такого параметра полностью возлагается на программиста. Параметры без типаудобно использовать для передачи в подпрограмму массивов переменной длины в сочетании с механизмом совмещения данных в памяти (по одному и тому же абсолютному адресу) либо с использованием механизма явного преобразования типов.
Пример 8.13.Рассмотрим функцию, определяющую наличие отрицательных значений в произвольном массиве целых чисел.
Function Minus(n : integer; Var z) : Boolean;
Massiv = array [1..Maxint] of integer;
for i := 1 to n do
End;
Поскольку параметр z внутри подпрограммы типа не имеет, то перед использованием он преобразуется в конкретный тип massiv, что достигается применением идентификатора/имени этого типа как идентификатора автоматически объявляемой функции преобразования типов. Поскольку передача параметра осуществляется по адресу, то объем используемой памяти определяется размером фактического параметра.
Формальными параметрами называются переменные описанные в заголовке программы и используемые только внутри процедуры (функции).
Формальные параметры указывают, с какими параметрами следует обращаться к этой процедуре (функции), т.е. их количество, последовательность, тип. Они задаются в заголовке процедуры (функции) в виде списка параметров, разбитого на группы (секции) однотипных параметров, разделенных ‘;’. Порядок следования групп (секций) произвольный. Количество параметров м.б. любым.
Для каждого формального параметра следует указать имя и тип. Имена параметров могут быть любыми, они могут совпадать с глобальными именами программы. Необходимо лишь помнить, что в этом случае параметр основной программы с таким именем становится недоступным для непосредственного использования подпрограммой. Но формальные имена не могут совпадать с локальными переменными . , т.к. они располагаются в одном стековом сегменте памяти. Тип формального параметра может быть практически любым, однако в заголовке процедуры (функции) нельзя вводить новый тип.
Формальные параметры можно разбить на 2 категории:
1. параметры - значения (эти параметры в основной программе процедурой (функцией) не меняются );
2. параметры - переменные (эти параметры процедура (функция) может изменить в основной программе );
Параметрами - значениями называются переменные, которые могут изменяться внутри процедуры (функции), но не передают свои значения в программу.
Параметрами - переменными называются переменные, которые изменяются в процедуре (функции) и передают свое значение в программу.
Перед параметрами-переменными ставится служебное слово Var.
Список формальных параметров обеспечивает связь процедуры (функции) с вызывающей программой. Через него в процедуру (функцию) передаются исходные данные и возвращается результат.
При вызове процедуры (функции) из программы указываются фактические параметры.
Фактическими параметрами называются параметры, которые задаются при вызове процедуры (функции).
Процедура вызывается по имени:
Правила задания фактических параметров:
1. Фактические параметры должны совпадать с формальными по количеству, по порядку следования, по типу.
2. Если формальный параметр – параметр-переменная, то фактический параметр при вызове процедуры задается только идентификатором (вызов по ссылке).
3. Если формальный параметр – параметр- значение, то фактический параметр при вызове процедуры задается:
- идентификатором
- константой
- выражением
(вызов по значению).
4. Для параметров-переменных (вызов по ссылке) должно быть точное совпадение по типу фактических и формальных параметров, а для параметров-значений (вызов по значению) допустима совместимость.
Читайте также: