Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Програмирование. Структурное програмирование, подпрограммы, строки. Учебное пособие
.pdf
что она получает свое исходное значение как копию соответствующего
фактического параметра при активизации (вызове) процедуры или
функции.
Изменения формального параметра-значения не влияют на значение фактического параметра. Поэтому с его помощью нельзя возвратить результат работы подпрограммы в вызвавшую программу или
подпрограмму.
Формальные параметры-значения включают в заголовок подпрограммы в том случае, когда в подпрограмму необходимо передавать
исходные данные из вызывающей ее программы или подпрограммы.
формальный
параметрзначение
var a:real;
function Log2(x: real):real;
{ Функция возвращает двоичный логарифм x
}
begin
log2:=ln(x)/ln(2);
end;
begin
write(' Введи неотрицательное число:);
readln(a);
writeln('log2(a) = ',Log2(a));{ Log2(a) - вызов
функции Log2 }
end.
При вызове функции
значение a копируется в х,
При работе функции
значение переменной a не
изменяется
фактический
параметрзначение a
Оперативное запоминающее
устройств о (ОЗУ)
Локальная
2
переменная x
Глобальная
переменная а
Параметр-значение
Сегмент
стека
Сегмент
данных
Сегмент
кода
Старшие
адреса
памяти
Паскальпрограмма
(карта памяти)
Младшие
адреса
памяти
Пример 10. Параметр-значение
Ниже приведены заголовки описания процедур и функций с формальными параметрами-значениями.
function Log2(x: real):real; { x – формальный параметрзначение}
procedure sor(a, x: real):real; { a, x – формальные
параметры-значения}
21

function tog(c: char):real; { c – формальный параметрзначение}
procedure rog (x: integer; y: real):real;{ x, y –
формальные параметры-значения}
procedure tur(var b: char; a, x: real):real; { a, x –
формальные параметры-значения}
Параметр-переменная
Список формальных параметров-переменных в заголовке описания
подпрограммы – это группа параметров с предшествующим ключевым
словом var и следующим за ней типом.
Список может содержать единственный параметр-переменную.
Ниже приведены заголовки объявления процедуры и функции с
формальными параметрами-переменными:
procedure Ptest(var a,b: Integer; var c: Real);
function Ftest(
var a: Char):Boolean;
Параметр-переменную используют, если необходимо возвратить
результат из процедуры или функции в вызывающую программу или
подпрограмму.
Внутри процедуры или функции любая ссылка на формальный параметр-переменную дает доступ к самому фактическому параметру,
потому что при вызове подпрограммы формальному параметру присваивается адрес фактического параметра.
Файловые
типы могут передаваться только как параметры-
переменные.
Пример 11. Параметр-переменная
Ниже приведены заголовки описания процедур и функций с формальными параметрами-переменными.
Procedure pop(var c: real; d: char); { Формальный параметр-переменная с }
Procedure dos(var c, t: real); { Формальные параметрыпеременные с, t }
Procedure kop(d: char var c, t: integer); { Формальные
параметры-переменные с, t }
22

function kop(var c, t: integer): string; { Формальные
параметры-переменные с, t }
function top(var t: integer): string; { Формальный параметр-переменная t }
фактические
параметрыпеременные
procedure swap(v ar u, v:Integer);
{Обменивает значениями переменные u,v.}
var t: Integer;
begin
t:= u; u:=v; v:= t
end;
var a, b : integer;
begin
a:= 8; b:= 16;
swap(a, b);{ a = 16, b = 8 }
end.
При вызове процедуры адрес a
копируется в u, адрес b
копируется в v. При работе
процедуры обрабатываются
значения глобальных
переменных a и b.
формальные
параметрыпеременные
Оперативное запоминающее
устройс тво (ОЗУ)
переменная u
2
переменная v
переменная t
переменная а
переменная b
Сегмент
стека
Сегмент
данных
Сегмент
кода
Старшие
адреса
памяти
Паскальпрограмма
(карта памяти)
Младшие
адреса
памяти
Параметр-переменная
Нетипированный параметр-переменная
Список формальных нетипированных параметров-переменных в
заголовке описания функции – это группа параметров с предшествующим ей ключевым словом var и без следующего за ней типа. Таким
образом, тип этого параметра не определен.
Список может содержать единственный нетипированный параметр-переменную.
Ниже приведены заголовки объявления процедуры и функции с
формальными
нетипированными параметрами-переменными:
procedure Ptest(var a, c);
function Ftest(var d):Char;
23

Внутри процедуры или функции нетипированный параметрпеременная не имеет типа, т. е. он несовместим с переменными всех
других типов, если ему не присвоен определенный тип с помощью
приведения типа переменной.
Нетипированный параметр-переменную используют, если необходимо возвратить результат из процедуры или функции в вызывающую
программу или подпрограмму.
Внутри процедуры
или функции любая ссылка на формальный нетипированный параметр-переменную дает доступ к самому фактическому параметру, потому что при вызове подпрограммы формальному
параметру присваивается нетипированный указатель (адрес) на фактический параметр.
Пример 12. Нетипированный параметр-переменная
function BytebyBit(b:byte):string;
{Функция возвращает строку, содержащую побитное представление b}
var s:string;i:byte;
begin
s:='';
for i:=0 to 7 do begin
if (1 and (b shr i))= 0 then s:='0'+s else s:='1'+s;
end;
ByteByBit:=s;
end;
function TypeByBit(var b;n:integer):string;
{Функция возвращает строку, содержащую побитное представление b;
n – размер b в байтах}
Type
t = array[1..Maxint] of byte;
var s:string;i:byte;
begin
s:='';
for i:=1 to n do
s:=s+ByteByBit(t(b)[i]);//нетипированный указатель b
приводится к типу t
TypeByBit:=s;
24

end;
var
r:real;
i:Shortint;
begin
i:=33; r:=-0.25;
writeln(TypeByBit(i,Sizeof(i)));
writeln(TypeByBit(r,Sizeof(r)));
Readln;
end.
Фактические параметры
Фактические параметры – это параметры, которые подставляют на
место формальных параметров при вызове подпрограммы.
В качестве фактических параметров подпрограмм могут выступать
идентификаторы переменных и выражения.
Различают следующие виды фактических параметров.
Фактический параметр-переменная – это параметр, который подставляется вместо формального параметра-переменной при вызове
подпрограммы. Им должен быть идентификатор переменной
тожде-
ственного типа с типом замещаемого формального параметра.
Фактический параметр-значение – это параметр, который подставляется вместо формального параметра-значения при вызове подпрограммы. Он может быть представлен в форме выражения, совместимого по присваиванию типа с типом замещаемого им формального параметра.
Фактический нетипированный параметр-переменная – это параметр,
который подставляется вместо формального нетипированного
параметра-переменной при вызове подпрограммы. Им должен быть
идентификатор переменной.
Пример 13. Фактические параметры
procedure Fog(a: real; b: integer);{ заголовок описания
процедуры; a, b – формальные параметры-значения}
Fog(25,41); );{ вызов процедуры Fog; 25, 41 – фактические параметры-значения}
25

