Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
самост1_1new_druk!!!.doc
Скачиваний:
22
Добавлен:
13.11.2019
Размер:
1.61 Mб
Скачать

Розділ іі. Мова програмування паскаль. Тема: Методології розробки програм.

У міру розвитку обчислювальної техніки виникали різні технології програмування. На кожному етапі створювався новий підхід, який допомагав програмістам давати раду дедалі більшому ускладненню програм. Технологія програмування [рrogramming technology] – система методів, способів і прийомів розробки й налагодження програм.

Методологія структурного програмування – це сукупність методів проектування та написання програм за жорсткими правилами, дотримання яких підвищує продуктивність праці програмістів, поліпшує читабельність і полегшує процес тестування програм. Витоки цієї методології сягають 60-х років ХХ століття, коли швидкими темпами почала зростати складність програм, а отже, постала потреба у методах подолання такої складності. Методологія структурного програмування ґрунтується на трьох методах: низхідного проектування, модульного програмування і структурування програм.

Висхідне програмування (програмування «знизу вгору») [bottom uр рrogramming] – спосіб розробки програм, під час якого спочатку проектуються і налагоджуються програми для виконання простих операцій, а потім розроблені модулі об’єдну­ються в єдину програму. При цьому структура і функціональне призначення функцій більш високих рівнів витікає з функцій нижнього рівня.

Низхідне програмування (програмування «згори вниз») [toр-down рrogramming] – спосіб розробки програм, за якого на кожному кроці деталізування для кожної задачі складається програма в термінах виділених в ній підзадач. Алгоритм розв’язання задачі розбивається на простіші частини або підзадачі. Підзадачі виділяють так, щоб вони були незалежними. При цьому складають план розв’язання цілої задачі, пунктами якого і є виділені частини. План записують графічно, визначають головну і підлеглі підзадачі та зв’язки між ними, встановлюють, які дані отримує кожна підзадача для функціонування і які результати видає. Складається програма, яка містить виклики підпрограм (процедур або функцій), відповідних виділеним підзадачам. Цю програму можна відразу налагоджувати, підпрограми для підзадач тимчасово замінюються «заглушками». Аналогічно проводиться деталізація і програмування кожної підзадачі. Процес послідовної деталізації відбувається доти, доки не буде написана програма для кожного фрагмента алгоритму. При цьому на кожному етапі вироблення програми є діючий варіант програми, налагодження якої ведеться по ходу всієї її розробки.

Модульне програмування – це організація програми у вигляді сукупності незалежних блоків, структура і функції яких підпорядковуються певним вимогам. Такі блоки називаються модулями. Модульне програмування дає можливість:

  • Спростити процес тестування і налагодження програми;

  • Розробити програму зусиллями більше ніж одного програміста;

  • Локалізувати дію змін і доповнень до програми в межах одного модуля;

  • Скоротити термін і вартість розробки програми.

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

  • Модулі є незалежними програмними блоками, код яких логічно і фізично відокремлений від коду інших модулів;

  • Модулі є неподільними блоками програми, які можна використовувати повторно;

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

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

  • Кожен модуль можна замінити іншим функціонально еквівалентним модулем, що має той самий інтерфейс;

  • Взаємозв’язки між модулями встановлені за ієрархічним принципом;

  • Усі структури даних інкапсульовані в модулі, тобто доступ до даних може здійснюватися лише через процедури та функції модуля;

  • Модуль має одну точку входу та одну точку виходу;

  • Модуль повертає керування тому програмному блоку, що його викликав.

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

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

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

Принципами структурного програмування є:

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

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

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

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

Налагодження програми можна починати до написання всіх блоків, вставивши замість відсутніх блоків які-небудь оператори, що імітують їх роботу і дають певні відповіді. Структуровану програму легше потім уточнювати, вдосконалювати і навіть пере­робляти.

Використання модулів у Паскаль.

Поняття модуля, або, більш загально, модульного програмування, виникло на певному етапі розвитку засобів проектування прикладних програм. Їх виникнення було зумовлене зростаючими обсягами програм, їх внутрішньою складністю і колективним характером розробок. Поняття модуля було запроваджено, починаючи з четвертої версії системи Turbo Pascal. Завдяки модулям Turbo Pascal став придатним для значних розробок виробничого і комерційного призначення на тогочасному рівні технології програмування. Стали можливими розробки програмних пакетів різноманітного призначення й орієнтації, повторне використання відлагоджених процедур у інших програмах. Крім того, за рахунок введення модулів вдалося послабити обмеження операційної системи DOS на сумарний об'єм готових програм (в DOS код програми поміщається в сегмент коду, що не може перевищувати 64Кб).

