.: Menu :.
Home
Реферати
Книги
Конспекти уроків
Виховні заходи
Зразки документів
Реферати партнерів
Завантаження
Завантажити
Електронні книги


????????...

 
��������...
Допоміжні алгоритми. Процедури та фукнції. Фактичні та формальні параметри. Глобальні та локальні змінні. Опис їх мовою Паскаль 


Допоміжні алгоритми. Процедури та фукнції. Фактичні та формальні параметри. Глобальні та локальні змінні. Опис їх мовою Паскаль

СТРУКТУРА ПРОЦЕДУР І ФУНКЦІЙ

При створенні програми для рішення складної задачі виконується декомпозиція (поділ) цієї задачі на підзадачі, підзадачі – на ще менші підзадачі і так далі, до легко програмованих елементарних підзадач.
Borland Pascal має різні засоби для розподілу програми на частини. На верхньому рівні поділу (великих задач) – це модулі, на нижньому рівні (елементарні підзадачі) – це найчастіше процедури і функції. Об’єктно-оріентована методологія охоплює як верхній, так і нижній рівень розробки програм.
Процедури і функції є важливим засобом у більшості мов програмування. З їхньою допомогою можна скомпонувати групу операторів для виконання деякої єдиної дії. Процедуру (функцію) можна викликати з різних місць програми, вона може повертати обчислені результати, і їй можна передавати інформацію, що вона використовує для виконання обчислень. Для того щоб процедура (функція) початку роботу, її потрібно викликати (активізувати).
Процедури і функції складаються з операторів, локальних даних і внутрішніх процедур і функцій. Структура опису процедури та функції має наступний вид.

procedure Ім'я (Список_Формальних_Параметрів);
label
const – Опис локальних меток, констант, типів і змінних
type
var
procedure (function)– Опис внутрішніх процедур і функцій
begin
– Оператори
end;

function Ім'я (Список Формальних параметрів): Тип результату;
label
const – Опис локальних міток, констант, типів і змінних
type
var
procedure    – Опис внутрішніх процедур і функцій
function
begin        – Оператори, серед яких повинний бути хоча б один,
який привласнює імені функції значення результату.
end;

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

program PMax;
var a, b, m:integer;
procedure Max (x,y:integer; var res:integer);
begin
if x>y then res:=x else res:=y;
end;
begin
writeln (’Задайте два числа:’);
readln (a,b);
{-------------------------------------------------}
{Виклик процедури виконується окремим оператором!}
max(a,b,m);
{-------------------------------------------------}
writeln(“max=”,m);
end.

Програма, що  використовує  для рішення функцію має наступний вид.

program PMax;
var a, b, m:integer;
function Max (x, y: integer):integer;
begin
if x>y then Max:=x else Max:=y;
end;
begin
writeln (’Задайте два числа:’);
readln (a,b);
{-------------------------------------------------}
{Виклик функції виконується окремим оператором!}
m:=max(a,b,m);
{-------------------------------------------------}
writeln(“max=”,m);
end.
ОБЛАСТЬ ДІЇ (СФЕРА ВИДИМОСТІ) ІДЕНТИФІКАТОРІВ ПРИ ВИКОРИСТАННІ ПРОЦЕДУР І ФУНКЦІЙ
Областю дії (сферою видимості) ідентифікатора називається частина програми, де він може бути використаний.
Область дії ідентифікаторів визначається місцем их оголошення. Якщо ідентифікатори допускається використовувати тільки в рамках однієї чи процедури функції, то такі ідентифікатори називаються локальними. Якщо дія ідентифікаторів поширюється на несколько вкладених (не менш однієї) процедур і/чи функцій, то такі ідентифікатори називаються глобальними.
Помітимо, что поняття "глобальні" і "локальні" варто розуміти відносно – стосовно конкретної чи процедури функції.
Продемонструємо це наступним прикладом.
program Scope;
var А0, B0, C0 : Integer;
procedure P1;
var A1, B1, C1 : Integer;
procedure  P2;
var A2, B2, C2 : Integer;
begin
Припустимо використання как глобальних А0,B0,C0,
А1,B1,C1, так і локальних А2,B2,C2
end;
begin
Припустимо використання как глобальних A0,B0,C0 так і локальних А1,B1,C1
end;
begin
Припустимо використання только A0,B0,C0
end.
У даному прикладі А0, B0, C0 будуть глобальними для всіх процедур і функцій, використовуваних у програмі.
А1, B1, C1 будуть глобальними для всіх процедур і функцій, описаних усередині процедури Р1 (у даному прикладі для процедури P2), і одночасно локальними для самої процедури Р1.
Дані А2, B2, C2, оголошені в самій внутрішній процедурі P2, будуть тільки локальними.
Сформулюємо правила визначення області дії для ідентифікаторів процедур і функцій:
•    діють всі ідентифікатори, визначені усередині процедури (функції);
•    діють всі ідентифікатори навколишнього контексту, якщо їхні імена відрізняються від імен, оголошених всередині процедури (функції);
•    локальні ідентифікатори процедури(функції) у зовнішнім оточенні діяти не будуть ніколи;
•    у випадку збігу імен глобального і локального ідентифікаторів діяти буде тільки внутрішній локальний ідентифікатор.
Якщо перших три правила пояснюються розглянутим прикладом, то для пояснення четвертого приведемо ще один приклад.

