Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programuv_good.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
990.21 Кб
Скачать
  1. Параметри-змінні

Виступають в якості вихідних параметрів. Це означає, що їх початкове значення може змінюватися у тілі підпрограми і ця зміна повертається в точку виклику підпрограми.

Таким чином при фактичному виклику підпрограми в якості фактичних параметрів змінних можуть використовуватися лише змінні.

Оголошуються парамерти змінних при допомозі var і переліку ідентифікаторів та задання їх типу, якщо підпрограма має декілька параметрів змінних при формальному оголошенні, кожному з них повинен передувати var.

В попередньому прикладі параметром змінної була змінна с.

Наприклад

сумування дійсних чисел.

PROCEDURE SUMA_RITH (a, b:real; var s:real; var r:real);

BEGIN

s:=a+b;

r:=a-b;

END;

VAR x, y, z, t:real;

BEGIN

x:=5; y:=2;

SUMA_RETH(x,y,z,t);

SUMA_RITH(4,3,z,t);

END;

В одному прикладі є два параметри змінних, які формально позначенні s та r, при фактичному виклику їх використовують як змінні t, z.

Параметри змінних можуть виконувати функцію вхід і вихід параметрів одночасно. Результат суми зберігається в першому аргументі, а різниця в другому.

PROCEDURE P (var a:real; var b:real);

var x:real;

BEGIN

x:=a;

a:=a+b;

b:=x-b

END;

VAR x,y:real;

BEGIN

x:=5; y:=3;

P(x,y);

END;

Якщо параметр-змінна виконує функцію вхідного параметра, то при фактичному виклику можна використовувати лише змінні.

В даній процедурі оголошена своя змінна х для тимчасового збереження одного із вхідних даних, така змінна – локальна і використовується лише у межах даної підпрограми.

Час її існування при виконані програми теж є тимчасовим, лише під час виконання підпрограми.

В зовнішній підпрограмі x,y – глобальні змінні. Вони доступні в межах всієї програми і всіх для її підпрограм.

Якщо в підпрограмі є однойменні локальні і глобальні змінні, то уникнення конфлікту імен здійснюється завдяки так званому екрануванню ідентифікаторів, тобто в межах кожної підпрограми доступним є лише свій локальний об’єкт. Він перекриває однойменні глобальні об’єкти, а глобальної змінної х доступу немає, хоча легко доступна глобальна змінна y.

  1. Без типові параметри

Можуть виконуватися, в якості вхідних і вихідних як параметри змінних, але на відмінну від них, не вимагають задання типу. При фактичному виклику на їх місці може стояти змінна будь-якого типу (найчастіше використовують вказівними).

Такі параметри використовують тоді, коли розміри ділянки пам’яті, де зберігається значення параметрів є невизначеним наперед. В цьому випадку передається не вся комірка, а адреса її початку, тобто вказівник на неї.

Оголошуються без типові параметри при допомозі var, після якого іде перелік ідентифікаторів без вказання типу.

При фактичному виклику підпрограм із без типовими параметрами найчастіше використовуються змінні вказівного типу, що є вказівником комірки з даними.

Цими параметрами можуть бути лише змінні.

Механізм виклику підпрограм

Кожна підпрограма є окремою командою в головній програмі. При зверненні до підпрограми відбувається передача управління в частину виконуваного коду програми, який відноситься до цієї підпрограми. Після завершення підпрограми відбувається повернення в основну програму.

Для цього спеціальному сегменту підпрограми, який називається сегментом стеку, записуються адреси точок повернення після виконання програми.

В цьому сегменті розміщуються всі локальні змінні даної підпрограми, а також її фактичні параметри. Це означає, що звертання до багатьох підпрограм з деякою кількістю фактичних параметрів змінних вичеркує сегмент стеку, тому потрібно контролювати цю ситуацію, бо програма перерве своє виконання при переповненому стеку.

Два байти на адресу сегменту і два байти на зміщення в ньому.

Рекурсія

Використання підпрограми із механізмом передачі параметрів дозволяє реалізувати такий спосіб повторення як рекурсія деякого алгоритму за рахунок звернення до самого себе.

Рекурсія – такі підпрограми, які в самому тілі містять фактичний виклик самої себе.

« А этот глист страдал глистами, которые глистами мучались сами».

При рекурсивних викликах, очевидно потрібно забезпечити деяку умову зупинки, інакше таке повторення буде безкінечне. Для встановлення умови зупинки в тілі підпрограми використовується деяка перевірка, в залежності від результату якої відбувається ще один рекурсивний виклик, або ще одна зупинка дія, що відповідає зупинці рекурсії. Одним із фактичних параметрів буде входити в умову перевірки зупинки рекурсії. Якщо ж рекурсивна підпрограма без параметрів, то зупинити рекурсію можна лише або через глобальні змінні, або примусовою дією.

Наприклад

PROCEDURE P1;

BEGIN

Writeln(‘hello’);

P1;

END;

Це приклад необмеженої рекурсії, за рахунок процедури без параметрів.

VAR

n: integer;

PROCEDURE P2;

BEGIN

n:=n+1;

writeln(‘hello’);

if n<=3276 then P2 else writeln(‘stop”)

END;

BEGIN

n:=0;

P2;

END.

Дана процедура реалізує скінчену рекурсію з лічильником у вигляді глобальної змінної.

PROCEDURE P3 (n: integer);

BEGIN

Writeln(‘hello’);

If n<=3767 then P3(n+1) else writeln(‘stop’)

END;

BEGIN

P3(0)

END;

Цей приклад процедури з параметром.

Класичний приклад рекурсивного прикладу – це функція факторіал.

PROCEDURE p_fact(n: integer: var f: integer);

VAR f1: longint;

BEGIN

If n=0 then f:=1 else

begin

P_fact (n-1, f1);

F:=n*f1

end;

END.

FUNCTION f_fact(n:integer):longint;

BEGIN

If n=0 then f_fact:=1 else f_fact:=n*f_fact

END;

Розглянемо послідовність викликів для процедури. Нехай потрібно обчислити 3!.

При допомозі рекурсії можна реалізувати будь-який повторювальний алгоритм. Головне, щоб мали місце дві умови:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]