Означення модуля. Програмний модуль (unit) – це набір констант, типів даних, змінних, процедур і функцій, що можуть спільно використовуватися деякими програмами. У мові Turbo Pascal модуль за означенням вважається окремою програмною одиницею. Якщо підпрограма є структурним елементом Раsсаl-програми і не може існувати поза нею, то модуль є окремо збереженою одиницею, яка компілюється незалежно. Є дві головні причини для написання модулів:

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

  • Іншою причиною використання модулів у великих програмах для DOS є обмеження кодового сегмента. Основна програма розбивалась на декілька самостійних фрагментів, програмний код кожного з яких не перевищував 64Кб Turbo Pascal інтерпретує це, створюючи для кожного модуля окремий сегмент коду. Інакше код програми не міг би перевищувати 64Кб.

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

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

Інтерфейсна частина,

Частина реалізації,

Частина ініціалізації.

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

Загальна структура модуля може бути подана такою схемою:

Unit <Ім'я модуля>;

Interface

<Описи видимих об'єктів>

implementation

<Описи схованих об'єктів>

begin <Оператори ініціалізації об'єктів модуля>

end.

Модуль починається із заголовка, який є обов'язковим. Заголовок модуля складається зі службового слова unit і ідентифікатора, що є ім'ям модуля. Модуль повинен зберігатись у файлі з іменем, що співпадає з іменем модуля, вказаним у заголовку. Тому ідентифікатор <Ім'я модуля> повинен відповідати вимогам до імені файлу в DOS. Заголовок завершується символом ';' (крапка з комою).

Інтерфейсна частина починається зі службового слова interface, за яким йде сукупність звичайних описів, і закінчується перед словом implementation. Інтерфейс визначає, які об'єкти є видимими (доступними) для будь-якої програми чи модуля, що використовує даний модуль. В інтерфейсній частині модуля можна визначати константи, типи даних, змінні, процедури і функції. Як і в програмі, вони можуть бути розташовані в будь-якому порядку, і секції описі в можуть зустрічатися повторно. В інтерфейсній частині перелічуються тільки заголовки процедур і функцій, які є доступними для зовнішніх програм. Повний текст підпрограм міститься в секції реалізації. Програмний модуль може використовувати інші модулі. Для цього вони оголошуються в розділі підключення модулів uses. Ключове слово uses може міститися в двох місцях. По-перше, воно може стояти відразу після ключового слова interface. У цьому випадку будь-які константи і типи даних, описані в інтерфейсних секціях модулів, що стоять після службового слова uses, можуть використовуватися в будь-якому описі в інтерфейсній частині даного модуля. По-друге, uses може стояти відразу після ключового слова implementation. У цьому випадку всі описи з модулів, що стоять після службового слова uses, можуть використовуватися тільки в секції реалізації.

Частина реалізації починається службовим словом implementation, за яким йдуть описи схованих об'єктів. Усе, що описано в секції інтерфейсу, є видимим у секції реалізації: модулі, константи, типи, змінні, процедури і функції. Крім того, у секції реалізації можуть бути свої додаткові описи, які не є видимими для програм, що використовують цей модуль. Програма не знає про їхнє існування і не може посилатися на них чи звертатися до них. Однак, ці сховані елементи можуть використовуватися видимими процедурами і функціями, тобто тими підпрограмами, заголовки яких знаходяться в секції інтерфейсу. Якщо об'єкти, розташовані в секції реалізації, містять посилання на інші модулі, то ці модулі повинні бути підключені в розділі підключення модулів відразу після службового слова implementation. Процедури і функції, заголовки яких вказані в інтерфейсній секції, повинні повністю описуватися в секції реалізації. Заголовок procedure/function повинен або бути ідентичним тому, що знаходиться в секції інтерфейсу, або мати коротку форму. У випадку короткої форми пишуть ключове слово procedure чи function, а після нього вказують тільки ім'я підпрограми без списку формальних параметрів. Підпрограма повинна містити всі свої локальні описи (позначки, константи, типи, змінні і вкладені процедури і функції), за якими повинно знаходитися основне тіло самої підпрограми. Підпрограми, не описані в інтерфейсній секції, повинні мати повний заголовок procedure/function.