program EqualNames;
var А,B,C : Integer;
procedure  P1;
var А,B,C : Real;
procedure P2;
var А, B, C : Char;
begin
А,B,C доступні, як символьні змінні
end;
begin
A,B,C доступні, як дійсні змінні
end;
begin
A,B,C доступні, як цілі змінні
end.
Тобто, оголошення у внутрішній процедурі даних з ідентифікаторами, що збігаються по імені з даними зовнішніх процедур, скасовує дія зовнішніх ідентифікаторів і уводить свої локальні описи, незалежно від того збігаються вони по типі, чи немає.
Локальні дані створюються при виклику процедури (функції) і існують тільки під час її виконання. Виділення пам'яті для локальних даних відбувається автоматично на початку виконання процедури(функції), а звільнення цієї пам'яті – как только виконання процедури(функції) закінчується.
Оператори, розташовані в тілі процедури(функції) можуть звертатися до її локальним даної (констант і змінним) і змінювати їхнього значення. Однак варто пам'ятати, що значення локальних даних існують поки процедура(функція) працює.
Как только вона закінчується, усі зміни значень локальних даних, зроблені операторами процедури(функції), зникнуть разом зі звільненням пам'яті.
КЛАСИФІКАЦІЯ СПОСОБІВ ПЕРЕДАЧІ ПАРАМЕТРІВ
При активізації процедури(функції) їй можна передавати параметри. При передачі необхідно стежити, щоб в операторі виклику были зазначені всі параметри, описані в заголовку процедури(функції).
Параметри, що вказуються в заголовку процедури(функції) при її описі, називаються формальними параметрами.
Параметри, що вказуються при виклику процедури(функції), називаються фактичними параметрами.
Коректність передачі параметрів ґрунтується на їхньому порядку перерахування в заголовку процедури і сумісності по присвоюванню між відповідними фактичними і формальними параметрами. Сфера дії імен параметрів такая ж, як і локальних даних.
Багато процедур мають кілька параметрів. Задача програміста – переконатися, що параметри, що він указує при виклику (фактичні параметри), відповідають за змістом формальним параметрам. Компілятор може перевірити тільки очевидні випадки — неправильне число чи параметрів несумісність типів.
Розглянемо класифікацію способів передачі параметрів, реалізація яких можлива в мовах програмування.
Оборотний увага читача, что це загальна класифікація, а не класифікація параметрів у Borland Pascal. Уведені для класифікації позначення value, addr, in, out, incut, у Borland Pascal не використовуються.

