p align="left">Глобальні - описані у зовнішньому блоці але використовують у внутрішньому блоці. Наявність локальних і глобальних змінних дозволяє при творені складних програм використовувати одні і ті ж імена в різних блоках, що полегшує взаємодію програмістів. З іншого боку, можлива поява негативних побічних явищ, тому треба коректно створювати програми і придержуватись правил локалізації змінних. Правила локалізації змінних: змінна (константа) існує в рамках того блока де вона описана; кожна змінна в межах блока повинна бути описана тільки один раз; якщо у внутрішньому блоці використовується змінна, яка описана у зовнішніх блоках, то діє тільки опис самого внутрішнього блоку (найблищого); якщо змінна описана як у внутрішньому так і у зовнішньому блоках, то при переході до внутрішнього блока опис зовнішнього блока не використовується, тобто діє опис внутрішнього блоку. При переході до зовнішнього блока знову починається дія опису зовнішнього блока. В мові Паскаль існує два типа процедур і функцій: з параметрами; без параметрів. Вони відрізняються способом їх вмикання в основну програму. 6. Процедури з параметрами Для успішної побудови блочних програм необхідно оволодіти двома методиками: розробки побудови процедури; використання процедури в програмі або в іншій процедурі. a. Методика розробки процедури. Як було сказано, процедура складається із заголовка і блока. Блок будується стандартно і не відрізняється від блока програми за винятком того, що наприкінці процедури ставиться крапка з комою. Розглянемо заголовок (рис.1). ім'я вибирають довільно. Параметри, які містяться у списку параметрів, носять назву формальних - т.б. вони не приймають ніяких значень, а тільки позначають місця, на які далі будуть поставлені так звані фактичні параметри. Параметри позначають початкові дані (аргументи) і результати виконання процедури. Список параметрів складається із окремих секцій, які відокремлюють крапкою з комою ( ; ). В секції вказується перелік (список) параметрів і через двокрапку їх тип. Наприклад: Procedure R(x, y : real; k : integer; var s : real); Тут параметри x і y вказують першу секцію, k - другу, s - третю. Розміщення секцій параметрів в них довільне. В даному прикладі x, y, k - параметри значення; s - оператор-змінна, перед яким повинно стояти службове слово var. Особливості цих параметрів ми розглянемо далі, а поки будемо вважати , що параметри-значення - аргументи функції, а параметри-змінні - результати виконання процедури. Приклад1 розробки процедури: Procedure Sum (a, b : real; var y, z : real); const n=10; var i : integer; begin for i := 1 to n do begin y := a + b * i; z := 4 * y - i; end; end. Тут a і b - вхідні параметри, їх значення передаються із основної програми в цю процедуру. Результати процедури (вхідні параметри)є обчислені значення y і z, які передаються із процедури в основну програму і там можуть бути використані. b. Методика використання процедури у зовнішньому блоці. Для використання процедур існує так званий оператор процедури: <ім'я процедури>_ (список фактичних параметрів) Ім'я повинно співпадати з іменем записаної процедури. Параметри у дужках носять назву фактичні. Вони відповідають реальним змінним, над якими виконують операції. Фактичні і формальні параметри повинні відповідати одне одному за містом їх розміщення і типом. Список фактичних параметрів не містить типів даних, бо вони вже вказані у списку формальних параметрів. Program PR; … procedure P(x, y : real; var z : real ); … end; begin … P(a, b, c);{виклик процедури} … end. Рис.3 Приклад 2: в програмі визначити довжину кола C і площі круга S, обмеженого цим колом; відстань L центра кола від початку координат О. Координати центра кола - x, y , радіус кола - R. Program KOLO ( input, output ); Var R : real; {радіус} x, y : real:{координати центра} C : real;{довжина кола} S : real;{площа круга} L : real;{відстань від центру} Procedure KRUG ( R, x, y : real; var C, S, L : real); Const pi = 3.14; Begin C := 2 * pi * R; S := pi* sqr ( R ); L := sqrt ( sqr(x) + sqr(y)); End; Begin Writeln ( ` ввести R, x , y :`); Read ( x, y , R); KRUG ( R, x ,y, C, S, L); Writeln (`довжина кола = ', C : 6 : 2); Writeln (`площа кола = ', S : 6 : 2); Writeln (`відстань = ', L : 6 : 2); End. Результат виконання: Ввести значення R, x, y: 386 довжина кола = 18,84 площа круга = 8,26 відстань = 10,00 Пояснення процесу звертання до процедур: При виконанні дій, заданих оператором процедури, виконується передача фактичних параметрів, т.б. їх підставка на місце фіктивних. Таким чином в тілі процедури кожен формальний параметр заміняється фактичним. Виникає, так зване, модифіковане тіло процедури, яке безпосередньо реалізується ЕОМ. Після виконання процедури в комірках пам'яті ЕОМ залишаються результати, які поіменовані фактичними параметрами, які відповідають даним результатам. Суть (трактовка) параметрів-значень і параметрів змінних. Розглянемо особливості передачі параметрів із зовнішнього блоку до внутрішнього. 1-й спосіб - підстановка на місце формальних параметрів обчислених значень фактичних параметрів. Наприклад: Sum (3.5, 7.6, y, z); 2-й спосіб - підстановка замість формальних параметрів імен фактичних параметрів: Sum (x1, x2, y, z); При цьому результати процедури завжди утримують імена (і не обов'язкого співпадаючи з іменами формальних параметрів). Наприклад: Sum (x1, x2, С, D); Розглянемо можливі варіанти опису фактичних параметрів у зовнішньому блоці і відповідне звертання до процедури. Таблиця 1 І. Procedure P (x : тип; y : тип; var z : тип); |
1 | A - const; B - const; C - var | P (A, B, C) | | 2 | A - var; B - var; C - var | A := F1; B := F2; ……………. P (A, B, C); або read (A, B); …………… P (A, B, C); | | 3 | C - var; | P (3, 4 ,C); | | |
ІІ. Procedure P1 (var x : тип; var y : тип; var z : тип); |
4 | var; var; var; | A := F1; B :=F2; aбо read (A, B); …………………… P1 (A, B, C); | | |
Коментарій табл.1: 1) фактичні параметри A,B у зовнішньому блоці описані як const і замінюють формальні параметри-значення x, y процедури Р; 2) фактичні параметри А і В обчислюються або вводяться у зовнішньому блоці перед вставленням їх у процедуру; фактичні параметри А і В не об'явлені. Тому замість їх імен вставленні конкретні значення 3 і 4; всі параметри задані змінні, тому при формуванні модифікованого тіла процедури на місце формальних параметрів підставлені імена фактичних параметрів. 7. Процедури без параметрів В таких процедурах замість формальних параметрів використовують глобальні змінні. Використання процедур без параметрів потребує уваги і коректності при складанні програм, точного дотримання правил локалізації змінних. Для приклада 2 - програма обчислення параметрів кола при використані процедури без параметрів буде мати вигляд: Приклад 2а: Program KOLO1 ( input, output ); Var R, x, y, С, S, L : real; Procedure KRUG ( R, x, y : real; var C, S, L : real); Const pi = 3.14; Begin C := 2 * pi * R; S := pi* sqr ( R ); L := sqrt ( sqr(x) + sqr(y)); End; Begin Writeln ( ` ввести R, x , y :`); Read ( x, y , R); KRUG ; Writeln (`довжина кола = ', C : 6 : 2); Writeln (`площа кола = ', S : 6 : 2); Writeln (`відстань = ', L : 6 : 2); End. Змінні, яки використані у процедурі описані як глобальні. 8. Особливості використання функцій За своїм призначенням і способом побудови функція мало чим відрізняється від процедур. Особливості функцій: має тільки один результат виконання; результат позначається іменем функції і передається в основну програму, тому імені функції присвоюють необхідний тип даних: форма побудови функції відрізняється від процедури тільки заголовком; можна викликати в середині виразу: F := FAST (M) - FAST (K); Приклади заголовків функції: FUNCTION f (a, b :real) : real; А і В - дійсні параметри значення; F - ім'я функції, яка отримає результат виконання функції типа real/ FUNCTION f1 (x : real; var y, z : integer) : real; x - дійсні параметри значення; y, z - цілі параметри змінні; Суть параметрів-значень і параметрів-змінних аналогічна процедурам FUNCTION f2 : real; без параметрів Приклад 3; знайти різницю факторіалів F=m! - k! FUNCTION FACT ( n: real) : real; Var i :integer: p : real; Begin p :=1: for i := 1 to n do p := p * i; FACT := p; End; Тут FACT - ім'я функції, якому присвоюється результат типа real. Формальним параметром є n - параметр-значення типу integer. (наприк. m i k): F := FAST (M) - FAST (K); Таким чином, якщо процедури і функції розробляються для багаторазового використання, краще їх використовувати з використанням параметрів, щоб досягнути максимальної незалежності від тієї програми, де вона використовується. 9. Методи звертань до процедур і функцій Існує 3 варіанти звертання до процедур і функцій: із зовнішнього блоку (цей спосіб розглянули у попередніх питаннях лекції); із сусідньої функції; із самої функції - рекурсія. Розглянемо на прикладах 3-й і 2-й варіанти звертання: Функцій (процедура), яка викликає сама себе називається рекурсивною. Суть рекурсії розглянемо на прикладі4: Визначити факторіал у рекурсивній формі: n!=1, при n=0ж n!=n(n-1)!, при n>0. Тут n! визначається через (n!-1), т.б. через ту ж саму функцію. Programa FACT (input, output); Var n : integer; FUNCTION F ( v : integer) : integer; Begin If v = 0 then F := 1 else F := v * F(v-1); End; Begin Writeln (` ввести аргумент n `); Read ( n ); If n<0 then Writeln (`факторіал не визнач.'); else Writeln (`факторіал', n ,'= ', F(n)); end. В прикладі4 рекурсивна функція F можно представити і не в рекурсивною: FUNCTION F( v : integer) : integer; Begin F := 1: for i := 1 to v do F := F * i; End; Особливість: на реалізацію рекурсивної функції ЕОМ затрачує значний час, хоча її опис більш компактний і наочний. Не рекурсивні функції обчислюються швидко. Формально у мові Паскаль не дозволяється використовувати конструкції, які ще не описані. Для виключення таких ситуацій використовують, так званий, випереджальний опис процедур і функцій. При цьому до опису процедури F1 вказується на подальші використання процедури F2. Тоді звертання з F1 до F2 допустимо (рис.5). Program Pr…; Procedure F2 (…); FORWARD; Procedure F1 (…); … F2 (…); End; Procedure F2; … end; begin … end. Рис.5 Pr містить 2-і незалежні процедури F1, F2. В F1 є звертання до F2, тому використаний випереджальний опис процедури F2, який складається із заголовка з параметрами і службового слова FORWARD. Тоді сам опис F2 має заголовок без повторення формальних параметрів. Особливості: при наявності у складі програми декількох процедур або функцій, які звертаються одна до одної, то виникає, так звана, пряма рекурсія. У цьому випадку використовують випереджальний опис процедур. Вхід до блоку процедур або функцій тільки через його початок, а вихід по закінченню всіх дій. Т. ч. оператори go to - заборонені, т.б. всі мітки у блоці належать блоку і описуються у блоці. Поняття локальних і глобальних міток не існує. при необхідності із середини блока можна використати стандартну процедуру EXIT , яка має форму: EXIT (аргумент) Якщо аргументом є ім'я програми або службове слово PROGRAM , то виконання програми достроково завершується. Якщо аргументом є процедура або функція, то вони завершуються і управління передається в той блок, який викликав процедуру або функцію. Т.б. оператору, який стоїть після оператору виклику при використанні в процедурах і функціях глобальних змінних, можлива поява побічних ефектів. Висновки Таким чином, в Паскалі є широкі можливості використання процедур і функцій, що надає більшу наочність, компактність, структурованість програм; виникають умови для створення складних програмних комплексів групами програмістів; процес програмування стає більш систематичним і цілеспрямованим.
Страницы: 1, 2, 3
|