Секція ініціалізації є необов'язковою секцією модуля. Вона розташовується після секції реалізації, починається зі службового слова begin і містить послідовність операторів. Завершує модуль, як і програму, службове слово end і символ '.' – крапка. У секції ініціалізації ініціалізуються структури даних модуля, які він робить доступними для програми, що використовує даний модуль. При виконанні програми, що використовує деякий модуль, секція ініціалізації цього модуля викликається перед запуском основного тіла програми. Якщо програма використовує більше ніж один модуль, то секції ініціалізації всіх модулів викликаються у порядку, зазначеному в операторі uses у програмі перед тим, як виконується основне тіло програми.

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

Приклад.

program MyProgram;

uses Crt, Graph; {підключаються модулі Crt і Graph}

СlrSсr {використовується процедура ClrScr модуля Crt, яка очищає екран}

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

  • звертання до змінної, ідентифікатор якої описаний в програмі і такий самий ідентифікатор описаний в інтерфейсній частині одного чи декількох модулів, які ця програма використовує, завжди інтерпретується, як звертання до змінної, оголошеної в програмі;

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

Для того щоб у програмі мати доступ до інтерфейсної змінної із деякого модуля, незалежно від того, є оголошена в програмі змінна з таким самим іменем чи ні, необхідно задати складове ім'я цієї змінної, структура якого схожа на селектор поля запису:

<Ім'я модуля>.< ім'я змінної >

Таке звертання завжди означає звертання до змінної з іменем

< ім'я змінної >, яка оголошена в інтерфейсній частині модуля <Ім'я модуля>.

Приклад.

Graph.CurrentDriver {Звертання до константи CurrentDriver, оголошеної в модулі Graph}

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

unit Ekran; {заголовок модуля}

interface {початок інтерфейсної частини}

procedure Kursor(il,j1: integer; с1, bk: byte); {заголовок процедури}

{процедура встановлює курсор в рядок і1 в позицію j1, встановлює колір тексту с1, і колір фону bk}

implementation {початок частини реалізації}

uses Crt; {розділ підключення модулів}

procedure Kursor; { коротка форма заголовка процедури}

begin

textbackground(bk); {встановлення фону тексту}

textcolor(cl); {встановлення кольору тексту}

gotoxy(i1, j1) {встановлення курсору в рядок j1 позицію і1.}

end;

end.

Наступна програма ілюструє використання модуля Ekran:

program р;

uses Ekran, Crt; {розділ підключення модулів}

begin

clrscr;

kuгsоr(30, 1,14,5); {переміщення курсору в 30-ту позицію 1-го рядка}

{встановлення кольору тексту (14 – жовтий) і кольору фону (5 – малиновий)} wrіtе('З новим роком!'); {виведення тексту}

end.

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

Основні концепції об’єктно-орієнтованої методології програмування.

Методологія об’єктно-орієнтованого програмування виникла як результат природної еволюції мов структурного програмування. З погляду цієї методології програма є сукупністю об’єктів, кожен об’єкт є екземпляром певного класу, а класи утворюють ієрархію успадкування.

У цей час найпопулярнішою технологією програмування є об’єктно-орієнтоване програмування (ООП). Об’єктно-орієнто­ване програмування [object-oriented рrogramming] – конструювання програм у вигляді ієрархічно впорядкованих класів об’єк­тів, що описують дані та операції над об’єктами, які можуть взаємодіяти з іншими об’єктами. Центральною ідеєю ООП є інкапсуляція, тобто структурування програми на модулі особливого вигляду, що об’єднує дані і процедури їх обробки, причому внутрішні дані модуля не можуть бути оброблені тільки передбаченими для цього процедурами. У різних варіаціях ООП цей модуль називають або класом, або абстрактним типом даних, або ж кластером. Кожний такий клас має внутрішню частину, яка називається реалізацією, і зовнішню частину, яка називається інтерфейсом. Доступ до реалізації можливий лише через інтерфейс. Звичайно в інтерфейсі розрізнюють властивості, які синтаксично виглядають як змінні, і методи, які синтаксично виглядають як процедури або функції. Клас може мати методи, які називаються конструкторами та деструкторами, що дозволяють під час виконання програми динамічно породжувати й знищувати екземпляри класу. Екземпляри одного класу схожі між собою і наслідують методи класу, але мають різні значення властивостей. Класи та екземпляри класів називають об’єктами, звідки й виникає назва об’єктно-орієнтоване програмування.

ООП дозволяє програмісту об’єднувати в один блок дані та програмний код, що обробляє їх.

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

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

Процедурно-орієнтоване програмування.

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

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

ПРОЦЕДУРНЕ ПРОГРАМУВАННЯ

Опис процедури

Технологія програмування мовою програмування типу мови Pascal пропонує проектувати програми методом послідовних уточнень.

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

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

Розділ процедур

і функцій

Описання процедури таке ж, як і описання програми, але замість заголовка програми фігурує заголовок процедури. Заголовок має вид:

Заголовок

процедури

Приклади заголовків процедури:

procedure Picture;

procedure Power(X: real; n: Integer; var u, v: Real);

procedure Integral( a, b, epsilon: Real; var S: Real);

Формальні параметри. Локальні і глобальні об’єкти

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

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

Резервування пам’яті під локальні об’єкти здійснюється таким чином, що вона “захоплюється” процедурою при її виклику оператором і звільняється при виході з процедури. Такий механізм розподілу пам’яті називається динамічним. Динамічний розподіл дозволяє економити пам’ять, що адресується.

Об’єкти, що описані в основній програмі, доступні для використання в цій процедурі. Вони називаються глобальними. Відмітимо, що локальний і глобальний об’єкти цілковито різні, але можуть мати одне й те саме ім’я. Якщо, наприклад, змінна Х описана як в основній програмі, так і в процедурі, то в процедурі вона використовується як локальна. Якщо ж в процедурі змінна Х не описана, то в процедурі вона використовується як глобальна.

Оператор процедури. Фактичні параметри

Оператор процедури має вид:

< ім’я > або < ім’я > (< список фактичних параметрів >)

Синтаксична діаграма оператора процедури:

Оператор

процедури

Приклади операторів процедури:

Picture;

Power(( a + b )/2, 3, degree, root );

Integral ( 0, P/2, 1E-6, SUMMA);

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

Приклад . Розглянемо заголовок процедури і оператор цієї процедури:

Procedure Integral ( a, b, eps: real; var s: real );

Integral ( -Pi/2, Pi/2, 1E-6, summa );

Відповідність:

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

Значення а Вираз -Рі/2

Значення b Вираз Рі/2

Значення eps Дане 1Е-6

Змінна s Змінна Summa

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

Якщо х1, х2, ..., хn – фактичні параметри-змінні, відповідні формальним параметрам-змінним v1, ... , vn, то x1, x2, ..., xn повинні бути різними. Фактичними параметрами-значеннями можуть бути вирази або дані відповідних типів.

Розглянемо приклад:

Приклад. Програма обчислює координати точки (x0, y0) при послідовних поворотах і паралельних переносах системи координат.

Program Coordinates;

Const

Pi = 3.141592;

Var

Alfa, Beta : Real;

x0, y0, x1, y1, x2, y2 : Real;

x, y : Real;

Procedure Rotate(x, y, Fi: Real; var u, v: Real );

var

cosFi, sinFi : Real; { локальні змінні }

begin

Fi := Fi*Pi/180 ;

cosFi := Cos(Fi); sinFi := Sin(Fi);

{ параметри x, y захищені від глобальних змінних x, y }

u := x * cosFi - y * sinFi ;

v := x * sinFi + y * cosFi

end ;

Procedure Move(x, y, a, b : Real; var u, v: Real);

begin

u := x + a ;

v := y + b

end;

begin

Read (x0, y0);

Read (Alfa);

Rotate(x0, f0, alfa, x, y);

Read (x1, y1);

Move(x, y, x1, y1, x, y);

Read (Beta);

Rotate(x, y, Beta, x, y);

Read ( x2, y2 );

Move(x, y, x2, y2, x, y);

Writeln (‘================================’);

Writeln (‘абсциса точки : ‘, х);

Writeln (‘ордината точки : ‘, y);

end.

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

Нехай, наприклад, змінна A типу Sequence - масив з 1000 дійсних чисел і

Procedure MaxMin(X : Sequence; var Max, Min : Real)

- пошук максимального і мінімального елементів масиву X. Тоді при зверненні до процедури MaxMin за допомогою оператора MaxMin(A, Sup, Inf) компілятор виділить пам’ять (6 - 10 байт на кожний елемент масиву - всього 6000 - 10000 байт ) і здійснить 1000 пересилань чисел з A в X. Якщо ж параметр X визначити як параметр-змінну:

Procedure MaxMin(var X : Sequence; var Max, Min : Real)

ні пам’яті, ні пересилань не знадобиться.

Функції

Поряд із стандартними функціями, у мові можна визначити і інші необхідні програмі функції. Функція – це підпрограма, що визначає одне - єдине скалярне або посилальне значення, що використовується при обчисленні виразу. Описання функції має, по суті, такий самий вид, як і описання процедури. Різниця тільки у заголовку, який має вид:

Function < ім’я > : < тип результату > ;

або

Function < ім’я > (<описи аргументів (параметрів)>): < тип результату>;

Синтаксична діаграма заголовка функції:

Заголовок

функції

Зверніть увагу на те, яким чином визначено тип значення функції.

Таким чином, для функції визначені всі ті поняття, які були сформульовані для процедур.

Ім’я, що задане в заголовку функції, іменує цю функцію. В середині описання функції – в розділі операторів – повинно бути присвоювання, в лівій частині якого стоїть ім’я функції, а в правій – вираз що має тип значення функції.

Приклади

Приклад. Функція GCD (алгоритм Евкліда) обчислює найбільший спільний дільник двох натуральних чисел х і у.

Function GCD (x, y : Integer) : Integer ;

Begin

While x <> y do

If x < y

then y := y - x

else x := x - y ;

GCD := x

End;

Приклад. Функція IntPow підносить дійсне число x до цілого степеня N. (Y = x N )

Function IntPow(x: Real; N: Integer) : Real;

Var

i: Integer;

Begin

IntPow := 1;

For i:=1 to Abs(N) do IntPow := IntPow * x;

If N < 0 then IntPow := 1/IntPow

End;

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

Program GCD_of_Array;

Const

n = 100 ;

Var

i, D : Integer;

A : Array[1..n] of Integer;

Function GCD (x, y : Integer) : Integer ;

Begin

While x <> y do

If x < y

then y := y - x

else x := x - y;

GCD := x

End;

Begin { основна програма }

{Процедура читання масиву натуральних чисел}

D := GCD (A[1], A[2]);

For i := 3 to n do D := GCD(D, A[i]);

writeln ( ‘ НCД послідовності = ‘ , D )

End.

Кожна процедура або функція може, в свою чергу, містити розділ процедур і функцій, в якому визначені одна або декілька процедур і функцій. В цьому випадку кажуть про вкладення процедур. Кількість рівнів вкладень може бути довільною. Структура вкладення ілюструється рисунком:

Main

A

Поняття локальних і глобальних об’єктів поширюються і на вкладені процедури. Наприклад, змінна, описана в процедурі А локальна по відношенню до основної програми і глобальна для процедур В і С, вкладених в А.

В деяких випадках необхідно з процедури здійснити виклик іншої процедури, описаної в тому ж розділі процедур і функцій. Наприклад, процедура С може містити оператор виклику процедури В. В цьому випадку компілятор правильно обробить текст програми, оскільки процедура В описана до процедури С. Якщо ж з процедури В необхідно звернутись до С, для правильної обробки виклику С необхідно використовувати механізм так званого попереднього описання С. Описання, що опереджає процедури (функції) – це її заголовок, услід за яким через “;” стоїть службове слово Forward. У тексті програми описання, що опереджає, повинно передувати процедурі, в якій процедура, що попередньо описана, викликається.

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

Procedure A (x : TypeX; Var y : TypeY); Forward;

Procedure B (z : TypeZ) ;

Begin

... A( p, q); ...

End;

Procedure A;

Begin

...

End;

Питання для самоконтролю:

  1. У чому полягає метод низхідного програмування?

  2. Що таке алгоритмічна декомпозиція?

  3. Що таке програмний модуль?

  4. Чим відрізняється проста програма від елементарної?

  5. Сформулюйте теорему про структурування.

  6. Викладіть сутність методів структурування циклічних програм.

  7. які оператори неприпустимо використовувати у структурованій програмі?

  8. Яку структуру має модуль у мові Паскаль?

  9. Дайте визначення методології об’єктно-орієнтованого програмування.

  10. Чим відрізняється клас від об’єкта?

  11. Які концепції покладено в основу об’єктно-орієнтованого програмування?

  12. Які вигоди можна отримати від використання інкапсуляції?

  1. У чому полягає технологія низхідного проектування програм?

  2. Що таке підпрограма та які переваги дає використання підпрограм?

  3. Дайте визначення процедури та функції.

  4. Наведіть синтаксис оголошення процедури та функції.

  5. Чим тіло процедури відрізняється від тіла функції?

  6. У чому полягає відмінність виклику процедури від виклику функції?

  7. Що таке параметри підпрограми?

  8. У чому полягає відмінність формальних параметрів від фактичних?

  9. Які різновиди формальних параметрів існують у мові Паскаль?

  10. Як повертаються значення з функції? Скільки значень можна повернути?

  11. Що таке локальні та глобальні параметри?