Параметри розрізняються:
1. По механізму передачі:
а) передача за значенням (value);
б) передача за адресою (по посиланню) (addr).
2. По взаємодії зухвалої і викликуваної процедур(функцій):
а)    только как вхідний параметр  (in);
б)    только как вихідний параметр (out);
в) как вхідний, так і как вихідний параметр (inout).
Відповідно цим розходженням теоретично можливі 6 способів передачі параметрів:
1)    value in;
2)    value out;
3)    value inout;
4)    addr in;
5)    addr out;
6)    addr inout.

Незважаючи на те, що можливо шість способів передачі параметрів, в існуючих мовах програмування, як правило, використовується не більш двох-трьох способів.
У Borland Pascal реалізовані перший (value in), четвертий (addr in) і шостий (addr inout) способи передачі параметрів.
Розглянемо коротко суть кожного із шести способів передачі параметрів. Помітимо, що при конкретній реалізації в якій-небудь мові програмування, можуть бути деякі відмінності від описаного.
Параметри value in (у Borland Pascal реалізовані)
1.    При виклику процедури(функції):
а)  виконується виділення пам'яті під формальні параметри і локальні дані (у
чи стеці в спеціальній області пам'яті для локальних даних);
б)  виконується копіювання значень фактичних параметрів у пам'ять, виділену
для формальних параметрів.
2.    Під час роботи процедури(функції):
а) зміна значень формальних параметрів не робить ніякого впливу на
уміст комірок пам'яті фактичних параметрів.
3.    При закінченні процедури(функції):
а) пам'ять, виділена під формальні параметри і локальні дані, очищається;
б) нові значення формальних параметрів, отримані в процесі роботи
процедури, губляться разом з очищенням пам'яті.

Параметри value out
1.    При виклику процедури (функції):
а)  виконується виділення пам'яті для значень формальних параметрів і локальних
даних, а також для збереження адрес фактичних параметрів (у чи стеці в
спеціальної області пам'яті для локальних даних);
б) виконується копіювання адрес (але не значень!) фактичних параметрів у
виділену для них пам'ять;
в)  значення формальних параметрів безпосередньо після виклику не визначені;
г) використовувати як фактичні параметри константи заборонено.
2.    Під час роботи процедури(функції):
а) забороняється використовувати значення формальних параметрів доти, поки не
буде виконане первісне присвоювання якого-небудь значення;
б) зміна значень формальних параметрів не викликає одночасного
зміни відповідних фактичних параметрів.
3.    При закінченні процедури(функції):
а) спочатку використовуючи скопійовані адреси фактичних параметрів виконується
запис результуючих значень формальних параметрів у комірки пам'яті
фактичних параметрів;
б) пам'ять, виділена для роботи процедури(функції), очищається.

Параметри value inout
1.    При виклику процедури(функції):
а) виконується виділення пам'яті для значенні формальних параметрів і локальних
даних, а також для збереження адрес фактичних параметрів (у чи стеці в
спеціальної області пам'яті для локальних даних);
б) виконується копіювання як адрес фактичних параметрів, так і їхніх значень у
виділену для них пам'ять;
в) використовувати як фактичні параметри константи заборонено.
2.    Під час роботи процедури(функції):
а) допускається як використовувати, так і змінювати значення формальних параметрів;
б) зміна значень формальних параметрів не викликає одночасного
зміни відповідних фактичних параметрів.
3.    При закінченні процедури(функції):
а) спочатку, аналогично параметрам value out, використовуючи скопійовані адреси
фактичних параметрів виконується запис результуючих значень формальних
параметрів у комірки пам'яті фактичних параметрів;
б) пам'ять, виділена для роботи процедури(функції), очищається.