procedure Swap(var a, b: real);{ заголовок описания процедуры; a,b – формальные параметры-переменные }
var c:real; d: integer;
Swap(c,d); );{вызов процедуры Fog; c,d – фактические параметры-переменные}
function TypeByBit(var b; n:integer):string;{ Заголовок
описания функции; b – нетипированный параметр-переменная
}
var r: real; i: Shortint;
begin
i:=33; r:=-0.25;
writeln(TypeByBit(i,Sizeof(i))); { Вызов функции; i фактический параметр}
writeln(TypeByBit(r,Sizeof(i))); { Вызов функции; r фактический параметр}
Фактический параметр-значение
Фактический параметр-значение – это параметр, который подставляется вместо формального параметра-значения при вызове подпрограммы.
Фактический параметр, соответствующий параметру-значению в
операторе процедуры или вызове функции, должен быть выражением
любого типа, исключая файловый тип или структурный тип, использующий файловый тип.
Фактический параметр должен иметь тип, совместимый
по присва-
иванию с типом формального параметра-значения.
Пример 14. Фактический параметр-значение
function Log2(x: real):real;{ x – параметр значение}
{ Функция возвращает двоичный логарифм x }
begin
log2:=ln(x)/ln(2);
end;
var i : integer; a, r : real;
begin
26

i:= 8; a:= 16;
r:= Log2(64.0);{r = 5, фактический параметр – литеральная вещественная константа}
r:= Log2(32);{r = 5, фактический параметр – литеральная целая константа }
r:= Log2(a); {r = 4, фактический параметр – вещественная переменная }
r:= Log2(i);{r = 3, фактический параметр – целочисленная переменная }
r:= Log2(2*i + Sqr(4));{ r = 5, фактический параметр –
вещественное выражение }
if Log2(i + 2)>2 then r:= 0; { r = 0, фактический параметр – целочисленное выражение }
формальный
параметрзначение
var a:real;
procedure Pr(x: real);
begin……..end;
begin
……..
Pr(a);
……..
end.
При вызове процедуры
значение a копируется в х,
При работе процедуры
значение переменной a не
изменяется
фактический
параметрзначение a
Адрес
переменной a
Оперативное запоминающее
устройство (ОЗУ)
Локальная
2
переменная x
Сегмент
стека
Глобальная
переменная а
Сегмент
данных
Сегмент
кода
Старшие
адреса
памяти
Паскальпрограмма
(карта памяти)
Младшие
адреса
памяти
Фактический параметр-значение
Пример 15. Фактический параметр-значение
procedure min(a,b: integer; var m: integer);
{через m возвращаем минимальное из двух значений (a,b) }
begin
if a < b then m:= a
else m:= b;
end;
27

