- •Історична довідка
- •Характеристика й особливості мови
- •Алфавіт мови
- •Службові (зарезервовані) слова.
- •Структура програми мови Turbo Pascal
- •Розділ оголошень і угод
- •Розділ текстів процедур і функцій
- •Розділ основного блоку програми
- •Процедури введення-виведення. Деякі вбудовані функції Турбо-Паскаля.
- •Функції числових параметрів.
- •Базові управляючі конструкції Турбо-Паскаля Оператори умовного переходу.
- •1. Оператор if.
- •2. Оператор вибору (case)
- •Оператори циклів у Паскалі
- •1. Цикл із післяумовою (Repeat)
- •2. Цикл із предумовою (While)
- •3. Цикл із лічильником або параметром (For)
- •Концепція типів даних. Типи даних в мові Pascal
- •Дійсні типи
- •Бульовий (логічний) тип
- •Символьні і рядкові змінні
- •1. Символьний тип
- •2. Рядковий тип
- •Перерахований та обмежений типи
- •1. Перерахований тип
- •2. Обмежений тип
- •1. Поняття масиву. Одномірні масиви
- •2. Багатомірні масиви
- •3. Сортування і пошук
- •Множинний тип
- •Тип запис
- •Процедури і функції
- •Формальні і фактичні параметри. Механізм параметрів
- •Параметри - значення
- •Параметри-змінні
- •Безтипові параметри
- •Приведення типів.
- •Процедурні типи
- •Рекурсія Рекурсивні визначення
- •Рекурсивні підпрограми
- •Алгоритми з поверненням. Розв’язок задачі про рух коня
- •Алгоритми з поверненням. Розв’язок задачі про вісьмох ферзів
- •If підходить тнеn
- •Модулі в Турбо Паскалі
- •Модуль crt
- •1. Керування екраном
- •2. Робота з клавіатурою
- •3. Інші можливості
- •Графіка в Турбо Паскалі
- •1. Включення і вимикання графічного режиму.
- •2. Побудова елементарних зображень
- •3. Виведення текстової інформації.
- •Файли в мові програмування Pascal
- •Установчі і завершальні операції
- •Операції введення-виведення
- •Обробка помилок введення-виведення
- •Переміщення по файлу
- •Спеціальні операції
- •Текстові файли
- •1. Оголошення файлової змінної і прив'язка до файлу на диску
- •2. Читання даних з файлу
- •3. Запис даних у файл
- •Двійкові файли
- •1. Типізовані файли
- •2. Нетипізовані файли
- •Статичні і динамічні змінні
- •Покажчики
- •Стан покажчика
- •Установка розмірів динамічної пам'яті
- •Сумісність і перетворення посилкових типів
- •Динамічні структури даних
- •Динамічні змінні: інші види списків, стек і черга.
- •1. Інші види списків
- •2. Стек і черга
- •Дерева і пошук у деревах
- •1. Визначення й описи структур даних
- •1. Масив
- •2. Список
- •3. Дерево
- •2. Алгоритми
- •1. Лінійний пошук у масиві
- •2. Двійковий пошук
- •3. Лінійний пошук у списку
- •Змішані таблиці
- •Об’єктно-орієнтоване програмування. Що таке об’єктно-орієнтоване програмування
- •Інкапсуляція
- •Спадкування
- •Віртуальні методи і поліморфізм
- •Конструктори, динамічні об'єкти і деструктори
- •Поля і методи: сховані і загальнодоступні
- •Системно- залежні розширення
- •Налагодження змінних
- •Оверлеї
- •Переривання і системні виклики
- •Доступ до пам'яті і портів
- •Перевизначення переривань
Процедури і функції
Процедура ( послідовність дій (записаних на Паскалі), названа яким-небудь ім'ям. Для того щоб виконати цю послідовність, потрібно у відповідному місці програми вказати її ім'я (так, наприклад, для очищення екрана при роботі з графікою ми вказуємо ClearDevice;). Крім того, що програма стає при використанні процедур коротше і зрозуміліше, процедури можна викликати з різних місць програми (у противному випадку довелося б повторювати в тексті програми однакові послідовності дій кілька разів).
Ті дії, що входять у процедуру, записуються до початку основної програми в наступному виді:
program ...
const ...
type ...
var ...
procedure MyProc;
begin
{дії}
end;
begin
{основна програма}
end.
Розглянемо приклад знаходження максимуму з трьох чисел:
program Max1;
var a,b,c,m: integer;
begin
write('Уведіть a: '); readln(a);
write('Уведіть b: '); readln(b);
write('Уведіть c: '); readln(c);
if a>b then m:=a else m:=b;
if c>m then m:=c;
writeln('Максимум = ',m);
readln;
end.
Перепишемо його з використанням процедури:
program Max2;
var a,b,c,m: integer;
procedure FindMax;
begin
if a>b then m:=a else m:=b;
if c>m then m:=c;
end;
begin
write('Уведіть a: '); readln(a);
write('Уведіть b: '); readln(b);
write('Уведіть c: '); readln(c);
FindMax;
writeln('Максимум = ',m);
readln;
end.
Цей варіант можна поліпшити. Поки наша процедура може шукати мінімум тільки серед значень конкретних змінних a, b і c. Змусимо її шукати мінімум серед будь-яких трьох цілих чисел і поміщати результат у потрібну нам змінну, а не завжди в m.
Щоб була видна користь від такої процедури, розглянемо приклад програми для пошуку максимуму серед чисел a+b, b+c и a+c:
program Max3;
var a,b,c,m: integer;
procedure FindMax(n1,n2,n3: integer; var max: integer);
begin
if n1>n2 then max:=n1 else max:=n2;
if n3>max then max:=n3;
end;
begin
write('Уведіть a: '); readln(a);
write('Уведіть b: '); readln(b);
write('Уведіть c: '); readln(c);
FindMax(a+b,b+c,a+c,m);
writeln('Максимум із сум = ',m);
readln;
end.
У дужках після імені процедури (у її описі) записані так називані параметри. Цей запис позначає, що усередині процедури можна використовувати цілі числа, позначені n1, n2 і n3, а також заносити значення в змінну типу integer, що усередині процедури називається max (а реально під час роботи програми всі дії виконуються над змінною m). Параметри, у яких зберігаються числа (n1,n2,n3) називаються параметрами-значеннями; а ті, котрі позначають змінні (max) – параметрами-змінними, перед ними в описі ставиться слово var. Параметри, на які маються посилання усередині процедури (n1, n2, n3, max), називаються формальними, а ті, котрі реально використовуються при виклику (a+b, b+c, a+c, m) — фактичними.
Процедури останнього виду виявляються досить зручними. Можна один раз написати таку процедуру, переконатися в її працездатності і використовувати в інших програмах. Прикладами таких процедур є процедури для роботи з рядками, убудовані в Турбо-Паскаль.
У нашому прикладі можна переписати програму і по-іншому. Максимум із трьох чисел визначається по них однозначно, чи, говорячи математичною мовою, є функцією цих трьох чисел. Поняття функції є також і в Паскале. Розглянемо таку програму:
program Max4;
var a,b,c,m: integer;
function Max(n1,n2,n3: integer) : integer;
var m: integer;
begin
if n1>n2 then m:=n1 else m:=n2;
if n3>m then m:=n3;
Max:=m;
end;
begin
write('Уведіть a: '); readln(a);
write('Уведіть b: '); readln(b);
write('Уведіть c: '); readln(c);
writeln('Максимум = ',Max(a+b,b+c,a+c));
readln;
end.
Нам уже відомо як викликати функцію з програми (наприклад sqrt, sin і т.п.). Розглянемо опис функції. Воно дуже схоже на опис процедур, але є дві відмінності:
Після імені функції і списку параметрів (якщо є) через двокрапку записується тип значення функції (можливі не тільки числові типи, але і логічні, строкові, символьні);
Серед операторів у тілі функції найбільш важливими є оператори присвоювання значення функції (у нашому випадку це рядок Max:=m;).
У записаній вище функції використовується так називана локальна змінна m, тобто змінна, котра «видна» тільки нашій функції, а інші процедури і функції, а також головна програма її «не бачать». Крім локальних змінних у Турбо-Паскалі можна визначати локальні константи і типи.
Приведемо інші приклади процедур і функцій.
Напишемо на Паскале функцію .
function Cube(x: real): real;
begin
Cube:=x*x*x;
end;
Обчислення площі трикутника через довжини сторін. Тут буде використана формула Герона: , де p – напівпериметр трикутника, a, b, c – довжини сторін.
function Square(a,b,c: real): real;
var p: real;
begin
p:=(a+b+c)/2;
Square:=sqrt(p*(p-a)*(p-b)*(p-c));
end;
Процедура для рішення квадратного рівняння. Будемо передавати цій процедурі коефіцієнти рівняння, а результати своєї роботи вона буде видавати в трьох параметр-перемінних. Через першу, логічного типу, процедура повідомить, є чи речовинні корені, а ще в двох вона видасть самі ці корені (якщо коренів ні, те на ці два перемінні користувачів нашої процедури може не звертати уваги).
procedure SqEquation(a,b,c: real; var RootsExist: boolean; var x1,x2: real);
var d: real;
begin
d:=sqr(b)-4*a*c;
if d>=0 then begin
RootsExist:=true;
x1:=(-b+sqrt(d))/(2*a);
x2:=(-b-sqrt(d))/(2*a);
end
else RootsExist:=false;
end;
Можна замість процедури написати і функцію, за логічним значенням якої ми визначаємо, чи є корені, а самі корені передавати також як і в процедурі:
function EqHasRoots(a,b,c: real; var x1,x2: real) : boolean;
var d: real;
begin
d:=sqr(b)-4*a*c;
if d>=0 then begin
EqHasRoots:=true;
x1:=(-b+sqrt(d))/(2*a);
x2:=(-b-sqrt(d))/(2*a);
end
else EqHasRoots:=false;
end;
Використовувати таку функцію навіть простіше чим останню процедуру:
if EqHasRoots(1,2,1,r1,r2) then writeln(r1,' ',r2) else writeln('Немає коренів');