Параметри addr in (у Borland Pascal реалізовані)
1.    При виклику процедури(функції):
а) виконується виділення пам'яті тільки для локальних даних і для збереження
адрес фактичних параметрів (у чи стеці в спеціальній області пам'яті для
локальних даних);
б) виконується копіювання адрес (але не значень!) фактичних параметрів у
виділену для них пам'ять;
2.    Під час роботи процедури(функції):
а) заборонена зміна значень формальних параметрів;
б) використовувати значення формальних параметрів дозволено тільки в якості
вихідних даних;
в) значення формальних параметрів, використовуючи скопійовані адреси, вибираються
безпосередньо з пам'яті фактичних параметрів.
3.    При закінченні процедури(функції):
а) вплив викликуваної процедури(функції) на зухвалу через такі параметри
отсутствует;
б) пам'ять, виділена для роботи процедури(функції) очищається.
Параметри addr out
1.    При виклику процедури(функції):
а) виконується виділення пам'яті тільки для локальних даних і для збереження
адрес фактичних параметрів (у чи стеці в спеціальній області пам'яті для
локальних даних);
б) виконується копіювання адрес (але не значень!) фактичних параметрів у
виділену для них пам'ять;
в) значення формальних параметрів безпосередньо після виклику не визначені;
г) використовувати як фактичні параметри константи заборонено.
2.    Під час роботи процедури(функції):
а) забороняється використовувати значення формальних параметрів доти, поки не
буде виконане первісне присвоювання якого-небудь значення;
б) зміна значень формальних параметрів, використовуючи скопійовані адреси,
виконується безпосередньо на комірках пам'яті відповідних фактичних
параметрів;
3.    При закінченні процедури(функції):
а) спеціального копіювання результатів не потрібно, оскільки результат відразу
виходить у комірках пам'яті фактичних параметрів.
б) пам'ять, виділена для роботи процедури(функції), очищається.
Параметри addr inout (у Borland Pascal реалізовані)
1.    При виклику процедури(функції):
а) виконується виділення пам'яті тільки для локальних даних і для збереження
адрес фактичних параметрів (у чи стеці в спеціальній області пам'яті для
локальних даних);
б) виконується копіювання адрес (але не значень!) фактичних параметрів у
виділену для них пам'ять;
в) використовувати як фактичні параметри константи заборонено.
2.    Під час роботи процедури(функції):
а) ніяких обмежень на використання параметрів даного виду не накладається;
б) зміна значень формальних параметрів, використовуючи скопійовані адреси,
виконується безпосередньо на комірках пам'яті відповідних фактичних
параметрів.
3.    При закінченні процедури(функції):
а) спеціального копіювання результату не потрібно, оскільки всі дії з
формальними параметрами виконувалися безпосередньо над комірками пам'яті
фактичних параметрів;
б) пам'ять, виділена для роботи процедури(функції), очищається.
ПЕРЕДАЧА ПАРАМЕТРІВ У Borland Pascal
У Borland Pascal реалізовано три з вищеописаних шести способів передачі параметрів:
1.    Параметри виду  value in.
У Borland Pascal такі параметри називаються параметрами-значеннями. При описі заголовків процедур/функцій перед ідентифікаторами параметрів-значень додаткові ключові слова не ставляться.
2. Параметри виду addr inout.
У Borland Pascal такі параметри називаються параметр-змінними. При описі заголовків процедур/функцій перед ідентифікаторами парамет-ров-переменных ставиться ключове слово var.

3. Параметри виду addr in.
У Borland Pascal такі параметри називаються параметрами-константами. При описі заголовків процедур/функції перед ідентифікаторами параметрів-констант ставиться ключове слово const.
Перших два різновиди параметрів (параметри-значення і парі-метрі-змінні) є стандартними для всех реалізації і версій мови Pascal. Третій різновид (параметри-константи) є нововведенням мови Borland (Turbo) Pascal версії 7.0.

Параметра-значення

Заголовок процедури з описаними параметрами-значеннями має такий вид:
procedure MyProc ( Parl, Par2 : Typel; РагЗ, Раг4 : Турі2 ) ;
Механізм роботи параметрів-значень упрощенно можна представити такою схемою:
Як фактичне параметр-значення можуть використовуватися як змінні, так і константи різних типів. Не допускаються тільки файлові типи і типи, що спираються на файловий.

Параметр-змінні
Заголовок процедури з описаними параметр-змінними має такий вид:
procedure MyProc ( var Parl, Par2 : Typel; таг РагЗ, Раг4 : Турі2 );
Механізм роботи параметр-змінних упрощенно можна представити такою схемою:
У якості фактичного параметр-змінної можуть використовуватися змінні будь-яких типів, включаючи файлові й опирающиеся на файловий, але зате використання констант не допускається.
Параметра-константи
Заголовок процедури з описаними параметрами-константами має такий вид:
procedure MyProc (const Parl, Par2 : Type1; const РаrЗ, Раr4 : Турі2 );

Механізм роботи параметрів-констант упрощенно можна представити такою схемою:

Як фактичну параметр-константу можуть використовуватися як змінні, так і константи різних типів. Не допускаються тільки файлові типи і типи, що спираються на файловий. Крім того, забороняється виконувати присвоювання формальним параметрам-константам і формальним параметрам-константам не можуть передаватися як фактичні параметри іншим процедурам/функціям.
Параметра-константи доцільно використовувати у випадках, якщо потрібно передавати структури даних, що займають великий розмір пам'яті, але змінювати вихідні значення параметрів з алгоритмічної точки зору недопустимо. У результаті ощадливо використовується оперативна пам'ять і одне тимчасово гарантується цілісність вихідних даних.
Бестиповые параметри
Бестиповые параметри можуть передаватися тільки за адресою, тобто як параметрі-змінні чи як параметра-константи. Головною особливістю бестиповых параметрів є відсутність указівки типу параметра в заголовку процедури.
Заголовок процедури з описаними бестиповыми параметрами при різних способах передачі має такий вид:
procedure МуРгос (var Par1, Par2; const Par3,Par4 );
Однак варто пам'ятати, що унаслідок відсутності типу, не можна використовувати бестиповые формальні параметри так само, як і типизованные. Перед використанням потрібно виконати приведення формального бестипового параметра до якого-небудь типу.
Бестиповые параметри більш гнучкі в роботі, чим типизованные, але відповідальність за їхнє коректне застосування покладається на програміста, тому що компілятор не може перевірити сумісність типів.
Як приклад розглянемо програму, у якій використовуються універсальні процедури введення, висновку і сортування одномірних масивів будь-якої розмірності, елементи якого можуть бути будь-як типу, що є поддиапазоном типу Byte.
При цьому кожен масив займає в пам'яті рівно стільки місця, скільки йому потрібно.
Більш того, процедура SortVector може з успіхом використовуватися для сортування масивів типу Char, тому що коди символів ASCII не виходять за межі значень типу Byte. Процедури InpVector і PrintVector для символьних масивів не підходять тому, что вони орієнтовані на введення-висновок числових значень, що виконується інакше, чим уведення-висновок символів.
Відкриті параметри-масиви
У заголовку процедури відкриті параметри-масиви описуються в такий спосіб:
procedure Open Vector ( Vector: array of Type Vector );
Відкритий параметр-масив може бути параметром-значенням, чи константою параметр-змінної.
Передані фактичні параметри повинні по типі збігатися з описаним типом Type Vector, але по розмірності вони можуть бути різними: как простий змінний типу Турі Vector, так і масивом будь-якої розмірності.
Гнучкість при передачі масивів різної розмірності отримана за рахунок однаковості представлення цих масивів как формальних параметрів. Усі формальні відкриті параметри-масиви в рамках процедури автоматично описуються як масиви з нульовою базою (нульовою нижньою границею) зазначеного в заголовку типу:
array [ 0..N-1 ] of TypeVector;
де N – число елементів у фактичному параметрі.
Іншими словами, щирий діапазон зміни індексу фактичного параметра-масиву відображається в діапазон зміни індексу від 0 до N–1.
Для визначення характеристик переданого фактичного параметра-масиву в тілі процедури використовуються стандартна функція Low, що завжди повертає 0, стандартна функція High, що повертає індекс останнього елемента у формальному параметрі-масиві, і функція SizeOf, що повертає розмір фактичного параметра-масиву.
За допомогою відкритих параметрів-масивів можна вирішувати проблеми, аналогічні розглянутий у попередньому прикладі. Однак відкриті параметри-масиви мають меншу гнучкість, чим бестиповые параметри, оскільки в даному випадку як фактичні параметри можуть бути масиви только одного типу.
Для порівняння з використанням безтипових параметрів, приведемо для відкритих параметрів-масивів таку ж програму, як у попередньому прикладі.

