
- •Алфавіт мови включає в себе:
- •Лексеми мови. Під лексемами розуміють елементарні конструктивні елементи програми, які є неподільними:
- •Оголошення підпрограм: функцій та процедур. Структурне програмування передбачає побудову програм, яка фактично буде послідовністю звертань до підпрограм.
- •Оператор присвоєння присвоює змінній значення виразу, в якості якого може використовуватися і константа, і змінна, і результат обрахування функції, і група операцій. Оператор має вигляд:
- •Складений оператор. Якщо потрібно деяку групу команд інтерпретувати, їх як одну команду, тобто об’єднати їх в певному контексті, то використовують складені оператори.
- •Оператори вводу-виводу. В мові програмування Turbo Pascal ввід-вивід здійснюється насправді не операторами, а стандартними
- •Оператор розгалуження. В ряді випадків алгоритм розв’язку задачі передбачає розгалуження, тобто можливість виконання декількох різних дій в залежності від значення певної логічної умови.
- •Оператори циклу.
- •Програма знаходження суми чисел 1..10.
- •Програма друкування символів ‘a’..’z’.
- •Програма побудови таблиці істинності для and.
- •Скалярні / прості / стандартні типи даних:
- •Скалярні типи користувача:
- •Наприклад
- •4.Структурокані типи даних:
- •1 Діапазон – одновимірний масив;
- •2 Діапазони – двовимірний ( таблиці, матриці);
- •Наприклад
- •5.Комбіновані структури даних.
- •Варіантна частина у записі може бути лише одна і лише в кінці. Службове слово end є спільним для конструкції record і варіантної частини.
- •Приклади задач з масивами
- •Знайти середнє арифметичне додатніх і від’ємних елементів масиву цілих чисел.
- •Стандартні підпрограми обробки рядків
- •Операції над множинами
- •1. Процедури являють собою дію, тому їх можна використовувати в якості окремого оператора в розділі операторів програми.
- •2. Функції являють собою значення певного типу, крім цього вони можуть використовувати деяку дію, але значення їх є головним. Тому функції використовують як окремі оператори у виразах.
- •Параметри-змінні
- •Без типові параметри
- •Наявність умови зупинки, при якій деякому параметру рекурсії передається деяке значення рекурсії.
- •Чітко визначений алгоритм, при обчисленні кожного вищого рівня рекурсії через попередній рівень.
- •Типізовані.
- •Текстові.
- •Безтипові.
- •Процедура зв’язування певної файлової змінної із конкретним файлом на диску
- •Процедура відкриття файлу для читання
- •Процедура відкривання файлу для запису
- •Процедура закривання файлу
- •Процедура примусового очищення внутрішнього буфера обміну
- •Розглянуті раніше встановлюючи та завершальні підпрограми
- •Процедура читання
- •Процедура запису у файл
- •Функція визначення розміру файла у записі
- •Процедура відсікання хвостової частини файлу
- •Процедура читання з текстового файлу
- •Процедура запису
- •1. Процедура для перейменування файлів
- •2. Процедура видалення файлу
- •Xxxx0 адреса
- •35 Квартира з номером 34 у 13 будинку з номером 12.
- •Файли розміщуються в зовнішній пам'яті, а динамічні структури в оперативній.
- •Типізовані файли фактично є файлами прямого доступу, що означає довільний доступ до елементів. В динамічних структурах доступ до елементів виключно послідовний.
- •Здійснюватиметься рух по дереву до крайнього лівого елемента (найменшого).
- •Це значення друкується.
- •Робиться один крок вправо і послідовність 1-3 повторюється відносно нової поточної вершини.
- •Заголовок.
- •Інтерфейс на частина.
- •Розділ реалізації. В реалізації описуються всі компоненти мови, які мають бути невидимі зовні.
- •Процедури управління виконанням програм
- •Функції перетворення типів
- •Процедури і функції для змінних порядкового типу
- •Математичні функції
- •Процедури та функції роботи з рядками
- •Процедури та функції управління динамічною пам’яттю
- •Функції роботи з вказівниками і адресні функції
- •Процедури вводу-виводу і роботи з файлами і каталогами
- •Інші процедури і функції
- •Змінні та константи модуля
- •Змінні модуля crt
- •Процедури і функції модуля crt
- •Перепризначення файлів вводу-виводу
- •Процедури роботи з екраном
- •Процедури і функції управління курсором
- •Процедури роботи з рядками
- •Функції допиту клавіатури
- •Процедури управління кольором
- •Процедури управління вбудованим динаміком і таймером
- •Використання клавіш редагування рядків
- •Використання командних символі
- •Типи драйверів
- •Типи шрифтів
- •Ініціалізація графіки класифікація типів драйверів і відео режимів
- •Ініціалізація і завершення відеорежиму
- •Обробка помилок ініціалізації
- •Процедури роботи з відеорежимами
- •Переключення між текстовим і графічним режимами
- •Побудова зображень на екрані система координат
- •Управління поточним вказівником
- •Графічні вікна
- •Відображення точки на екрані
- •Відображення відрізків прямих ліній
- •Побудова прямокутників
- •Побудова многокутників
- •Побудова дуг, еліпсів і кіл
- •Робота з текстом
- •Відображення рядків
- •Відображення числової інформації
- •Управління параметрами зображення встановлення кольору
- •Встановлення палітри
- •Функції управління операційним середовищем
- •Процедури управління процесами
- •Процедури обслуговування переривань
- •Програми, резидентні в пам'яті
- •Процедури роботи з датою і часом
- •Процедури і функції перевірки стану диску
- •Процедури і функції роботи з файлами
- •Інші процедури і функції
- •Поля даних оголошуються на початку, а методи після них.
- •При оголошенні методів у структурі задаються лише заголовок відповідної підпрограми (подібно до інтерфейсу в модулях).
- •Окремі методи можуть використовувати інші методи цього ж об’єкта, тому вони повинні бути оголошенні в певному порядку.
- •Ini; {ініціалізація графіки}
- •Віртуальним варто оголошувати лише той метод, який:
- •Постановки задачі;
- •Наявними програмними ресурсами;
- •Вимогами по швидкодії, використанням ресурсів еом.
Файли розміщуються в зовнішній пам'яті, а динамічні структури в оперативній.
Типізовані файли фактично є файлами прямого доступу, що означає довільний доступ до елементів. В динамічних структурах доступ до елементів виключно послідовний.
Зв’язок між елементами в динамічних структурах реалізуються при допомозі вказівників, кожен елемент такої структури в свою чергу є складеною структурою: інформаційна частина містить корисні дані, а вказівна містить адресу наступного елемента.
Тема: Списки. Атрибути списків.
Згадані вище динамічні структури даних в програмуванні називають списками. Під списком розуміється деяка послідовна структура даних, кожен елемент якої містить два компоненти: інформаційне поле та вказівні поля. Саме через вказівники здійснюється зв’язок елементів у списку.
Доступ до всього списку реалізується через фіксований вказівник у вигляді статичної змінної на перший елемент списку – голова списку. Всі решта елементів утворюють так званий хвіст списку. Останній елемент списку переважно вказує в nil – це є ознака кінця списку.
В залежності від кількості вказівних полів в кожному елементі списку, розрізняють однозв’язні списки (один вказівник) п-зв’язні списки (п вказівників) .
Крім такого поділу по зв’язності, списки бувають лінійними, деревами, графами та ін.
В двонапрямлених списках доступ до елементів однаково здійснюється при русі від першого до останнього за вказівником next, або від останнього до першого за вказівником prev.
Якщо елементи списку мають два вказівних поля, але список не лінійних, а розгалужений, то отримується список у вигляді бінарного дерева.
Тема: Лінійні однонапрямлені списки.
Такі списки складаються з елементів, які є комбінацією двох полів: інформаційного та вказівного на наступний елемент.
Вказівне поле матиме тип вказівника на базовий тип, що є типом всього елемента списку, при цьому допускається рекурсивність оголошення типу списку.
TYPE
list1=^el_list1;
el_list1=record
inf:integer;
next:list1
END;
В програмі доступ до таких однонапрямлених змінних здійснюється через фіксований вказівник – статичну змінну. Ця змінна не може змінювати свого значення, оскільки може призвести до втрати адреси всього списку. Останній елемент списку вказує в nil.
Формування списку здійснюється при допомозі процедур створення динамічних змінних, при цьому кожний новий елемент зв’язується вказівником з попереднім елементом або своїм вказівником із наступним. Формування списку може здійснюватися за двома принципами:
Стек.
Черга.
При формуванні списку за правилом стеку: кожен новий елемент ставиться у список в якості голови.
Якщо список формується за правилом черги, то кожен новий елемент добавляється у хвіст списку. Фіксований вказівник вказує на один і той же елемент, при цьому потрібно мати ще один фіксований вказівник на останній елемент списку.
Відмінність між списками чергами і стеками лише у порядку заповнення елементами. Всі решта операцій по переміщенню, вставці, видаленню абсолютно однакові.
Традиційно, над лінійними списками виконують наступні дії:
Формування.
Перегляд.
Пошук елемента за вказаним інформаційним полем.
Вставка нового елемента після деякого елемента із вказаним значенням.
Вставка елемента перед деяким елементом.
Видалення елемента із вказаним значенням.
Формування однонапрямленого списку.
Для реалізації операції в програмі достатньо мати 4 статичні змінні.
а). Стек.
VAR
first, last,p,q:list1;
o:string;
n,i,a,k:integer;
BEGIN
writeln('введіть кількість елементів у списку');
readln(n);
for i:=1 to n do
begin
new(p);
writeln('введіть елемент списку');
readln(a);
p^.inf:=a;
p^.next:=first;
first:=p
end;
б). Черга.
writeln('введіть кількість елементів у списку');
readln(n);
first:=nil;
last:=nil;
new(p);
writeln('введіть елемент списку');
readln(a);
p^.inf:=a;
last:=p;
first:=p;
for i:=2 to n do
begin
new(p);
writeln('введіть наступний елемент списку');
readln(a);
p^.inf:=a;
last^.next:=p;
last:=p
end;
Оскільки при створення першого елементу передбачаються операції з вказівником first, а створення решти елементів не потребує використання first, то при побудові списку за правилом черги формування першого елементу відрізняється від формування останніх.
Перегляд всього списку. Перегляд списку передбачає рух від голови списку до кінця.
PROCEDURE RESIV (first,p:list1);
BEGIN
p:=first;
while p<>nil do
begin
write(p^.inf,',');
p:=p^.next
end;
writeln
END;
3.Пошук за вказаним інформаційним полем.
writeln('введіть шуканий елемент');
readln(a);
while (p<>nil) do
begin
if p^.inf=a then
begin
writeln ('під номером № ‘,k+1);
i:=i+1;
end;
p:=p^.next;
k:=k+1
end;
if k=0 then writeln ('немає')
else writeln ('кількість ',i)
4.Вставка нового елементу після деякого елементу.
p:=first;
writeln ('введіть елемент, після якого потрібно вставити новий');
readln(k);
while p<>nil do
begin
if p^.inf=k then
begin
new(q);
writeln('введіть елемент, який потрібно вставити');
readln(a);
q^.inf:=a;
q^.next:=p^.next;
p^.next:=q
end;
p:=p^.next
end;
5. Вставка нового елементу перед деяким елементом. Вставка нового елемента перед деяким елементом є складнішим, оскільки список є структурою з послідовним доступом. Вставка перед деяким елементом х – це теж саме, що й вставка після попереднього елемента з значенням п.
writeln ('введіть елемент, перед яким потрібно вставити новий');
readln(k);
p:=first;
if p=nil then writeln ('список пустий')
else
if p^.inf=k then {вставка перед першим}
begin
new(q);
writeln ('введіть елемент, який потрібно вставити');
readln(a);
q^.inf:=a;
q^.next:=p;
first:=q
end
else
begin
while (p^.next<>nil) and (p^.next^.inf<>k) do
p:=p^.next;
if p^.next=nil then writeln ('немає такого елементу ')
else
begin
new(q);
writeln('введіть елемент, який потрібно вставити');
readln(a);
q^.inf:=a;
q^.next:=p^.next;
p^.next:=q
end
end;
6. Видалення. Для видалення елементу із вказаним інформаційним плем потрібно знову ж як і для вставки перед мати вказівник на попередній елемент, тому операція видалення матиме декілька варіантів: пустий список, видаляється перший елемент, відсутність у списку шуканого елементу, шуканий елемент довільний, крім першого.
writeln('введіть елемент, який потрібно вилучити');
readln(a);
p:=first;
if p=nil then writeln ('список пустий')
else
if p^.inf=a then
begin
first:=p^.next;
dispose(p)
end
else
begin
while (p^.next<>nil) and (p^.next^.inf<>a) do
p:=p^.next;
if p^.next=nil then writeln ('такого елементу немає')
else
begin
q:=p^.next;
p^.next:=q^.next;
dispose(q)
end
end;
Тема: Двонапрямлені лінійні списки.
У двонапрямлених списках і в розглянутих раніше однонапрямлених елементи утворюють лінійну структуру даних з послідовним доступом, але на відміну від них, рух по списку можливий у двох напрямках, тому кожен елемент міститиме, окрім інформаційного поля, два вказівні поля: на наступний і попередній елементи. Список матиме два фіксованих вказівники: на перший – first; на останній – last.
Оскільки рух по списку можливий у двох напрямках, то переміщення від first до last здійснюється через вказівник next; від last до first через вказівник prev, тому формування списку за правилом стеку від first до last – це та ж сама черга від last до first і навпаки.Як і в однонапрямлених списках над двонапрямленими виконують ті ж самі операції.
Оголошення структури списку може мати вигляд:
TYPE
list2=^el_list2;
el_list2=record
inf:integer;
next,prev:list2
END;
Формування списку.
writeln('введіть кількість елементів у списку');
readln(n);
first:=nil;
last:=nil;
for i:=1 to n do
begin
writeln('введіть елемент');
readln(a);
new(p);
p^.inf:=a;
if last=nil then last:=p;
p^.next:=first;
first^.prev:=p;
first:=p
end;
2. Перегляд. Здійснюється аналогічно, тільки може здійснюватися в обоз напрямках.
PROCEDURE RESIV;
BEGIN
p:=first;
while p^.next<>nil do
begin
write(p^.inf,' ');
p:=p^.next
end;
writeln(p^.inf,' ')
END;
3. Пошук.
p:=first;
writeln('введіть шуканий елемент');
readln(a);
i:=0;
while (p<>nil) do
begin
inc(k);
if p^.inf=a then
begin
i:=i+1;
writeln('під № ',k)
end;
p:=p^.next
end;
if i=0 then writeln ('немає')
else writeln ('кількість ',i)
3.Вставка перед на відмінну від однонапрямленого списку аналогічна вставці після з точністю переміни вказівників prev і next.
write('введіть елемент, після якого потрібно вставити новий');
readln(n);
write('введіть новий елемент');
readln(a);
p:=first;
while p<>nil do
begin
if p^.inf=n then
begin
new(q);
q^.next:=p^.next;
p^.next:=q;
q^.prev:=p
end;
q^.inf:=a;
p:=p^.next
end;
5. Вилучення. Як і в попередніх випадках видалення елементу не потребує складного пошуку із порівнянням через один елемент, як у однонапрямлених списках.
write('введіть елемент, який потрібно вилучити');
readln(a);
p:=first;
while p<>nil do
begin
if p^.inf=a then
begin
if p=first then
begin
first:=p^.next;
p^.prev:=nil
end
else
begin
if p^.next<>nil then
begin
p^.next^.prev:=p^.prev;
p^.prev^.next:=p^.next^.next
end
else
begin
p^.prev^.next:=nil
end;
end;
end
else
p^.prev^.next:=p;
p:=p^.next
end;
Тема: Бінарні дерева.
Особливим видом розгалужених списків є дерева. Особливістю таких динамічних структур даних є те, що кожен елемент має декілька вказівних полів (бінарні, тернарне, п-арні дерева).
На відмінну від двонапрямлених списків, дерева не мають лінійної структури. Підлеглість елементів має розгалужену структуру – це означає, що такі списки мають один верхній елемент – голову. Він має декілька підлеглих елементів, які в свою чергу мають декілька елементів, причому на будь-якому рівні всі вказівники повинні бути зв’язані з іншими елементами, якщо ж ні, то в таких випадках вони вказують в nil.
Доступ до елементів дерева здійснюється послідовно з вершини дерева через фіксований вказівник top. Елементи дерева, обидва вказівники яких зв’язані із підлеглими елементами, називають вузловими вершинами або гілками. Елементи дерева, обидва вказівники яких вільні, називаються листками або висячими вершинами. Елементи дерева, один з вказівників яких вільний, називаються напівисячими вершинами.
Шириною бінарного дерева називається кількість вузлів від крайнього лівого до крайнього правого елементу. Висотою бінарного дерева називається максимальна кількість рівнів елементів від вершини дерева до найдальшого листка.
Бінарні дерева заповнюються не довільним чином або у порядку слідування елементів, а за алгоритмом, який формує їх у вигляді впорядкованої структури.
В якості вершини дерева завжди розміщується перший по-порядку елемент. Кожен новий елемент дерева розміщується у ньому так, щоб він опинився лівіше від поточної вершини, якщо він менший від неї; і правіше, якщо він більший від неї.
Як видно з розглянутого алгоритму, структура бінарного дерева залежить від порядку введення елементів.
Оголошуються бінарні дерева подібно до лінійних списків, у вигляді вказівного типу на елемент дерева. Елемент дерева матиме три поля: інформаційне довільного типу і два вказівних відповідно на лівий і правий елементи.
USES CRT;
TYPE
bintree=^el_bintree;
el_bintree=record
left,right:bintree;
inf:integer;
END;
Дії, які можна проводити з бінарними деревами:
Формування.
Перегляд.
Пошук.
Встановлення ширини та висоти дерева.
Встановлення кількості вузлових вершин, листків та напівисячих вершин.
Доповнення новим елементом (операція вставки перед (чи після) не має змісту, оскільки будь-який елемент у дереві розміщується в строго визначеному йому місці).
Вилучення елемента із дерева.
Враховуючи, що сама структура дерева має рекурсивний характер, то всі програми, що реалізують відповідні операції теж будуть рекурсивними підпрограмами. Згідно із описаним вище алгоритмом формування бінарного дерева, рекурсивна процедура, що здійснює це, може мати вигляд:
PROCEDURE ZAPUS (var p:bintree;a:integer);
BEGIN
new(p);
p^.left:=nil;
p^.right:=nil;
p^.inf:=a;
END;
PROCEDURE ROZM(var q:bintree;a:integer);
BEGIN
if q^.inf<a then
begin
if q^.left<>nil then ROZM (q^.left,a)
else ZAPUS(q^.left,a);
end;
if q^.inf>a then
begin
if q^.right<>nil then ROZM(q^.right,a)
else ZAPUS(q^.right,a);
end;
END;
PROCEDURE INPUT;
BEGIN
top:=nil;
writeln('введіть кількість елементів');
readln(n);
for i:=1 to n do
begin
writeln('введіть елемент:');
readln(k);
if top=nil then ZAPUS(top,k)
else ROZM(top,k);
end;
END;
Враховуючи рекурсивність структури і впорядкованість елементів, вивід їх на екран здійснюватиме теж рекурсивна процедура за порядком зростання, за алгоритмом: