68999

Процедури та функції

Лекция

Информатика, кибернетика и программирование

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

Украинкский

2014-09-28

53.5 KB

0 чел.

Лекція №9

Тема: Процедури  та функції

План заняття:

  1.  Процедури без параметрів
  2.  Процедури з параметрами (параметри-значення)
  3.  Функції
  4.  Побічні ефекти функції

Процедури без параметрів

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

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

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

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

и=тах(х+у, х*у),       v=max(0.5, и).

Розробимо програму max:

program max;

var

x, у, u, v: real;

 a, b, s: real;

 begin read(x,y);

a:=x+y; b:=x*y;

if a>b then s:=a

else s:=b;

u:=s;

a:=0.5;

b:=u;

if a>b then s:=a

else s:=b;

v:=s;

writeln('u=',u,' v=',v)

end.

У цій програмі умовні оператори цілковито збігаються. Щоб уникнути дворазового записування однакового оператора в розділі операторів програми, оголосимо його процедурою. Надамо цій процедурі ім'я тах2а:

pocedure max2a;

begin if a>b

then s:=a

else s:=b

end;

З використанням цієї процедури програма матиме такий вигляд :

program max;

var

x, у, u, v: real;

a, b, s: real;

 procedure max2a:

begin

if a>b then s:=a

else s:=b

end;

begin

read(x,y);

a:=x+y;

b:=x*y;

max2a;

u:=s;

a:=0.5;b:=u;

max2a;

v:=s;

writeln('u=',u,' v=',v)

end.

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

Процедури з параметрами (параметри-значення)

Описана процедура тах2а не дуже зручна в користуванні, оскільки для неї жорстко зафіксовані вхідні дані а та b так, що перед кожним звертанням до процедури цим змінним потрібно присвоїти значення, з яких треба вибрати більше. Щоб уникнути цього обмеження, в мові Паскаль передбачено змогу не фіксувати вхідних даних, з якими повинна працювати процедура, а зробити їх параметрами процедури, які конкретизуватимуться під час кожного звертання до процедури.

Стосовно процедури тах2а введемо формально два ідентифікатори, наприклад r1 і r2, якими відобразимо значення, які порівнюють і з яких вибирають більше, і щодо них запишемо тіло процедури:

begin

if r1>г2 then s:=r1 else s:=r2 end

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

procedure max2b(r1, г2: real); begin if r1>r2

then s:=r1

else s:=r2 end;

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

Тепер наведену вище програму можна записати так:

program max;

var

x, у, u, v: real; s:real;

 procedure max2b(r1, r2: real);

 begin

if r1>r2 then s:=r1

else s:=r2 end;

begin

read(x,y);

max2b(x+y,x*y);

u:=s;

max2b(0.5,u);

v:=s;

writeln('u=',u,' v=',v)

end.

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

Функції

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

function<ім'я_функції>(<список_фомальних_параметрів>):<тип_функції>; <блок>

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

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

стандартними, або попередньо описані з зазначенням їхнього імені.

У блоці описуваної функції повинен бути хоча б один оператор типу

<ім'я функції> := <вираз>

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

function FACT(n: integer): integer;

var і, k: integer;

begin

k:=1;

for i:=1 to n do

k:=k*i;

FACT:=k;

end;

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

Звертатися до функції можна за допомогою виклику. Виклик-це ім'я функції, після якого в круглих дужках може бути список фактичних параметрів. Наприклад, sin(x+y), FACT(10).

Виклик функції використовують як операнд деякого виразу. Наприклад, для обчислення p=(k+1)! можна застосувати описану функцію обчислення факторіала і записати в програмі

p:=FACT(k+1).

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

Побічні ефекти функції

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

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

Наведемо простий приклад функції з побічним ефектом. Нехай у програмі описані змінні

var

k, r: integer;

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

function FACT1(n: integer): integer;

var m: integer;

begin

m:=1;

k:=1;

repeat m:=m*k;

k:=k+1;

until k>n;

FACT1=m

end;

........

k:=5;

r:=FACT1(10);

writeln(r, k):