ПРОЦЕДУРНІ ДИРЕКТИВИ
Директиви near і far
Директиви near і far вказують компілятору відповідно до якої моделі виклику процедур – ближньої (near) чи далекої (far) – потрібно генерувати вихідний код. При ближній моделі виклик виконується швидше, при далекої — повільніше. Однак область дії ближніх викликів обмежена рамками только того модуля, у якому описана викликувана процедура.
Директиви near і far вказуються в описі процедури(функції) перед ее блоком.
Function SH( X: Real): Real; far;
begin
SH:= (Exp(X)-Exp(-X)) / 2;
end;
Керувати генерацією вихідного коду відповідно до зазначених моделей викликів можна також директивою компілятора {$F+}. Процедури і функції, компилируемые в стані {$F+}, завжди будуть мати далекий тип виклику (far), а в стані {$F-} компілятор автоматично вибирає коректну модель. За замовчуванням використовується директива {$F-}.
Директива forward
Директива forward використовується для, так називаного, випереджального опису процедур і функцій, що використовується для реалізації взаємної рекурсії двох процедур, а також для поліпшення структурованості тексту і підвищення его читабельності.
Директива interrupt
Директива interrupt складе для опису процедур переривання. У заголовку процедури переривання як параметри повинні бути описані імена регістрів.
Procedure Intrpt (Flags, CS, IP, AX, BX, CX, DX, SI, DI, DS, ES, BP: Word); interrupt;
Якщо деякі з параметрів у процедурі не використовуються, то вони можуть бути опущені. Однак змінювати взаиморасположение імен регістрів у списку параметрів не допускається.
Директива export
Директива export описує чи процедуру функцію как експортовану.
Директива external
Директива external призначена для зв'язування окремо скомпільованих процедур і функцій, що написані мовою ассемблера, а також для опису процедур, імпортованих з динамічно компонуемых бібліотек.
Директива assembler
Директива assembler також, як і директива external, використовується для опису процедур мовою ассемблера. На відміну від її директива assembler не використовується в описах динамічно компонуемых бібліотек.
Директива inline
Директива inline надає програмісту можливість записувати команди безпосередньо в машинному коді.
Контрольні питання

1.    Який вид має структура опису процедури і функції?
2.    У чому складається відмінність опису процедури і функції?
3.    Що таке область дії ідентифікаторів?
4.    Які основні правила визначення області дії для ідентифікаторів процедур і функцій?
5.    Які параметри називаються формальними і які — фактичними?
6.    По яких ознаках розрізняються параметри?
7.    Які способи передачі параметрів теоретично припустимі?
8.    Які способи передачі параметрів реалізовані в Borland Pascal?
9.    Які правила передачі параметрів-значень?
10.    Які правила передачі параметр-змінних?
11.    Які правила передачі параметрів-констант?
12.    У чому особливості бестиповых параметрів?
13.    У чому розходження відкритих параметрів-масивів і бестиповых параметрів?
14.    Для чого призначені директиви near і far?
15.    У чому особливості використання директиви forward?
16.    Яка директива призначена для опису процедур переривання?
17.    Які директиви використовуються для опису процедур мовою ассемблера?
18.    Що дозволяє директива inline?

Search:
????????...

переяславська угода 1654р.Березневі статті:Умови і правове значення

НЕ СУДИЛОСЬ скорочено

твір про похід у ліс

переказ юний шибеник

яка різниця між папкою і файлом

Чи застаріла комедія Мольєра твір роздум

цитати до чіпки

надзвичайні ситуації у світі

Твір про чарівницю осінь

чіпка-борець за справедливість чи пропаща душа?



?????????? ????????? ????
   
Created by Yura Pagor, 2007-2010