
- •Базовий курс програмування у середовищі Turbo Pascal Методичні вказівки
- •Базовий курс програмування у середовищі Turbo Pascal Методичні вказівки
- •Практична робота №1
- •Організація вводу та виводу даних
- •Мета роботи: ознайомитись з конструкціями мови Turbo Pascal, структурою програм, стандартними типами даних і процедурами вводу та виводу.
- •Теоретичні відомості
- •1 Особливості мови Turbo Pascal
- •1.1 Спеціальні символи
- •1.2 Зарезервовані (ключові) слова
- •1.3 Ідентифікатори
- •1.5 Числа
- •1.6Рядки
- •1.7 Коментарі
- •2 Структура програми
- •Індивідуальні завдання
- •Контрольні питання
- •Практична робота №2
- •Логічні та циклічні структури
- •Теоретичні відомості
- •1 Логічні структури
- •1.1 Команда розгалуження if (умовна команда)
- •1.2 Команда goto
- •1.3 Команда вибору (сase)
- •2 Циклічні структури
- •2.1 Команда циклу з параметром (for)
- •2.2 Команда циклу з передумовою (while)
- •2.3 Команда циклу з постумовою (repeat)
- •2.4 Порівняння роботи команд циклу while, repeat та for
- •Індивідуальні завдання
- •Контрольні питання
- •Практична робота №3
- •Одновимірні масиви. Сортування
- •Мета роботи: ознайомитись з поняттям одновимірних масивів та діями над ними, навчитися застосовувати різні методи сортування для розв’язку математичних і технічних задач.
- •Теоретичні відомості
- •1 Одновимірні масиви
- •1.1 Додавання елементів масиву
- •1.2 Лічильник
- •1.3 Екстремуми
- •2 Методи сортування
- •2.1 Метод лінійного сортування
- •2.2 Сортування методом «бульбашки»
- •Індивідуальні завдання
- •Контрольні питання
- •Практична робота №4
- •Багатовимірні масиви
- •Мета роботи: вивчити технологію роботи з багатовимірними масивами.
- •Теоретичні відомості
- •1 Опис багатовимірних масивів
- •2 Доступ до елементів масивів
- •3 Масиви ідентичного типу
- •4 Головна та побічна діагоналі
- •6 Ввід матриці
- •7 Виведення матриці
- •Індивідуальні завдання
- •Контрольні питання
- •Практична робота №5
- •Підпрограми
- •Мета роботи: ознайомитись з правилами використання підпрограм, вивчити відмінності між процедурами та функціями.
- •Теоретичні відомості
- •1 Процедури та функції
- •1.1 Опис процедури
- •1.2 Опис функції
- •1.3 Формальні та фактичні параметри
- •1.3.1 Передача параметрів у підпрограмах
- •1.3.2 Виклик підпрограм
- •1.4 Глобальні та локальні змінні
- •1.5 Основні відмінності між функціями і процедурами
- •2 Рекурсивні функції
- •Індивідуальні завдання
- •Контрольні питання
- •Практична робота №6
- •Символьні та рядкові змінні
- •Мета роботи: ознайомитись з прийомами роботи із символьними та рядковими змінними.
- •Теоретичні відомості
- •1 Символьні змінні
- •2 Множини
- •3 Рядкові змінні
- •3.1 Оголошення рядкових змінних
- •3.2 Доступ до окремих елементів рядка
- •3.3 Зміна поточної довжини рядка
- •3.4 Злиття рядків
- •3.5 Порівняння рядків
- •3.6 Порожній рядок
- •3.7 Рядки і символи
- •3.8 Масиви символів і рядка
- •3.9 Стандартні підпрограми для обробки рядків.
- •Індивідуальні завдання
- •Контрольні питання
- •Практична робота №7
- •Записи. Записи з варіантами
- •Мета роботи: навчитись створювати прості бази даних за допомогою записів та записів з варіантами.
- •Теоретичні відомості
- •1 Записи
- •2 Записи з варіантами.
- •Індивідуальні завдання
- •Контрольні питання
- •Практична робота №8
- •Файли: текстові, типізовані, нетипізовані
- •Мета роботи: ознайомитись з випадками використання файлів, типами файлів та методами обробки елементів файлів.
- •Теоретичні відомості
- •1 Текстові файли
- •2 Типізовані файли. Мітки
- •3 Нетипізовані файли
- •Приклад 4:
- •Приклад 5:
- •Індивідуальні завдання
- •Контрольні питання
- •Практична робота №9
- •Мета роботи: вивчити структуру та особливості роботи з модулями в Turbo Pascal.
- •Теоретичні відомості
- •1 Структура модуля
- •1.1 Заголовок модуля
- •1.2 Інтерфейс модуля
- •1.3 Виконавча частина модуля
- •1.4 Розділ ініціалізації.
- •2 Етапи розробки модуля
- •Індивідуальні завдання
- •Контрольні питання
- •Практична робота №10
- •Графіка
- •Мета роботи: ознайомитись з принципами побудови графіків функцій та інших графічних об’єктів за допомогою засобів TurboPascal.
- •Теоретичні відомості
- •1 Основні процедури і функції модуля Graph
- •2 Робота із зображеннями.
- •3 Побудова і масштабування графіків
- •Індивідуальні завдання
- •Контрольні питання
- •1 Дані динамічної структури
- •2 Вказівник
- •3 Списки
- •4 Стек. Черга
- •4.1 Алгоритм побудови стека
- •4.2 Алгоритм побудови черги
- •Індивідуальні завдання
- •Контрольні питання
- •Практична робота №12
- •Об’єктно-орієнтоване програмування
- •Мета роботи: засвоїти матеріал щодо можливостей TurboPascal при створенні об’єктів.
- •Теоретичні відомості
- •1 Поняття «об'єкт»
- •2 Спадкування
- •Індивідуальні завдання
- •Контрольні питання
- •Список літератури
- •Зразок оформлення результатів виконання практичного завдання
1.5 Основні відмінності між функціями і процедурами
Функція, як правило, повертає одне єдине значення, наприклад Sin(х). Процедура може повертати складні структури, наприклад масиви.
Заголовок функції (її перший рядок) завершується вказівкою типу значення, що повертається (наприклад, real, integer тощо). У заголовку процедури така інформація не потрібна.
В кінці тіла функції їй присвоюється те значення, для обчислення якого вона призначена, наприклад, Sum_Mas:=5;
Функція може бути операндом математичного виразу. Процедура не може бути частиною виразу.
2 Рекурсивні функції
Рекурсивний об’єкт – це об’єкт, який частково визначається через самого себе.
Ідеї рекурсії відомі дуже давно і використовуються у багатьох областях науки.
Рекурсією у програмуванні називається алгоритмічна конструкція, де підпрограма викликає сама себе. Рекурсія дозволяє записати циклічний алгоритм, не використовуючи цикл.
Стек – це структура даних в оперативній пам'яті, де дані зберігаються й витягаються за принципом «останнім прийшов, першим пішов». При обчисленні рекурсивних функцій система спочатку формує стек і заносить туди необхідні для обчислення дані. На наступному етапі вона робить обчислення, витягаючи дані у зворотному порядку.
Приклад 1:
Розглянемо функцію факторіала n!, яка визначається як добуток перших n цілих чисел: n!=1*2*3*…* n.
Такий добуток звичайно можна легко обчислити за допомогою оператора циклу for.
program Factorial;
var fact:longint;
n,i:integer;
begin
write(‘Ввести число n’);
readln(n);
fact:=1;
for i:=1 to n do
fact:=fact*i;
writeln(‘Факторіал n!=’, fact);
end.
Але визначити факторіал можна і за допомогою рекурсії:
program Factorial;
var
n:integer;
function Fact(i:integer):longint;
begin
if i=1 then Fact:=1
else Fact:=i*(i-1);
end;
begin
write(‘Ввести число n’);
readln(n);
writeln(‘Факторіал n!=’, fact(n));
end.
Зміст та міцність рекурсивного визначення, а також його головне призначення, міститься в тому, що воно дозволяє за допомогою кінцевого виразу визначити нескінченну множину об’єктів. Аналогічно, за допомогою кінцевого рекурсивного алгоритму можна визначити нескінченне обчислення, при цьому алгоритм не буде містити повторів фрагменту тексту.
Для створення рекурсивних алгоритмів необхідна і достатня наявність поняття процедури або функції, тому що вони дозволяють надати довільній послідовності дій ім’я, за допомогою якого можна буде цю послідовність дій визвати.
При використанні рекурсії необхідно правильно вказувати умови закінчення «циклічних» обчислень.
Приклад 2:
Процедура, яка буде нескінченно виводити на друк рядок довільного тексту.
program RecInf1;
procedure Druk1;
begin
writeln(‘Мова програмування Pascal’);
Druk1;
end;
begin
Druk1;
end.
Однак, що оператор виклику процедури поставите перед виводом тексту, то така програма нічого не надрукує, хоча й буде працювати так само нескінченно, як і перша.
program RecInf2;
procedure Druk2;
begin
Druk2;
writeln(‘Мова програмування Pascal’);
end;
begin
Druk2;
end.
Програми, в яких використовуються рекурсії, відрізняються простотою, але при цьому неекономно використовується оперативна пам’ять.
Глибиною рекурсії називають максимальне число рекурсивних викликів процедури без повернень, яке відбувається під час виконання програми.
Число рекурсивних викликів у кожний конкретний момент часу називають поточний рівнем рекурсії.
Головною вимогою до рекурсивних процедур є те, що виклик рекурсивної процедури повинен виконуватись за умовою, яка на деякому рівні рекурсії стане хибною.
Структура рекурсивної процедури може приймати три різні форми:
1. Форма з виконанням дій до рекурсивного виклику (з виконанням дій на рекурсивному спуску).
procedure Rec;
begin
S; {множина операторів}
if умова then Rec;
end;
2. Форма з виконанням дій після рекурсивного виклику (з виконанням дій на рекурсивному поверненні).
procedure Rec;
begin
if умова then Rec;
S; {множина операторів}
end;
1. Форма з виконанням дій як до, так і після рекурсивного виклику (з виконанням дій як на рекурсивному спуску, так і на рекурсивному поверненні).
procedure Rec;
begin
S1; {множина операторів}
if умова then Rec;
S2; {множина операторів}
end;
або
procedure Rec;
begin
if умова then Rec;
begin
S1; {множина операторів}
Rec;
S2; {множина операторів}
end;
end;
Приклад 3:
Особливості застосування підпрограм демонструє програма, яка виконує наступні задачі.
Введення цілочисельних одновимірних масивів n_Mas і m_Mas, що складаються відповідно з n і m членів.
Виведення на екран початкових масивів.
Сортування початкових масивів за збільшенням значень їх елементів методом лінійного сортування.
Виведення на екран відсортованих масивів.
Обчислення і виведення на екран суми сум елементів початкових масивів.
program Proc_Fun; {Ілюстрація застосування процедур і функцій}
uses Crt;
const {глобальні константи}
n=5;{Довжина масиву n_Mas}
m=7;{Довжина масиву m_Mas}
tурe {глобальні типи}
Int_m=1..m;{оскільки m> n}
Mas_Type=array[Int_m] of integer;
var {глобальні або нелокальні змінні}
n_Mas,m_Mas:Mas_Type;
{опис підпрограм}
procedure Chtenie_Dan(Var Mas:Mas_Type;Dlina:Int_m);
{Mas – масив, параметр-змінна; Dlina – параметр-значення}
var {локальні змінні}
i:Int_m; {номер поточного елементу масиву}
begin
writeln('Введіть поелементно масив з ',Dlina,' цілих чисел');
for i:=l to Dlina do
read(Mas[i]);
writeln; {пропуск рядка}
end; {Chtenie_Dan}
procedure Pechat_Mas(Mas:Mas_Type;Dlina:Int_m);
{Mas – параметр-значення; Dlina – параметр-значення}
var i:Int_m;
begin
for i:=1 to Dlina do
write(Mas[i]:4);
writeln; {для друку подальших повідомлень з нового рядка}
end; {Pechat_Mas}
Procedure Sort(Var Mas:Mas_Type;Dlina:Int_m);
{лінійне сортування масиву за збільшенням елементів}
var i, Candidat:Int_m;
x:Integer;
begin
for i:=1 to Dlina - 1 do
for Candidate 1+1 to Dlina do
if Mas[i]>Mas[Candidat]
then
begin
x:=Mas[i];
Mas[i]:=Mas[Candidat];
Mas[Candidat]:=x;
end; {then}
end; {Sort}
function Sum_Mas(Mas:Mas_Type;Dlina:Int_m):longlnt {особливість функції};
{сумування елементів масиву}
var i:Int_m;
S:longlnt;
begin
S=0;
for i:=1 to Dlina do
S:=S+Mas[i];
Sum_Mas:=S; {особливість функції}
end; {Sum Mas}
procedure Sum_Sum_Pechat;{процедура без параметра}
begin
writeln('Сума сум масивів: ',Sum_Mas(n_Mas,n) + Sum_Mas(m_Mas,m));
end;{Sum_Sum_Pechat}
begin
clrscr;
Chtenie_Dan(n_Mas,n);
Chtenie_Dan(m_Mas,m);
writeln('Початковий масив из',n,' членів:');
Pechat_Mas(n_Mas,n);
writeln('Початковий масив з ',m,' членів:');
Pechat_Mas(m_Mas,m);
Sort(n_Mas,n);
Sort(m_Mas,m);
writeln('Масиви після сортування:');
Pechat_Mas(n_Mas,n);
Pechat_Mas(m_Mas,m);
Sum_Sum_Pechat;
readln;
readln;
end. {Proc_Fun}