Б С Бусигін - Прикладна інформатика - страница 39

Страницы:
1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83 

End.

Рис. 8.48. Привласнення значення дії функції до її імені (Sqrt_11)

Змістовна частина підпрограм уявляє собою блок і складається з:

О Розділу описів (міток, констант, типів, змінних, процедур, функцій). в Розділу операторів, що уявляє собою складовий (рос. - составной) оператор (begin ... end).

© Закінчується блок підпрограм точкою з комою. Практично завжди відносно прості вирази можна реалізувати і за допомогою процедур, і за допомогою функцій. Компоновка використання змінних може бути різноманітною. Це можна відслідкувати на реалізації демонстраційної програми GLAVN, у якій показана взаємодія формальних, фактичних, глобальних і локальних параметрів (рис. 8.49).

Program GLAVN; Const GLOB1 = 5.0; Var

GLOB2,   FACT1,   FACT2,  V,S   : Real; Procedure Demo1 (FORM1  :  Real; Var FORM2  :  real); {Перша

процедура}

Const Lock1 = 3.141592653; {У локальній константі Lock1-

значення п}

Var

Lock2,  Lock3  : real;

Begin

{Процедура Demo1 обчислює значення площі круга S = п-R2, а потім об'єм} {циліндра за формулою V = H * S = H * п * R2. Значення (аргумент) } { R подається через формальний параметр FORM1, Обчислене значення } { V повертається через фактичний параметр FACT, який підставляється на} {місце формального параметру FORM2, а значення площі S передаємо} {через глобальну змінну GLOB2. Висота циліндра h знаходиться у } {глобальній константі GLOB1.  Lock2,  Lock3 - локальні змінні.} LOCK2   := LOCK1 * SQR ( FORM1); {S засилаємо у локальну змінну LOCK2} GLOB2   := LOCK2;

FORM2   := GLOB1 * LOCK2; end;  {Proc Demo1}

{-------------------------------------------------------------------------------- }

Procedure Demo2; {Друга процедура, яка працює без формальних параметрів}

Begin S   := PI * SQR(FACT1);

v := GLOB1 * S; end; {Proc Demo2} Begin {Операторна частина програми} Writeln('Vvedite radius osnovanija cilindra u zminnu FACT1:'); Readln(FACT1); {Значення радіуса R уведено у змінну FACT1} DEMO1(FACT1, FACT2); Writeln('Znach.R',R,FACT1,'Znach.S=',GLOB2, 'Znach.V=', V);

DEMO2;

Writeln('Znach.R',R,FACT1,'Znach.S=',GLOB2,'Znach.V=', V); end.

Рис. 8.49. Приклад використання процедур з параметрами і без параметрів, а

також різних типів параметрів і змінних

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

Змінні і константи, що описані у підпрограмах можна вживати тільки у них самих, тому звуться вони локальними.

Треба знати і розуміти, що імена глобальних змінних і констант можуть співпадати з іменами:

О Формальних параметрів підпрограм. © Локальних параметрів у підпрограмах.

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

Program GLAVN; Const GLOB1 = 5.0; Var

GLOB2,  FACT1,   FACT2,  V,S   : Real; Procedure Demo1(FORM1  :  Real; Var FORM2); Const GLOB1 = 3.141592653;

Var

FACT1,  Lock3  : real;

Begin

end;

Begin

End.

FACT1 := GLOB1 * SQR(FORM1); GLOB2 := FACT1 * GLOB1;

Рис. 8.50. Перехрещення глобальних і локальних змінних

Згідно цього фрагмента програми, змінні ОЬОБІ і ЕАСТ1, що описані як локальні параметри процедури Бешої мають зовсім інші значення, ніж глобальні змінні з такими ж іменами ЗДіОБІ і ЕАСТ1 у головній програмі!

А при передачі значень у підпрограми через фактичні параметри існує два головних механізми їх подальшого використання: "за значенням" та "за адресою".

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

Взагалі, при написанні підпрограм, треба мати на увазі, що для них, формальні параметри (наприклад FORM1 чи FORM2 на рис. 8.51) уявляються просто "пустушками", які потім заміщуються при виклику конкретними значеннями, котрі можна потім використовувати у потрібних діях в операторах головної програми (рис. 8.51).

Var

FACTl, FACT2   : real;

Procedure Demol(FORM1  :  Real; Var FORM2  : Real); Const Lockl = 3.141592653;

Var

Lock2,  Lock3  : real;

Begin

LOCK2   := LOCK1 * SQR(FORM1);

GLOB2 := LOCK2;

FORM2   := GLOB1 * LOCK2;

end;

Begin

FACTl := 2.3;

Demol (FACTl, FACT2);

FACT1   := FACT1  / FACT2;

End.

Рис. 8.51. Два типи передачі формальних параметрів: -"за значенням" - формальний параметр FORM1 -"за адресою" - формальний параметр FORM2

Отже об'єкт або так звана "пустушка" FORM1 зветься формальним параметром підпрограми Demol. А змінна FACT1, яка передає конкретне значення (2.3) і підставляється при виклику процедури Demol на місце формального параметра FORMl зветься фактичним параметром.

FORMl забезпечує при викликах процедури передачу фактичних параметрів "за значенням". Це означає, що значення аргументу (тобто фактичного параметру) просто призначається відповідному формальному параметру. Іншою мовою, перед початком роботи процедури обчислюється

2SSконкретне значення фактичного параметра і він може передаватися у підпрограму таким чином:

О У вигляді значення глобальної змінної (наприклад - ОЬОБІ), яке передається у процедуру РР2 при її виклику через формальний параметр (рис. 8.52).

Var

GLOB1,  GLOB2   : Real;

Procedure PP2 (FR : Real); Begin

GLOB2 := FR * 5.62e-4;

end;

Begin

GLOBl := 3.l4 *2.73;

PP2 (GLOBl);

End.

Рис. S.52. Фактичний параметр - глобальна змінна

в У вигляді деякого значення (числової константи) (рис. 8.53):

Var

GLOBl, GLOB2 : Real;

Procedure PP3 (FR : Real);

Var

Lock1  : Real;

Begin

GLOB2   := 2 5 * FR; {GLOB2 значення 25 * 23.2} end;

Begin

PP3 (23.2);

буде мати

End.

Рис. S.53. Фактичний параметр - константа

© У вигляді виразу, який обчислюється до передачі у підпрограми (рис. 8.54):

Var

GLOB1,  GLOB2   : Real;

Procedure PP4 (FR : Real);

Var

Lock1  : Real;

Begin

GLOB2 := 29.31 * FR;

end;

Begin

PP4(cos(0.52)*3.14/exp(3.0));

End.

Рис. 8.54. Фактичний параметр - вираз

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

Фактичний параметр

Головна програма

5.G

(може бути виразом і тоді обчислюється)

Копіюється у формальний параметр підпрограми

5.G

Формальний параметр підпрограми (з підпрограми значення не повертається)

Підпрограма

Рис. 8.55. Механізм передачі параметрів "за значенням"

Іншим чином виконується передача параметрів "за адресою", яка ще зветься "передачею за посиланням (рос. - по ссылке)" або передачею за \iar-параметром або параметром-змінною.

За такий спосіб передачі параметра у підпрограму (процедуру або функцію) пересилається вже  не значення аргументу,  а адреса його

місцезнаходження (адреса у пам'яті комп'ютера). Якщо формальний параметр має атрибут var у його опису у голові підпрограми, а відповідний фактичний аргумент є змінною, то будь-які зміни значення формального параметра у тілі підпрограми будуть замінені його значенням за адресою аргументу, що підставлений. Це пов'язано з тим, що у цьому випадку формальний і фактичний параметри займають одне і те ж місце у пам'яті (рис. 8.56)

Головна програма

Фактичний параметр (повинен бути змінною!)

Одна і та ж

область пам'яти

Формальний var-параметр

Підпрограма

Рис. 8.56. Механізм передачі параметрів "за посиланням" (рос. - по ссылке)

(або за адресою)

Тому, щоб повідомити компілятор про намір користувача передавати деякий параметр за адресою (за посиланням), у заголовку підпрограми потрібно указати перед його ім'ям службове слово ^аг".

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

Як вже з'ясувалося, у тілі підпрограми використання глобальних змінних і var-параметрів практично не відрізняється. Важливо інше.

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

GLOB1,  GLOB2   : Real; Procedure PP5   (FORM1  :  Real;  var FORM2   : real); Var

Lock1  : Real;

Begin

FORM2  := FORM1+ 2.5; {Значення GLOB2 у головній програмі } { зміниться на (5.0 + 2.5)  = 7.5, бо FORM2 var-параметр!} FORM1  := FORM1 - 3.32; {Так взагалі писати не можна (!!!),} ^{бо FORM1 - значення, якому нічого привласнити не можна!}

end;

Begin

GLOB1   := 5.Q;

PP5   (GLOB1, GLOB2); {Виклик процедури PP5} Writeln('GLOBl=',  GLOB1:8:2,   'GLOB2=', GLOB2:8:2);

End.

Рис. S.57. Приклад формування виклику процедури

При завершенні роботи програми (рис.21.13) на екран буде виведено:

GLOB1=        5.QQ      GLOB2= 7.5Q,

Тобто значення GLOBl (що підставлялося на місце параметру-значення) -не змінилося, а помінялося тільки значення у змінній GLOB2, яка підставлялася на місце параметру-змінної.

Var

GLOB1, GLOB2 : Real; Procedure PP6 (FORM1 : Real); Begin

GLOB2:= GLOB1 + FORM1;

end;

Begin

GLOBl := 5.Q;

PP6   (5.Q);        {Стає GLOB2 =10 }

GLOBl := lQ; PP6 (lQ); {Стає GLOB2 =20 }

End.

Рис. 8.58. Приклад впливу зміни значень глобальної змінної GLOBl на результат обчислення процедурою PP6

Фундаментальним уявленням є те, що результат дії процедури може повертатися у головну програму лише або через глобальний параметр (наприклад - оьов2) або через var-nарамеmр.

І тут треба розуміти, що взагалі необхідно розробляти підпрограму таким чином, щоб результат її дії повертався тільки через var-параметр. Це пов'язано з тим, що у мові ТП є змога компілювати підпрограми відокремлено від головної програми у виді так-званих модулів25. У цьому випадку зв'язок з підпрограмами повинен забезпечуватися тільки через формальні (прості і var) параметри (рис. 8.59). .—.

Страницы:
1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83 


Похожие статьи

Б С Бусигін - Прикладна інформатика