- •1. Вступ
- •2. Основи мови програмування
- •§ 2.1 Вступ до мови програмування
- •§ 2.2 Алфавіт мови і структура програми
- •§ 2.3 Стандартні типи змінних
- •§ 2.4 Опис констант і змінних
- •§ 2.5 Організація вводу-виводу
- •§ 2.6 Вправи та завдання
- •3. Стандартні операції, процедури та функції
- •§ 3.1 Стандартні математичні операції мови
- •§ 3.2 Стандартні математичні функції
- •§ 3.3 Стандартні операції для роботи з символьною інформацією.
- •§ 3.4 Логічні операції
- •§ 3.5 Вправи та завдання
- •4. Графічна інформація та її обробка на мові Pascal.
- •§ 4.1 Організація відображення графічної інформації
- •§ 4.2 Вправи та завдання
- •5. Поняття розгалуження і вибору.
- •§ 5.1 Структура “якщо... То... Інакше...”
- •§ 5.2 Інструкція If... Then... Else...
- •§ 5.3 Інструкція Case
- •§ 5.4 Організація розгалужень в програмах
- •§ 5.5 Вправи та завдання
- •6. Організація циклів
- •§ 6.1 Цикл з параметром
- •§ 6.2 Цикл з передумовою
- •§ 6.3 Цикл з післяумовою
- •§ 6.4 Який з циклів використовувати?
- •§ 6.5 Приклади використання циклів при розв’язуванні конкретних задач.
- •§ 6.6 Вправи та завдання
- •7. Поняття про процедури та функції
- •§ 7.1 Чи потрібні процедури і функції
- •§ 7.2 Процедури
- •§ 7.3 Функції
- •§ 7.4 Вправи та завдання
- •8. Масиви § 8.1 Поняття масиву
- •§ 8.2 Пошук найбільшого або найменшого елементу масиву
- •§ 8.3 Сортування елементів масиву
- •§ 8.4 Приклади розв’язання задач з використанням масивів
- •§ 8.5 Вправи та завдання
- •9. Робота з літерними та символьними величинами
- •§ 9.1 Основні операції для роботи з літерними величинами
- •§ 9.2 Приклади розв’язування задач з використанням основних операцій для роботи з літерними величинами
- •§ 9.2 Лексикографічний метод генерації перестановок
- •§ 9.4 Вправи та завдання
- •10. Двомірні масиви
- •§ 10.1 Приклади використання двомірних масивів
- •§ 10.2 Вправи та завдання
- •11. Множини, записи, файли § 11.1 Множини
- •§ 11.2 Записи
- •§ 11.3 Файли
- •§ 11.4 Вправи та завдання
- •Побажання тим, хто відчув себе програмістом
- •Додатки Словник деяких зарезервованих слів та основних операцій мови
- •Основні команди оболонки програмування Turbo Pascal 5.5
- •Список рекомендованої літератури
§ 7.2 Процедури
Розв'яжемо попередню задачу у дещо модифікованому, або як прийнято говорити – узагальненому вигляді.
Задача 148 Знайти НСК n чисел.
Розв’язання: Спосіб розв'язання нам вже відомий. Але ж ми мали вивчати процедури. Тому давайте домовимось, що ми не знаємо, для скількох чисел ми будемо шукати НСК, але нам відомо, що в любому випадку результат не буде перевищувати тип longint. Дані будемо вводити з клавіатури і ознакою закінчення завдання буде число 0.
Дещо відійдемо від задачі для введення деяких нових понять, адже ми з вами вже звикли до слів процедура і функція, але ще не пояснили, що це таке.
Підпрограмою називається логічно закінчена група операторів мови, яку можна викликати для виконання по імені яку завгодно кількість разів з різних місць програми. В мові Паскаль одним із видів підпрограм і є процедури.
Процедура – це незалежна частина програми, яка має свою назву і призначена для виконання певних дій. Вона складається з заголовку і тіла. По структурі її можна розглядати як програму в програмі, або програму в мініатюрі. На деякі тонкощі і нюанси при створенні і виклику процедур ми вкажемо на конкретних прикладах, а зараз лише наголосимо на тому факті, що ім’я процедури не може знаходитись у виразі в якості операнда.
Процедури поділяють на встроєні (стандартні) процедури мови і процедури користувача. Саме про останні ми і будемо вести розмову, оскільки з стандартними процедурами ми знайомились до цього, навмисно називаючи їх як завгодно, але тільки не процедурами. Процедури користувача створюються програмістом у відповідності з правилами мови програмування, тому їх краще, мабуть, було б назвати процедурами програміста, а не процедурами користувача. Ми знову підійшли до межі між конкретною наукою і філософією, тому не будемо вводити нових понять, а просто погодимось з загальноприйнятою назвою і перейдемо до конкретного розгляду на підставі сформульованої задачі.
Ми організуємо підпрограму – процедуру для знаходження НСК для двох чисел, і будемо його обчислювати в циклі, доки не буде введе число нуль. Необхідні пояснення – в тексті програми.
program nsk_n_v2; { Програма знаходження НСК для n чисел }
var a, nsk : longint; { нам будуть потрібні всього дві змінні: число і НСК}
procedure nsk_2; { процедура для знаходження НСК двох чисел }
var x, y : longint; { додаткові змінні, значення яких програма не бачить }
begin { початок процедури }
x := nsk; y := a; { зберігаємо вхідні дані }
while x <> y do { і працюємо з внутрішніми змінними }
if x > y then x := x - y { процедури, використовуючи вже відомий }
else y := y - x; { нам алгоритм Евкліда для НСД }
nsk := (nsk div x) * a; { і знаходимо НСК }
end; { кінець процедури }
begin { головна програма }
nsk := 1; { для першого входження в процедуру nsk_2 }
a := 1; { для входження в цикл }
while a <> 0 do { цикл завершується коли з клавіатури ввели 0 }
begin
write('Введіть число: '); readln(a); { зчитали число }
if a<>0 then { і якщо воно не нуль }
begin
nsk_2; { то знаходимо НСК двох чисел }
writeln('НСК = ',nsk); { і виводимо значення на екран }
end;
end; { кінець циклу, коли ввели 0 }
writeln('Для закінчення нажміть <Enter>'); { повідомлення }
readln; { чекаємо натиснення <Enter> }
end. { кінець програми }
Зверніть увагу на внутрішні змінні процедури nsk_2. Якщо ви захочете побачити їх значення після чергового виклику процедури, то виклик write(x, ' ', y), здійснений в тілі програми, не дасть вам нічого. Більше того, програма навіть не захоче працювати і компілятор видасть повідомлення про невідомий ідентифікатор6, тобто про невідому змінну. Такий самий виклик в тілі процедури виведе на екран відповідні значення змінних. Спробуйте самостійно вставити у наведену вище програму у відповідних місцях вказаний виклик і ви самі у цьому наочно переконаєтесь. Це пояснюється тим, що кожна змінна має свою область дії, а це в свою чергу означає, що нам потрібно внести доповнення до правил нашої гри, яку ми почали на перших сторінках книги:
Кожен ідентифікатор (назва змінної, процедури, функції і т.д.) повинен бути описаний перед тим, як він буде використаний.
Областю дії ідентифікатора є блок в якому його описано.
Всі ідентифікатори в блоці повинні бути унікальними, тобто не повторюватись.
Один і той самий ідентифікатор може бути по-різному визначено в кожному окремому блоці.
Якщо ідентифікатор програми користувача співпадає з ім’ям стандартної процедури або функції, то останні недоступні в межах області дії підпрограми, описаної користувачем, тобто стандартна функція або процедура ігнорується, а виконується підпрограма користувача.
Пояснимо детальніше вище сформульовані правила на конкретному прикладі. Не будемо розв’язувати якусь конкретну задачу, а просто приведемо демонстраційну програму.
program demo_proc;
uses dos, crt;
var x, y : longint; { ввели глобальні змінні для всієї програми }
procedure hello;
var x : byte; { локальна змінна видима тільки в даній процедурі}
begin
x := 5; { присвоїли значення локальній змінній }
writeln('А у мене Х = ',x); { вивели локальну змінну на екран }
end;
procedure inc(x:longint); { переписали стандартну процедуру }
begin
x:=2*x; { працюємо з глобальної змінною }
writeln('X = ',x); { вивели глобальну змінну на екран }
end;
begin
clrscr;
write('Введiть число: ');readln(x); { ввели значення глобальної змінної}
writeln('X = ',x); { вивели його на екран }
hello; { викликали процедуру з локальною змінною }
inc(x); { викликали перевизначену процедуру з глобальною змінною }
writeln('X = ',x); { знову вивели значення х на екран }
writeln('Для закiнчення нажмiть <Enter>');
readln;
end.
Рис.
1.
Процедури можуть бути двох видів: без параметрів і з параметрами. Параметри – це змінні, що передаються або використовуються процедурою. В свою чергу параметри поділяють на три типи: значення, змінна і нетипізована змінна.
Параметр, або група параметрів, перед якими відсутнє зарезервоване слово var і за якими йде тип, називаються параметрами-значеннями. Так у наведеній вище демонстраційній програмі в описі procedure inc(x:longint); х – параметр-значення. Формальний параметр-значення обробляється як локальна по відношенню до процедури змінна і зміни формальних параметрів не впливають на фактичне значення відповідних параметрів.
Якщо ми у приведеній демонстраційній програмі змінимо опис процедури на procedure inc(var x : longint);, то ми отримаємо процедуру з параметрами-змінними. Параметри-змінні використовуються у тому випадку, коли нам потрібно передати значення змінної з процедури у той блок програми, що її викликав. Спробуйте вставити слово var у опис вищезгаданої процедури у демонстраційній програмі і ви помітите, що значення змінної х у програмі зміниться на очікуване.
Нетипізовані змінні ми розглянемо у наступному параграфі. А зараз розв’яжемо ще одну просту задачу, де наведемо ще один приклад використання процедур.
Надіємось, що наведені приклади дали вам можливість зрозуміти особливості і правила створення і виклику процедур, а ми переходимо до розгляду ще одного виду підпрограм.