Сторінка
4

Паскаль: типи дійсних, оператори розгалуження, функції та їх виклики, процедури, під задачі

4. Процедури, підпрограми та параметри Розглянемо задачу: довільні значення трьох змінних a, b, c переставити за необхідності так, щоб вони були упорядковані за неспаданням, тобто щоб мали місце нерівності a£ b£ c. Алгоритм розв'язання цієї задачі простий: якщо a>b, то обміняти значення змінних a і b; {гарантовано, що a£ b} якщо b>c, то обміняти значення змінних b і c; {гарантовано, що b£ c і a£ c; але нерівність a£ b не гарантована, тому:} якщо a>b, то обміняти значення змінних a і b. Обмін значень двох змінних, наприклад, a і b, задається трьома операторами з допоміжною змінною: t:=a; a:=b; b:=t. Мовою Паскаль алгоритм записується так: program sort3(input, output); var a, b, c, t : integer; begin writeln('задайте три цілих'); readln(a, b, c); if a>b then begin t:=a; a:=b; b:=t end; if b>c then begin t:=b; b:=c; c:=t end; if a>b then begin t:=a; a:=b; b:=t end; writeln('упорядкування: ', a, ' ', b, ' ', c) end. Проте три майже однакові складені оператори, що задають ті самі дії, тільки з різними змінними – це нудно. Аналогічно функціям, можна один раз описати обмін значень двох змінних, представлених параметрами, дати ім'я цьому опису, а потім тільки позначати його, тобто вказувати ім'я опису й змінні, чиї значення повинні обмінятися. На відміну від функцій, при обміні відбувається не обчислення якогось одного значення, а змінюється стан пам'яті програми (недарма обмін заданий складеним оператором). Тому такий опис оформляється й використовується інакше. Опис обміну задається процедурою, а її виклик являє собою окремий оператор. Процедура має загальний вигляд procedure ім'я(означення параметрів); означення імен begin послідовність операторів end; Процедура, як і функція, є означенням імені і записується серед означень програми. На відміну від функції, в її заголовку немає імені типу для значень, породжуваних у результаті виклику, тому що ніякі значення не породжуються. За цією ж причиною в тілі процедури не може бути операторів присвоювання з її ім'ям у лівій частині. Виклик процедури складається з імені й аргументів у дужках і записується як окремий оператор, наприклад, readln(x, y). Отже, напишемо інший варіант програми упорядкування трьох значень: program sort31(input, output); var a, b, c : integer; procedure swap(xx, yy : integer); var t : integer; begin t:=xx; xx:=yy; yy:=t end; begin writeln('задайте три цілих:'); readln(a, b, c); if a>b then swap(a, b); if b>c then swap(b, c); if a>b then swap(a, b); writeln('упорядкування: ', a, ' ', b, ' ', c) end. КРАСИВО, АЛЕ НЕПРАВИЛЬНО! Справа в тім, що при виконанні виклику, наприклад, swap(a, b), змінні xx і yy одержать значення змінних a і b, потім ці значення поміняються місцями, виконання виклику закінчиться, а в змінних a і b залишаться ті ж самі значення, що були перед викликом. Наприклад, якщо змінним a, b, c присвоїти "з зовнішнього світу" значення відповідно 3, 1, 2, то буде надруковано упорядкування: 3 1 2. Слушність цього напису дуже сумнівна. Отже, при виконанні виклику процедури (чи функції) спочатку параметри одержують значення аргументів, а потім їх зміни ніяк не відбиваються на аргументах (рис.3.3). Тому параметри, що дотепер розглядалися, називаються параметрами-значеннями. Мова Паскаль допускає в заголовках процедур і функцій означати параметри іншого виду. Вони називаються параметрами-змінними і означаються зі словом var попереду. Так, процедура swap набуває вигляду: procedure swap(var xx, yy : integer); var t : integer; begin

t:=xx;

xx:=yy;

yy:=t

end; Таке означення параметрів забезпечує, що при виконанні виклику процедури або функції іменам параметрів ставляться у відповідність змінні, тобто ділянки пам'яті, уже зіставлені аргументам. При виконанні виклику зміна значення параметра-змінної насправді є зміною значення аргументу (рис.3.4).

Момент виконання програми

a

b

c

перед першим викликом

3

2

1

після першого виклику

2

3

1

після другого виклику

2

1

3

після третього виклику

1

2

3

       
Якщо в програмі sort31 означити параметри процедури як параметри-змінні, то за виконання виклику swap(a, b) імені xx зіставляється та ж сама ділянка пам'яті, що й змінній a, а імені yy – та ж, що b. У результаті обмін місцями значень xx і yy є обміном a і b. Що й було потрібно. Таким чином, якщо в змінні a, b, c програми було прочитано значення 3, 2, 1 відповідно, то результати виконання викликів процедури swap можна подати станами пам'яті програми, як на рис.3.5. Функції та процедури в мові Паскаль мають загальну назву: підпрограми. У заголовках підпрограм можна означати як параметри-значення, так і параметри-змінні. Означення однотипних параметрів того самого виду називається секцією, і означення параметрів насправді є послідовністю секцій. Секція параметрів-значень – це список імен, за яким після двокрапки записано ім'я типу, наприклад, a1, a2 : real. Секція параметрів-змінних починається словом var, за яким записано список імен параметрів таім'я типу, наприклад,

var xx, yy : integer. Секції розділяються ";". За необхідності ми могли б написати, наприклад,

Перейти на сторінку номер:
 1  2  3  4  5 


Інші реферати на тему «Інформатика»: