Програмування. Середовище Turbo Pascal 0


§13. ІНКАПСУЛЯЦІЯ. ПОНЯТТЯ ПІДПРОГРАМИ



Сторінка6/8
Дата конвертації04.12.2016
Розмір1,69 Mb.
1   2   3   4   5   6   7   8
§13. ІНКАПСУЛЯЦІЯ. ПОНЯТТЯ ПІДПРОГРАМИ.

Інкапсуляція (в загальному випадку) – процес створення оболонки навколо речовини. Оболонка називається капсулою, речовина – інкапсульованою.

Інкапсуляція в програмуванні – це процес, в результаті виконання якого частина програми, що розв’язує під задачу агрегується в незалежну структуру, утворюючи капсулу. Капсули можуть використовуватися в програмі, як єдині закінчені частини програми. Так для розв’язання задачі попереднього уроку, можна попередньо створити дві незалежні структури: структуру, що обчислює опір послідовно з’єднаних провідників та структуру, що обчислює опір паралельно з’єднаних провідників. Тоді, використовуючи першу структуру, можна знайти опори R12 та R34, а використовуючи другу структуру – опір R.

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



  1. З головної програми капсулі можна було б передати значення двох опорів (наприклад R1 та R2).

  2. Капсула повинна передавати головній програмі значення загального опору (а саме опору R12).

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

Програміст створивши підпрограмну капсулу має можливість багаторазового використання капсули. Так одну підпрограмну капсулу призначену, наприклад, для знаходження опору двох послідовно з’єднаних провідників можна використати двічі: для знаходження опору R12 та опору R34.

Підпрограмні капсули будемо називати підпрограмами.
ПІДПРОГРАМА

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

Процес використання підпрограм розділяється на 2 етапи:


  • опис підпрограми (підпрограма утворює незалежну капсулу);

  • виклик підпрограми з головної програми (передача управління від головної програми до під програмної капсули).

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

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

Механізми процедури та функції є обов’язковими для мов високого рівня.

ОПИС ПІДПРОГРАМИ

Опис підпрограми розглянемо на прикладі опису підпрограмної капсули знаходження опору провідників:



  1. Послідовно з’єднаних (successive – в перекладі з англ. послідовне)

  2. Паралельно з’єднаних (parallel – в перекладі з англ. паралельне)


Розглянемо дію процедури.

Послідовне з’єднання Паралельне з’єднання


procedure successive(a,b: real; var c:real);

begin


c := a + b;

end;



procedure parallel (a,b: real; var c:real);

begin


c := (a*b)/(a + b);

end;



Процедура складається з:

  • заголовка (розпочинається словом procedure);

  • тіла процедури (міститься між словами begin…end;

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

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

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

Слід зауважити, що процедура ніяких значень не виробляє. Тому, щоб передати значення від процедури у головну програму необхідно у списку параметрів вказувати параметри-змінні.
Розглянемо задачу минулого заняття. Знайти значення сили струму, що споживає показана на малюнку схема. Опори R1, R2, R3, R4 та напруга U вводяться з клавіатури.
procedure successive(a,b: real; var c:real);

begin


c := a + b;

end;
procedure parallel (a,b: real; var c:real);

begin

c := (a*b)/(a + b);



end;

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

Var

R,R1,R2,R3,R4,U,I:real;



R12,R34:real;

Begin


Write(‘R1 = ‘); read(R1);

Write(‘R2 = ‘); read(R2);


successive(R1,R2,R12);

successive(R3,R4,R34);

parallel(R12,R34,R);

I := U/R;

W
Зауваження!!!. Параметри можуть мати такі ж імена як і об’єкти програми. Тобто в нашому прикладі для кращого розуміння підпрограми замість параметрів a, b та c в описі процедури можна використати R1, R2 та R.
riteln(‘I = ‘,I:5:2);

End.


Розглянемо дію функції.

Послідовне з’єднання Паралельне з’єднання


Функція

function parallel(a,b: real):real;

var c:real;

begin


c := (a*b)/(a + b);

parallel := c;

end;

Функція

function successive(a,b: real):real;

var c:real;

begin


c := a + b;

successive := c;

end;

Функція, як і процедура складається з:



  • заголовка (розпочинається словом function);

  • тіла (міститься між словами begin…end;

Службове слово function вказує на те, що дана підпрограмна капсула – функція . Після нього вказується ім’я функції, використовуючи яке дана функція буде викликатися з головної програми. В дужках перераховуються список параметрів, що забезпечують передачу значень з головної програми в функцію. В наведеному прикладі це параметри a та b. Вони дійсного типу. Це означає, що функція може отримати від головної програми два дійсні значення для їх обробки. На відміну від процедури функція виробляє конкретне значення в окремому місці пам’яті. Тому має тип, який вказується після переліку параметрів. В нашому випадку функція буде виробляти дійсне значення.

Попередня задача має вигляд:

function successive(a,b: real):real;

var c:real;

begin


c := a + b;

successive := c;

end;

function parallel(a,b: real):real;



var c:real;

begin


c := (a*b)/(a + b);

parallel := c;

e
Зауваження!!! Параметри можуть мати такі ж імена як і об’єкти програми. Тобто в нашому прикладі для кращого розуміння підпрограми замість параметрів a та b в описі функцій можна використати R1, R2.
nd;
{Головна програма}

Var


R1,R2,R3,R4,U,I:real;

Begin


Write(‘R1 = ‘); read(R1);

Write(‘R2 = ‘); read(R2);

I := U/ parallel(successive(R1,R2), successive(R1,R2));

Writeln(‘I = ‘,I:5:2);

End.



§14. ЛОКАЛЬНІ ТА ГЛОБАЛЬНІ ОБ’ЄКТИ ПІДПРОГРАМИ.

Одна з цілей, що досягається в застосуванні інкапсуляції – це обмежений доступ до конструкції, розташованої в середині під програмної капсули. Це можливість використовувати програмні об’єкти тільки всередині капсули. Такі об’єкти називаються локальними. Вони описуються між заголовком підпрограми і тілом підпрограми. У задачі попереднього уроку локальною змінною є деяка проміжна змінна с, що використовується при описі функцій parallel та successive. Локальні об’єкти – це об’єкти які створюються в момент виклику підпрограми, і існують до тих пір, поки виконується тіло підпрограми. Коли по завершенню роботи підпрограми керування передається головній програмі пам’ять виділена під локальні об’єкти вивільняється, тобто усі локальні об’єкти знищуються. Локальні об’єкти – це об’єкти описані всередині під програмної капсули.

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

Принципові розходження між параметрами і локальними об’єктами

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

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

У зв’язку з наявністю глобальних та локальних об’єктів, оболонка капсули є блоком і діє як мембрана, пропускаючи в себе глобальні об’єкти і не випускаючи локальних. Цей ефект в програмуванні носить назву мембранного ефекту. Але правило хорошого стилю програмування забороняє використання глобальних об’єктів в підпрограмі (для передачі значень в підпрограму використовуються параметри-значення, а для повернення значень з підпрограми в головну програму – параметри-змінні. Це робить підпрограму універсальною).





§15. ПОНЯТТЯ РОЗГАЛУЖЕННИХ АЛГОРИТМІВ. НАЙПРОСТІШІ РОЗГАЛУЖЕНІ ПРОГРАМИ.

Алгоритми розв'язання більшості задач не є послідовними, коли усі вказівки програми чітко слідують одна за одною (саме такі програми ми складали до сьогодні). Дії (обчислення), які необхідно виконати, можуть залежати від певної умови, наприклад, вхідних даних, або результатів, отриманих під час виконання програми. Наприклад, в програмі перевірки знань оцінка за вибрану з декількох варіантів відповідь, що додається до загальної суми балів, залежить від того, чи є відповідь правильною. Фрагмент блок-схеми алгоритму рішення цієї задачі подано на мал. 1.

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

Приклад 1

procedure maximum(a,b:real; var max:real);

begin

if a>b then max:=a;



else max:=b;

end;

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



Загальний вигляд повного оператора розгалуження:

if <умова> then P1

else P2;

де Р1 та Р2 — деякі вказівки (наприклад присвоєння (приклад1)або введення-виведення (приклад2).

Робота оператора розгалуження не викликає ніяких труд­нощів. Цей оператор в залежності від істиності або хибності умови ( if a>b) вибирає той чи інший шлях наступного виконання ал­горитму — виконання вказівки Р1 (істинність умови a>b – then max:=a) або вказівки Р2 (хибність умови a>b – else max:=b). Після цього робота алгоритму продовжується далі за вказаними вказівками.

Ми розглянули роботу повного оператора розгалуження. Існує ще і скорочена форма оператора розгалуження.



Приклад 2: Розглянемо процедуру знаходження модуля дійсного числа (без використання стандартної функції Паскаля abs).

procedure modul(var a:real);

begin

if a<0 then a:=-a;



end.

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

Схема алгоритму скороченої форми оператора розгалуження дуже
схожа на схему повного оператора розгалуження

Загальний вигляд скороченого оператора розгалуження:

if <умова> then P.


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

Розширимо поняття оператора у Паскалі. Справа в тому, що ми з вами поки що мали справу лише з простими операторами — прис­воєння і розгалуження. А що робити, коли після службових слів then або else нам потрібно вказати не один такий оператор, а кілька? Для такого випадку у Паскалі введено поняття складеного оператора.



Складеним оператором називають послідовність кількох операторів, розділених символом «;» та взятих в операторні (алгоритмічні) дужки begin ... end.

Приклад 3. Розглянемо ще один варіант алгоритму пошуку найбільшого з двох заданих чисел А та В.

VAR

a,b: real;



function maximum(a,b:real):real;

var max:real;

begin

if a>b then begin

writeln ('Перше число більше за друге.');

max:=a

end

else begin

writeln ('Друге число більше або дорівнює першому.');

max:=b

end;

maximum := max;



end;
BEGIN

writeln ('Задайте два будь-яких числа:');

read (a,b);

writeln ('Це число – ‘,maximum(a,b):10:5);



END.

Розглянемо детальніше наведену програму. По-перше, у ній чітко простежується принцип «вкладеності» операторів. Наочність такої програми явно виграє! По-друге, перед закриваючою операторного дужкою (end) не стоїть символ «;». І справді, ви ж не ставите кому в тексті перед закриваючою дужкою, коли перелічуєте в дужках кілька слів? Хоча в Паскалі це не помилка.



ПРАКТИЧНА РОБОТА

  1. Запустіть середовище програмування.

  2. Напишіть програму на основі підпрограми прикладу 1.

  3. Проекспериментуйте з текстом програми. Збережіть програму в своїй папці під назвою “Max.pas”.

  4. Замініть функцію на процедуру.

  5. Видозмініть текст програми до вигляду, у підпрограмі прикладу 3.

  6. Проекспериментуйте з текстом програми. Збережіть програму в своїй папці як копію попередньої під назвою “Max1.pas”.

  7. Замініть функцію на процедуру.

  8. Наберіть та перевірте роботу програми на основі підпрограми прикладу 2.

  9. Проекспериментуйте з текстом програми. Збережіть програму в своїй папці під назвою “Abs1.pas”.



§16: ЛОГІЧНІ ВИРАЗИ. ОБЧИСЛЕННЯ ЗНАЧЕНЬ ЛОГІЧНИХ ВИРАЗІВ

Крім арифметичних виразів, в Паскалі існує ще один тип виразів — логічний.



Логічним виразом називається такий вираз, внаслідок обчислення якого одержується логічне значення true або false («істина» або «хиба» ).

Логічні вирази в поділяються на прості та складені.



Простим логічним виразом називається вираз, який запи­суються за допомогою знаків співвідношень: <, >, <=, >=, = та <>..

З прикладами найпростіших простих логічних виразів ми вже знайомі: a > c, n > 0, х = у.

Порівняємо тепер призначення символів «:=» та «=». «:=» – це вказівка присвоєння, а «=» – це оператор рівності. Внаслідок виконання вказівки «:=» деяка змінна одержує певне значення, а в результаті дії оператора порівняння «=» деякий логічний вираз отримує значення true або false

В простих логічних виразах справа та (або) зліва від оператора порівняння може стояти не лише змінна або константа, а і цілий арифметичний вираз. Наприклад:

A+B>0

A+B<>C+D


Sqrt(sin(X))=0

Складеним логічним виразом називається вираз, в якому вико­ристовуються логічні операції and, or, not («так», «або», «ні»).

Наведемо приклади. З математики вам відомі такі записи: х  [а,b] та х  [а,b].

Ці співвідношення можна записати у вигляді логічних виразів: (х>=а) and (x<=b), (х<а) or (x>b).

Під час записування складених логічних виразів прості логічні вирази обов'язково слід брати в круглі дужки!

Цікаво, чи можна записати простий логічний вираз n<>m у виг­ляді складеного? Виявляється, можна: n<>m це те саме що і not (n=m).

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




А

В

A and В

A or В

not A

false

false

False

False

true

false

true

False

True

true

true

false

False

True

false

true

true

True

True

false
Наведену таблицю можна перефразувати таким чином.

Логічна операція and дає результат true тоді і тільки тоді, коли обидва операнди мають значення true.

Логічна операція or дає результат true тоді і тільки тоді, коли хоча б один операнд має значення true.

Логічна операція not завжди дає результат, протилежний значенню її операнда.

Ми вели розмову про обчислення значень логічних виразів. Зро­зумілим є запитання: «А де їх можна використовувати?»



По-перше, використання логічних виразів так само, як і арифме­тичних, можливе в операторі присвоювання.

Наприклад:

logical_1:=a>b;

logical_2:=(N<=x) and (x<=M);

X:=false.



Умовою безпомилкового виконання таких операторів є збігання типів, тобто змінні в лівій частині цих операторів повинні бути опи­сані типом boolean.

По-друге, результат обчислення логічних виразів true та false можна ще трактувати як «так» і «ні». Це дає змогу використовувати логічні вирази у розгалужені в якості умови.


§17: ВКЛАДЕНІ РОЗГАЛУЖЕННЯ.

Приклад 1. Розглянемо пошук найбільшої величини з трьох різних величин а, b, с.

VAR

a,b,c: real;



function maximum(a,b,c:real):real;

var max:real;

begin

if (a>b) and (a>c) then begin

writeln ('Перше число найбільше ');

mах:=а

end

else

if (b>c) then begin

writeln ('Друге число найбільше ');

mах:=b

end

else begin

writeln (Третє число найбільше ');

mах:=с

end;

maximum:= max;



end;

BEGIN

writeln ('Задайте три будь-яких різних числа:');

read (a,b,c);

writeln ('Це число – ‘,mахimum(a,b,c):10:5);



END.

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

Внутрішній оператор розгалуження буде виконано тоді і тільки тоді, коли значення логічного виразу зовнішнього оператора розгалуження матиме значення false. Це означатиме, що значення змінної а не є найбільшим, тому у вкладеному операторі розгалуження пере­віряється лише значення змінної b. Якщо ж і її значення не є найбільшим, то залишається визнати, що найбільшим є значення змінної с

Приклад 2. Спробуємо записати інший варіант алгоритму пошуку найбіль­шої з трьох величин.

Підпрограмна капсула алгоритму подано нижче.



function maximum(a,b,c:real):real;

var max:real;

if (a>b) and (a>c) then begin

writeln ('Перше число найбільше ');

mах:=а

end;

if (b>a) and (b>c) then begin

writeln ('Друге число найбільше ');

mах:=b

end;

if (с>a) and (c>b) then begin

writeln (Третє число більше за два інші.');

mах:=с

end;

maximum := max;



end;

Запишіть блок-схему цього алгоритму самі та порівняйте обидва ва­ріанти алгоритмів задачі.

Отож, у першому алгоритмі внутрішній оператор розгалуження виконається тільки тоді, коли нас «пропустить» до нього зовнішній оператор розгалуження. Цей принцип можна порівняти з ситом.

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

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


ПРАКТИЧНА РОБОТА

  1. Запустіть середовище програмування.

  2. Наберіть та перевірте роботу програми на основі підпрограми прикладу 1.

  3. Проекспериментуйте з текстом програми. Збережіть програму в своїй папці під назвою “Max2.pas”.

  4. Замініть функцію на процедуру.

  5. Видозмініть текст програми до вигляду, у підпрограмі прикладу 2.

  6. Проекспериментуйте з текстом програми. Збережіть програму в своїй папці як копію попередньої під назвою “Max3.pas”.

  7. Замініть функцію на процедуру.


§18: КОНСТРУЮВАННЯ АЛГОРИТМУ ЗВЕРХУ ДОНИЗУ. ПРОГРАМА КВАДРАТКОГО РІВНЯННЯ.

Розглянемо задачу розв’язанняквадратного рівняння. Квадратне рівняння має вигляд ax2 + bx + c = 0

Коли усі три коефіцієнти при степенях (a, b, c) відмінні від нуля, рівняння розв’язується пошуком дискримінанта

(d = b*b – 4*a*c) і, в залежності від дискримінанта, має один, два або зовсім не має розв’язків.

Коли а = 0, рівняння зводиться до лінійного і має один корінь і розв’язується по-іншому – без відшукання дискримінанту за формулою х = -c/b (тут необхідно врахувати випадок b = 0).

Отже, наша майбутня програма матиме таку структуру:



var

a,b,c:integer;



begin

read(a,b,c);

if a=0 then Line_Rivn(b,c) {відшукання кореня для випадку, коли а = 0}

else Kvadrat_rivn(a,b,c) {відшукання коренів для випадку2, коли а ≠ 0}



end.

Дана структура – це «хребет» майбутньої програми або, іншими словами, ми описали верхівку нашої майбутньої програми. Бачимо, що наша задача складається з двох під задач: випадку1 (коли а = 0) та випадку2 (коли а ≠ 0).

Програміст повинен розв’язати дві задачі: першу задачу – випадок1 та другу – випадок2.


Випадок1 розбивається ще на дві підзадачі:

  • випадок коли b = 0;

  • випадок коли b ≠ 0.


Випадок2 розбивається аж на три під задачі:

- випадку коли дискримінант менший 0,

- випадку коли дискримінант рівний 0

- та випадку коли дискримінант більший 0.




procedure Kvadrat_rivn(a,b,c:real);

var d,x1,x2:real;

begin

d:=b*b-4*a*c;



if d<0 then {випадок коли d < 0}

writeln('Уровнение не имеет корней ' )

else

if d=0 then {випадок коли d = 0}



begin

writeln('Дискриминант этого уровнения равен нулю ') ;

x1:=-b/(2*a);

writeln(‘x=’,x1:5:2);

end

else {випадок коли d > 0}



begin

x1:=(-b+sqrt(d))/(2*a) ; x2:=(-b-sqrt(d))/(2*a) ;

writeln(‘x1=’,x1:5:2); writeln(‘x2=’,x2:5:2);

end;


end;

procedure Line_Rivn(b,c:real);

begin


writeln('Это линейное уровнение ');

if b=0 then {випадок коли b = 0}

writeln(‘b=0. Уровнение не имеет смысла’);

else {випадок коли b 0}

begin

x1:=-c/b;



writeln(‘x =’,x1:5:2) )

end;


end;



Висновки

Такий підхід до розв’язання задач носить назву «Конструювання алгоритму зверху донизу». Особливість даного підходу полягає в тому, що спочатку, аналізуючи умову задачу та будуючи математичну модель для її розв’язання, необхідно розбити цю задачу на під задачі та розв’язати їх окремо (кожну з виділених під задач розв’язувати за тим же принципом: розбивати на інші під задачі).





Поділіться з Вашими друзьями:
1   2   3   4   5   6   7   8


База даних захищена авторським правом ©refos.in.ua 2019
звернутися до адміністрації

увійти | реєстрація
    Головна сторінка


завантажити матеріал