На головну

функції

  1. II. ФУНКЦІЇ
  2. II. функції
  3. II. ФУНКЦІЇ
  4. II. функції ІТС
  5. II. ФУНКЦІЇ ЦУП
  6. Адвокат і його функції
  7. активаційні функції

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

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

function Ім'я

(Список формальних параметрів):

ТіпРезультата;

{Вище - заголовок підпрограми}

var опису локальних змінних;

begin

{Тіло функції}

Ім'я: = Вираз1;

end;

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

Результат: = Вираженіе2;

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

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

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

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

Щоб остаточно усвідомити НЕ-синтаксичні відмінності між функціями і процедурами, узагальнимо їх у табл. 18.2.

Табл. 18.2. Відмінності між процедурами і функціями

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

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

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

begin

if a> b them max: = a

else max: = b;

end;

Викликати цю функцію ми могли б різними способами:

var x, y, z, r, t: real;

...

read (x, y, z);

r: = max (x, y);

За допомогою функції вирахували максимальне з значень x, y і записали його в змінну r.

t: = max (max (x, y), z);

Максимальна з значень x, y, z записали в змінну t.

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

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

begin

if a> b them c: = a

else c: = b;

end;

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

Ми вже знайомі з оператором halt ;, що дозволяє аварійно (або просто з нескінченного циклу) завершити програму. Негайно завершити поточний блок, В тому числі і підпрограму-функцію або процедуру, дозволяє оператор Exit ;.

Перейдемо до прикладів.

1. Використовуючи підпрограму, обчислити суму перших k членів ряду 1 + 1 / n.

Сума ряду - це скаляр, природним виглядає використання підпрограми-функції. Застосувавши відомі алгоритми, складемо програму:

function sum (k: integer): real;

var i: integer; s: real;

begin

s: = 0;

for i: = 1 to k do s: = s + 1 / i;

sum: = s;

end;

var k: integer; s: real;

begin

write ( 'Введіть число кроків:');

readln (k);

s: = sum (k);

writeln ( 'Сума =', s: 8: 3);

end.

Зверніть увагу - не дивлячись на те, що функція sum обчислює єдину величину s, ми були б не вправі написати в ній оператор

for i: = 1 to k do sum: = sum + 1 / i ;,

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

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

2. Обчислити значення виразу , Де z (x) = sin 2x + ln | x |.

Очевидно, що повторне обчислення виразу z (x) з різними значеннями аргументу x неефективно, зручніше написати підпрограму-функцію, яка вважає за формулою значення z (x).

function z (x: real): real;

begin

z: = sin (2 * x) + ln (abs (x));

end;

begin

write ( 'Відповідь =', (z (3) + 2 * sqr (z (5))) /

(Z (0.1) +1): 6: 2);

readln;

end.

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

3. На закінчення розділу скажемо кілька слів про рекурсії. Рекурсивними називають функції, здатні повторно викликати самі себе. З точки зору програмування, в цьому немає нічого дивного - просто при повторному вході в функцію в програмному стеку створюється її нова копія і розрахунок виконується заново зі зміненим значенням параметра функції. Потім функція перевіряє значення параметра, при необхідності змінює його і знову повторно викликає сама себе. Зрозуміло, щоб уникнути зациклення, при деякому значенні параметра має бути передбачено завершення обчислювального процесу. Використання рекурсії доцільно всюди, де розрахунок наступного значення деякої функції залежить від її попереднього значення. Так, класичний приклад на рекурсію - розрахунок факторіала (факторіал цілого позитивного числа n, що позначається n !, дорівнює добутку всіх чисел від 1 до N включно). Використовуючи очевидну формулу n! = N * (n-1) !, напишемо наступну рекурсивну функцію:

function Factorial (n: integer): longint;

begin

if n <2 then Factorial: = 1

else Factorial: = n * Factorial (n-1);

end;

Тип функції longint використаний, так як факторіал дуже швидко росте і вже 8! = 40320, тобто, більше максимального значення типу integer. Ця функція, як неважко побачити, при значенні аргументу, меншому двох, повертає одиницю, а в іншому випадку повертає свій аргумент n, помножений на факторіал від n-1. Нескладний тест функції міг би виглядати так:

begin

writeln ('10! = ', Factorial (10));

end.

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

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

 



Попередня   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48   Наступна

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

© um.co.ua - учбові матеріали та реферати