Одержимо результат r= 10!, а також значення k= 11, оскільки воно зміниться в тілі функції. Цей побічний ефект з'явився внаслідок того, що в тілі функції не описано k,

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


 

А также другие работы, которые могут Вас заинтересовать

26404. Зейгоподий тазовой конечности и коленный сустав 22.5 KB
  Они формируют с бедренной костью самый сложный сустав в организме коленный art. Сустав характеризуется большим количеством внутрисуставных связок крестовидные менискоберцовые менискобедренная межменисковая. К этому суставу относится коленная чашка patella которая представляет из себя сесамовидную кость которая развилась в сухожилии четырехглавого мускула бедра.
26405. Зубы — dentes 24.5 KB
  В короткокоронковых зубах обозначают следующие части: а коронку возвышающуюся над десной. Эмаль самая твердая ткань зуба содержит 95 минеральных веществ устойчива к воздействию химических веществ корма и к механическим воздействиям. Под эмалью находится дентин костная ткань зуба с канальцами. Цвет дентина темноватый; б шейка зуба на месте перехода коронки в корень зуба.
26406. Классификация, строение, топография мышц 20.5 KB
  пластинчатые в области туловища шеи прикрепляют грудную конечность к туловищу брюшные стенки; 2. В их составе тонкие и длинные мышечные волокна область туловища и поясов конечностей; 2. В области туловища на поверхности блестящее сухожильное зеркало; 3.
26407. Кожный покров: строение, назначение, классификация производных 20.5 KB
  В общий кожный покров integumentum communis входят кожа cutis и её производные. Эпидермис образует производные кожи является многослойным плоским ороговевающим эпителием выполняет защитную и нейросенсорную функции. Дерма содержит производные эпидермиса выполняет опорную трофическую и иммунологическую функции. Производные кожного покрова: роговые волосы рога мякиши копыто копытце коготь и железистые обычные: потовые сальные; молочные: вымя множественное вымя специфические: пахучие защитные сигнальные параанальные и др.
26408. Концевой мозг (telencephalon) 21.5 KB
  В ней заложены центры НД. Кора гирифицирована и условно делится на доли: затылочные высшие зрительные центры лобные высшие двигательные центры теменные чувствительные центры височные слуховые центры. Под корой белое вещество плаща который образует проводящие пути 3 типов: коммисуральные полушария между собой мозолистое тело ассоциативные центры в 1 полушарии проекционные кора с подкоркой и спинным мозгом.
26409. Круп 20 KB
  Крестцовоподвздошный сустав: тугой капсула вентральная связка дорсальная коротная и длинная крестцовоседалищная связка широкая тазовая. ТБС:: простой многоосный чашеобразный; по краю суставной впадины хрящевая губа над вырезкой впадины поперечная связка впадины помимо капсулы круглая связка у лошадей добавочная связка.
26410. Лёгкие (pulmones, pneumones) 24.5 KB
  На каждом легком различают поверхности: латеральную реберную медиальную средостенную каудовентральную диафрагмальную а также междолевые. На средостенной поверхности заметны вдавления: сердечное аортальное пищеводное и желоб задней полой вены как отпечатки расположенных между легкими соответствующих органов. На правом легком со стороны средостенной поверхности имеется добавочная доля. На средостенной поверхности имеется углубление ворота легкого.
26411. Лимфатическая система 22 KB
  проток правый непарный проток правый и левый трахеальный стволы кишечный ствол чревный ствол у КРС правый и левый поясничные стволы. В неё открывается правый и левый поясничные стволы несущие лимфу с каудальных отрезков туловища и тазовых конечностей. С правой стороны головы шеи грудной конечности лимфа оттекает в непарный правый проток который принимает лимфу из правого трахеального протока и впадает в краниальную полую вену.
26412. Матка uterus 23 KB
  Полость матки каудально переходит в узкий канал шейки открывающейся во влагалище. У КРС матки изогнуты спирально заострены имеют форму бараньего рога. Тело матки снаружи длинное но внутри в большей своей части разделено срединной перегородкой. У свиньи рога матки очень длинные до 140 см извиты наподобие кишечных петель.