var a, b, r : integer;
begin
a:= 8; b:= 16;
min(5, 8, r);{ r = 5, фактические параметры –
литеральные целые яконстанты }
min(Ord(‘0’),Ord(‘8’),r);{ r = 48, фактические
параметры – вызов функции }
min(a, b, r);{ r = 8, фактические параметры –
целые переменные }
min(a + 5, b - 7, r);{ r = 9, фактические параметры –
целочисленные выражения }
Фактический параметр-переменная
Фактический параметр-переменная – это параметр, который подставляется вместо формального параметра-переменной при вызове
подпрограммы.
Фактический параметр-переменная в операторе процедуры или вызове функции должен быть ссылкой на переменную (в простейшем
случае – идентификатором переменной).
Тип фактического параметра-переменной должен быть тождествен
типу замещаемого формального параметра-переменной (можно
обойти
это ограничение через нетипированные параметры-переменные).
Формальный параметр-переменная представляет фактическую переменную во время активизации процедуры или функции, поэтому все
изменения значения формального параметра отражаются на фактическом параметре.
Если ссылка на фактический параметр-переменную связана с индексированием массива или нахождением объекта по его указателю, то
эти
действия выполняются до активизации процедуры или функции.
В качестве формального параметра-переменной можно использовать переменные любых типов, включая файловые и опирающиеся на
файловые. Использование констант не допускается.
Пример 16. Фактический параметр-переменная
procedure swap(var u,v:Integer);
{Обменивает значениями переменные u,v.}
var t: Integer;
begin
28

t:= u; u:=v; v:= t
end;
var a, b, с : integer;
begin
a:= 8; b:= 16; с:= 25;
swap(a, b);{ a = 16, b = 8: фактические параметры–
переменные }
swap(с, b);{ с = 8, b = 25: фактические параметрыпеременные }
end.
формальный
параметрпеременная
var a:real;
procedure Pr(var x: real);
begin…end;
begin
……..
Pr(a);
……..
end.
При вызове процедуры Pr
адрес переменной a
копируется в х, При работе
процедуры ссылаясь на x
вы , на самом деле,
ссылаетесь на
переменную a. Вы можете
изменять и копировать ее
значение.
фактический
параметрпеременная a
Адрес
переменной a
Оперативное запоминающее
устройство (ОЗУ)
Локальная
2
переменная x
Сегмент
стека
Глобальная
переменная а
Сегмент
данных
Сегмент
кода
Старшие
адреса
памяти
Паскальпрограмма
(карта памяти)
Младшие
адреса
памяти
Фактический параметр-переменная
Фактический параметр нетипированная переменная
Фактический нетипированный параметр-переменная – это параметр, который подставляется вместо формального нетипированного
параметра-переменной при вызове подпрограммы. Им должен быть
идентификатор переменной.
Когда формальный параметр является нетипированным параметром-переменной, соответствующий фактический параметр может быть
любой ссылкой на переменную независимо от ее типа.
29

В процессе выполнения подпрограмма выполняет действия над
фактическим параметром.
Пример 17. Фактический параметр нетипированная переменная
function ByteByBit(b: byte): string;
{Функция возвращает строку, содержащую побитное
представление b}
var s:string;i:byte;
begin
s:='';
for i:=0 to 7 do begin
if (1 and (b shr i))= 0 then s:='0'+s else s:='1'+s;
end;
ByteByBit:=s;
end;
function TypeByBit(var b; n: integer): string;
{Функция возвращает строку, содержащую побитное
представление b;
n – размер b в байтах}
Type
t = array[1..Maxint] of byte;
var s:string;i:byte;
begin
s:='';
for i:=1 to n do
s:=s+ByteByBit(t(b)[i]);
TypeByBit:=s;
end;
var
r:real;
i:Shortint;
begin
i:=33; r:=-0.25;
writeln(TypeByBit(i,Sizeof(i)));{ фактический
параметр – переменная целого типа}
writeln(TypeByBit(r,Sizeof(r))); )));{ фактический
параметр – переменная вещественного типа}
Readln;
end.
30
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
