Підпрограми процедури і функції

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

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

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

Допоміжний алгоритм теж може викликати інші допоміжні, довжина такого ланцюжка викликів теоретично не обмежена. Тут і далі наступні пари слів використовуються як синоніми: алгоритм і програма, допоміжний алгоритм і підпрограма, команда і оператор, програма і модуль. Допоміжними і основними алгоритми є не самі по собі, а по відношенню один до одного.

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

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

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

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

При складанні підпрограм з параметрами треба дотримуватися таких правил:

1) кожна підпрограма має своє ім'я і список формальних параметрів;

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

Приклад 1. Використовуємо алгоритм знаходження найбільшого спільного дільника двох натуральних чисел як допоміжного при вирішенні завдання: скласти програму віднімання дробів (a, b, c, d - натуральні числа). Результат представити у вигляді звичайної несократімой дробу.

Підпрограма.

1) Ввести натуральні числа M, N.

2) Якщо M = N, перейти до п. 5, інакше до наступного пункту.

3) Якщо M> N, то M: = MN, інакше N: = NM.

4) Перейти до п. 2.

5) Надіслати значення M в основну програму.

6) Кінець підпрограми.

Основна програма.

1) Ввести значення A, B, C, D.

2) E: = A * D - B * C.

3) F: = B * D.

4) Якщо E = 0, вивести значення E і перейти до п. 9, інакше перейти до наступного пункту.

5) M: = | E |, N: = F, перейти до підпрограми обчислення НОД.

6) G: = M.

7) E і F остачі розділити на G.

8) Вивести значення E і F на друк.

9) Кінець програми.

Program Sub;

Var A, B, C, D, G, E, F: Integer;

Procedure Nod (M, N: Integer; Var K: Integer);

Begin

While MN Do

If M> N Then M: = M - N Else N: = N - M;

K: = M

End;

Begin

Write ('Введіть числители і знаменники дробів:');

ReadLn (A, B, C, D);

E: = A * D - B * C;

F: = B * D;

If E = 0 Then WriteLn (E)

Else

Begin

Nod (Abs (E), F, G);

E: = E Div G;

F: = F Div G;

WriteLn ('Відповідь:', E, '/', F)

End

End.

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

Виклик процедури здійснюється наступним чином:

();

Наприклад,

Nod (Abs (E), F, G);

За способом передачі фактичних значень в підпрограму в Turbo Pascal 7.0 виділяють параметри-змінні, параметри-значення, параметри-константи і масиви відкритого типу, рядки відкритого типу, параметри-процедури, параметри-функції (подробиці - в літературі).

Функція (на відміну від процедури) завжди повертає єдине значення.

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

Function Nod (M, N: Integer): Integer;

Begin

While MN Do

If M> N Then M: = M - N Else N: = N - M;

Nod: = M

End;

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

Виклик функції буде наступним:

G: = Nod (Abs (E), F);

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

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

Приклад 2. Дано натуральне число n. Переставити місцями першу і останню цифри цього числа.

Program Integ;

Var N: Integer;

Begin

Write ('Введіть натуральне число:');

ReadLn (N);

If Impossible (N)

Then WriteLn ('Неможливо переставити цифри, виникне переповнювання ")

Else Begin

Change (N);

WriteLn ('Відповідь:', N)

End;

End.

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

Function Impossible (N: Integer): Boolean;

Begin

If Number (N) <5

Then Impossible: = False

Else Impossible: = (N Mod 10> 3) Or

(N Mod 10 = 3) And

(N Mod 10000 Div 10 * 10 + N Div 10000> MaxInt Mod 10000)

End;

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

Function Number (N: Integer): Integer;

Var Vsp: Integer;

Begin

Vsp: = 0;

While N> 0 Do

Begin

Vsp: = Vsp + 1; N: = N Div 10

End;

Number: = Vsp

End;

Нарешті, остання процедура.

Procedure Change (Var N: Integer);

Var Kol, P, S, R: Integer;

Begin

Kol: = Number (N);

P: = N Mod 10; {остання цифра}

If Kol> 1 Then

S: = N Div Round (Exp ((Kol - 1) * Ln (10)))

Else S: ​​= 0; {перша цифра}

R: = N Mod Round (Exp ((Kol - 1) * Ln (10))) Div 10;

N: = P * Round (Exp ((Kol - 1) * Ln (10))) + R * 10 + S

End;

Можливі також підпрограми, які викликають самі себе. Вони називаються рекурсивними. Створення таких підпрограм є гарним прийомом програмування, але не завжди доцільно через надмірне витрати пам'яті ЕОМ.

Приклад 3. Знайти максимальну цифру у записі даного натурального числа.

Program MaxDigit;

Type NaturLong = 1 .. (High (LongInt));

Digit = 0 .. 9;

Var A: LongInt;

Function Maximum (N: LongInt): Digit;

Begin

If N <10

Then Maximum: = N

Else If N Mod 10> Maximum (N Div 10)

Then Maximum: = N mod 10

Else Maximum: = Maximum (N Div 10)

End;

Begin

Write ('Введіть натуральне число:');

ReadLn (A);

WriteLn ('Максимальна цифра дорівнює', Maximum (A))

End.

При створенні функції Maximum було використане таке міркування: якщо число складається з однієї цифри, то вона є максимальною, інакше якщо остання цифра не є максимальним, то її слід шукати серед інших цифр числа. При написанні рекурсивного алгоритму слід подбати про граничний умови, коли ланцюжок рекурсивних викликів обривається і починається її зворотне «розкручування». У нашому прикладі це умова N <10.

Більш докладно про рекурсію йдеться у статті.

Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Реферат
15.9кб. | скачати


Схожі роботи:
Програмування Функції процедури та підпрограми
Процедури підпрограми та параметри
Процедури та функції в Turbo Pascal
Паскаль типи дійсних оператори розгалуження функції та їх виклики процедури під задачі
Паскаль рекурсивні означення та підпрограми
Вирази і умовний оператор IF Оператори циклів Масиви та підпрограми
Диференціальне числення функції Область визначення Елементарні функції Означення функції
Диференціал функції його геометричний зміст Лінеаризація функції Диференціал складної функції
Процедури банкрутства
© Усі права захищені
написати до нас