Паскаль. Прикладне програмне забезпечення


Функції, процедури та підпрограми

1.Функція та її виклики

Розглянемо задачу: обчислити мінімальну з відстаней між точками площини Ax1; y1, Bx2; y2 і C1;2. Алгоритм розв'язання цієї задачі очевидний:

1 обчислити відстані d1=AB, d2=AC, d3=BC;

2 обчислити m= min{d1, d2, d3}.

Відстань між точками з довільними координатами x; y, x'; y' виражається формулою

D=,і для обчислення відстаней нам необхідно тричі написати Паскалівський варіант цієї формули з різними наборами координат: x1, y1, x2, y2, потім x1, y1, 1, 2, потім x2, y2, 1, 2. Ці вирази досить громіздкі й задають по суті ті самі обчислення, тільки з різними наборами значень. Все це можна записати інакше.

Мова Паскаль дозволяє описати повторювані обчислення один раз, дати цьому опису ім'я і далі не описувати самі обчислення, а тільки позначати їх цим ім'ям.

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

Функції.

У даному випадку параметрами будуть чотири координати двох точок. Назвемо їх a1, b1, a2, b2. Опис обчислень задається у вигляді функції, якій ми дамо ім'я dd:

Function dda1, b1, a2, b2: real:real;

Begin

Dd:=sqrt sqra1a2+sqrb1b2

End;

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

Program minimdisinput, output;

Var x1, y1, x2, y2, d1, d2, d3, m: real;

Function dda1, b1, a2, b2: real:real;

Begin

Dd:=sqrt sqra1a2+sqrb1b2

End;

Begin

Writeln'введіть координати двох точок:';

Readlnx1, y1, x2, y2;

D1:=ddx1, y1, x2, y2;

D2:=ddx1, y1, 1, 2;

D3:=ddx2, y2, 1, 2;

If d1d2 then m:=d1 else m:=d2;

If d3m then m:=d3;

Writeln'найменша відстань: ', m

End.

При виконанні цієї програми після читання значень змінних виконується виклик функції dd: значення змінних x1, y1, x2, y2 присвоюються відповідним параметрам a1, b1, a2, b2 як звичайним змінним і потім обчислюється значення dd. Воно і є значенням виразу ddx1, y1, x2, y2, що присвоюється змінній d1.

Так само, тільки з іншими аргументами, виконуються другий і третій виклики функції, і інші значення присвоюються змінним d2 і d3.

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

Функція має такий загальний вигляд:

Function ім'яозначення параметрів: ім'я типу;

Означення

Begin

Послідовність операторів

End;

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

Параметрів у функції може не бути, тоді й дужки відсутні, а виклик такої функції є просто її ім'ям.

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

1 функція записується серед означень програми;

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

Виклик функції є виразом того типу, який указано в її заголовку. І він, як усякий вираз, може бути частиною складнішого виразу. Наприклад, за необхідності ми могли б написати d1:=sqrddx1, y1, 1, 2+1.

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

Function minx1, x2: real:real;

Begin

If x1x2 then min:=x1

Else min:=x2

End;

І помістити її слідом за функцією dd у програмі minimdis. З її використанням обчислення мінімального зі значень змінних d1, d2, d3 можна в тілі програми задати так:

M:=mind1, d2; m:=minm, d3

Або навіть так:

M:=minmind1, d2, d3

При обчисленні останнього виразу спочатку виконується внутрішній виклик mind1, d2. Значення, обчислене при його виконанні, стає аргументом у зовнішньому виклику.

Задачі

1. Написати функцію обчислення за дійсним параметром x:

А його знака signx=1, 0 або 1 відповідно при x0, x=0, x0;

Б ceilx – найменшого цілого, що не менше, ніж значення параметра для від'ємних значень параметра можливі два варіанти означення.

2. Написати програму обчислення периметра й площі трикутника за координатами його вершин.

3. Написати тригонометричні функції з дійсним параметром, значення якого вимірюються в градусах.

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

2.Процедури, підпрограми та параметри

Розглянемо задачу: довільні значення трьох змінних a, b, c переставити за необхідності так, щоб вони були упорядковані за неспаданням, тобто щоб мали місце нерівності a? b? c. Алгоритм розв'язання цієї задачі простий:

Якщо ab, то обміняти значення змінних a і b;

{гарантовано, що a? b}

Якщо bc, то обміняти значення змінних b і c;

{гарантовано, що b? c і a? c; але нерівність a? b не гарантована, тому:}

Якщо ab, то обміняти значення змінних a і b.

Обмін значень двох змінних, наприклад, a і b, задається трьома операторами з допоміжною змінною: t:=a; a:=b; b:=t. Мовою Паскаль алгоритм записується так:

Program sort3input, output;

Var a, b, c, t: integer;

Begin

Writeln'задайте три цілих'; readlna, b, c;

If ab then begin t:=a; a:=b; b:=t end;

If bc then begin t:=b; b:=c; c:=t end;

If ab then begin t:=a; a:=b; b:=t end;

Writeln'упорядкування: ', a, ' ', b, ' ', c

End.

Проте три майже однакові складені оператори, що задають ті самі дії, тільки з різними змінними – це нудно. Аналогічно функціям,

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

На відміну від функцій, при обміні відбувається не обчислення якогось одного значення, а змінюється стан пам'яті програми недарма обмін заданий складеним оператором. Тому такий опис оформляється й використовується інакше. Опис обміну задається процедурою, а її виклик являє собою окремий оператор.

Процедура має загальний вигляд

Procedure ім'яозначення параметрів;

Означення імен

Begin

Послідовність операторів

End;

Процедура, як і функція, є означенням імені і записується серед означень програми.

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

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

Отже, напишемо інший варіант програми упорядкування трьох значень:

Program sort31input, output;

Var a, b, c: integer;

Procedure swapxx, yy: integer;

Var t: integer;

Begin t:=xx; xx:=yy; yy:=t end;

Begin

Writeln'задайте три цілих:'; readlna, b, c;

If ab then swapa, b;

If bc then swapb, c;

If ab then swapa, b;

Writeln'упорядкування: ', a, ' ', b, ' ', c

End.

Але це неправильно!

Справа в тім, що при виконанні виклику, наприклад, swapa, b, змінні xx і yy одержать значення змінних a і b, потім ці значення поміняються місцями, виконання виклику закінчиться, а в змінних a і b залишаться ті ж самі значення, що були перед викликом.

Наприклад, якщо змінним a, b, c присвоїти з зовнішнього світу значення відповідно 3, 1, 2, то буде надруковано упорядкування: 3 1 2. Слушність цього напису дуже сумнівна.

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

Мова Паскаль допускає в заголовках процедур і функцій означати параметри іншого виду. Вони називаються параметрамизмінними і означаються зі словом var попереду. Так, процедура swap набуває вигляду:

Procedure swapvar xx, yy: integer;

Var t: integer;

Begin

t:=xx;

xx:=yy;

yy:=t

end;

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

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

var xx, yy: integer.

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

procedure qqx, y: integer; var z, t: integer.

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

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

Аргументом для параметразмінної може бути тільки ім'я змінної того ж типу, що й параметр. У літературі часто параметри підпрограм називаються формальними параметрами, а аргументи у викликах –фактичними.