Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Програмирование. Структурное програмирование, подпрограммы, строки. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
что она получает свое исходное значение как копию соответствующего фактического параметра при активизации (вызове) процедуры или функции.
Изменения формального параметра-значения не влияют на значе­ние фактического параметра. Поэтому с его помощью нельзя возвра­тить результат работы подпрограммы в вызвавшую программу или подпрограмму.
Формальные параметры-значения включают в заголовок подпро­граммы в том случае, когда в подпрограмму необходимо передавать исходные данные из вызывающей ее программы или подпрограммы.
формальный параметр­значение
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]