
- •Розрахункова робота
- •«Проблемно – орієнтоване програмування»
- •«Програмування червоно – чорних дерев»
- •1. Огляд літератури
- •1.1 Довідкові матеріали по мові с
- •1.2 Програмування дерев пошуку
- •1.3 Балансування червоно – чорних дерев
- •1.4 Аналіз інших методів організації баз даних
- •2. Формулювання задачі
- •3. Алгоритми розв’язування задачі
- •3.1 Загальний алгоритм написання програми
- •3.2 Алгоритми основних функцій
- •3.2.1 Алгоритм пошуку вузла
- •3.2.2 Алгоритм додавання вузла
- •3.2.3 Алгоритм видалення вузла
- •3.3 Алгоритм вирішення задачі балансування
- •3.3.1 Алгоритм балансування при додаванні вузла
- •3.3.2 Алгоритм балансування при видаленні вузла
- •4. Програмні реалізації алгоритму
- •4.1 Загальні характеристики програми
- •4.2 Призначення програми
- •4.3 Вхідна інформація
- •4.4 Результуюча інформація
- •4.5 Структура програми
- •4.6 Таблиця ідентифікаторів програми
- •4.7 Середовище реалізації програми
- •4.8 Технологія виконання та від лагодження програми
- •5. Інструкція користувачеві програми
- •6. Контрольні приклади та аналіз їх реалізації
- •Висновок
- •Література
- •Додатки (код програми)
4. Програмні реалізації алгоритму
4.1 Загальні характеристики програми
Ім’я програми: Rozraha_RBT
Виконавчий файл: Rozraha_RBT.exe
Програма створює і зчитує файли з розширенням: *.tr
Назви текстових файлів з кодом програми (*.cpp, *.h): Balanse_Fun_Add.cpp, Balanse_Fun_Delete.cpp, ERROES_messages.h, fun_prototupes.h, General_Fun.cpp, Item1_WorTree.cpp, Item2_Disk.cpp, Item3_msTrees.cpp, Item4_Else.cpp, main_many.cpp
Мова програмування: С
Розмір виконавчого файлу: 56 Кб
Розмір текстових файлів з кодом: 38 Кб
Загальна кількість рядків коду програми: 1436
4.2 Призначення програми
Програма призначена для створення і роботи з базами даних. Її особливістю являється те, що організація памяті баз даних у ній здійснюється за допомогою червоно –чорних дерев бінарного пошуку, це забезпечує швидке знаходження даних. Обмеженням являється те, що дана програма не надає можливості приєднувати дані до вузлів, вона оперує тільки з ключами, оскільки створена у формі шаблону бази даних.
4.3 Вхідна інформація
Вхідними даними являються числові дані, які сприймаються як ключі. Користувач отримує можливість введення команд (пунктів меню) і ключів з клавіатури, а також здійснити зчитування ключів з файлу який містить дані про дерево (ключі), з розширенням *.tr. Контроль введення здійснюється за допомогою функції scanf(), яка не дає можливості зчитувати символи, також ведеться контроль діапазонів введення числових даних і очищення потоку введення з метою запобігання зациклень конструкцій, які складаються з двох попередніх пунктів. Інтерфейс програми з користувачем являється консольним, з особливостями середовища.
4.4 Результуюча інформація
У програмі передбачені можливості виведення ключів різними обходами, також запис ключів дерева на диск і ручний обхід дерева, який дає можливість пересуватися по вузлах дерева. При цьому користувачу відображається висота поточного вузла, його ключ, колір і дані про нащадків. Це дає можливість перевіряти структуру дерева. Також передбачене обчислення і виведення максимальної і мінімальної висоти дерева, для контролю вірності балансування і інших потреб.
4.5 Структура програми
main_many.cpp – містить функцію main, а також функцію GetMainMenuItem, яка викликає діалог головного меню і передає у функцію main код вибору користувача, відповідно якому головна функція завершує виконання програми, або викликає головну функцію одного з підменю, яка знаходиться у своєму файлі меню.
fun_prototupes.h – основний заготовочний файл, що підключається до всіх файлів коду і містить оголошення бібліотек, прототипи структур, та макро константи, а також функції доступні усім файлам коду.
У основному заготовочному файлі відображені прототипи функцій з файлій, описано їх призначення, а також функції які являються недоступними для інших файлів і не використовуються ними за коментовані.
Прототипи структур вузла і даних:
struct node;
struct data;
typedef struct data
{
int key;
}DATA;
typedef struct node
{
int colour;
struct data *ddata;
struct node *left, *right;
}NODE;
General_Fun.cpp – файл, що містить загальні функції (вони описані нижче), які доступні усім файлам програми і викликафться їхніми внутрішніми функціями.
void AddNawElem (NODE** kor, NODE *nod, int key); //додає новий елемент з ключем <key>, <kor==nod>
void PrintTree1_Doun (NODE *kor); // видруковує дерево, верхній(прямий) обхід
void PrintTree2_Semetrial (NODE *kor); // видруковує дерево, симетричний обхід
int GetMaxH (NODE *kor); // повертає максимальну висоту
int GetMinH (NODE *kor); // повертає мінімальну висоту
void DeleteLifNode (NODE *kor); // видаляє листок
void DeleteTrea (NODE *kor); // видаляє все дерево, нижній обхід
NODE* FindNode(NODE *kor, int key); // шукає елемент у дереві, повертає адресу структури, //або NULL
int DeliteNode (NODE **mainkor ,NODE *kor, int key); // видаляє елемент з дерева, 0-при провалі, 1-при успіху
//void GetDad1AndDelete (NODE **dad, NODE **delite, NODE *kor, int key); // викликається DeliteNode
//void GetDad2AndChange (NODE **dad, NODE **change, NODE *kor, int key); // викликається DeliteNode
Balanse_Fun_Add.cpp – у цьому файлі знаходяться функції балансування при додаванні вузла до дерева, для інших файлів доступна тільки одна нижче наведена не закоментована функція, вона викликає інші внутрішні функції і викликається загальною функцією додавання елемента AddNawElem.
// функції балансування
void SetBalanseAddInBR (NODE **mainkor, int key); // основна функція що викоонує //балансування при додаванні елемента
////////////////////////////////////////////////////////////////////////
// балансування при додаванні нового елемента
//void RB_BalansIfAdd (NODE **mainkor, NODE *kor, int key, int status); // червоно-чорне //балансування при додаванні нового елемента
//void case_1 (NODE *n, NODE *p, NODE *g, NODE *u); // 1 - випадок, для ч-ч балансування //при додаванні
//void case_2 (NODE *n, NODE *p, NODE *g, NODE *u, NODE *gg); // 2 - випадок, для ч-ч //балансування при додаванні
//void case_3 (NODE *n, NODE *p, NODE *g, NODE *u, NODE *gg); // 3 - випадок, для ч-ч //балансування при додаванні
////////////////////////////////////////////////////////////////////////
// додаткові функції для повної перебудови дерева через впорядкований масив
//void SetBalanseRebildTree (NODE **kor); // 1 - головна
//void GetToMS (NODE *kor); // 2
//void SetMS (NODE **kor, int lp1, int rp2); //3
//void SetAdress (NODE **mainkor, NODE *kor, NODE *nawkor); //4
//////////////////////////////////////////////////////////////////////////
Balanse_Fun_Delete.cpp – аналогічно до попереднього файлу, тільки тут функції балансування при видаленні вузла з дерева, для інших файлів доступна тільки одна нижче наведена не закоментована функція, вона викликає інші внутрішні функції і викликається загальною функцією видалення елемента DeliteNode.
// col - колір вузла що видалили, key_ch - його ключ, key_dad - ключ його батька
void SetBalanseDeleteInBR (NODE **mainkor, int key_dad, int key_ch, int col); // основна //функція що викоонує балансування при відніманні елемента
//void RB_BalansIfDelete (NODE **mainkor, NODE *kor, int key_dad, int key_ch, int col); // //червоно-чорне балансування при відніманні нового елемента
//void case_1 (NODE *p, NODE *v, NODE *s, NODE *sl, NODE *sr, NODE *g);
//void case_2 (NODE *p, NODE *v, NODE *s, NODE *sl, NODE *sr, NODE *g);
//void case_3 (NODE *p, NODE *v, NODE *s, NODE *sl, NODE *sr, NODE *g);
//void case_4 (NODE *p, NODE *v, NODE *s, NODE *sl, NODE *sr, NODE *g);
//void case_5 (NODE *p, NODE *v, NODE *s, NODE *sl, NODE *sr, NODE *g);
Item1_WorTree.cpp – файл першого пункту меню, зовнішня функція Item1_WorTree викликається функцією main, здійснює аналогічні дії до функції main, тільки викликає внутрішні функції файлу, які у свою чергу викликають загальні функції і виконують певні дії. Усі наступні файли містять аналогічні підменю пунктів головного меню і мають одинакову структуру, тому їх опис здійснюватися не буде.
// 1 пункт <робота з деревом> головне меню
void Item1_WorTree (NODE **kor);
//void main ()
//void DialogAddNode (NODE **kor); // діалог введення нового елемента
//void DialogPrintTree (NODE *kor); // діалог роздруку дерева (у порядку зростання, //симетричний обхід)
//void DialogFindNode (NODE *kor); // діалог пошуку елеметта
//void DialogGroopData (NODE **kor); //опрацювання груп даних
Item2_Disk.cpp – дивитись відомості про файл Item1_WorTree.cpp
// 2 пункт <робота з диском> головного меню
void Item2_Disk (NODE **kor);
//int GetDiskMenyItem ();
//void OpenTreaFromDisk (NODE **kor); // відкриває діалог вибору файлу з даними для його //відкриття
//void SaveTreeOnDisk (NODE *kor); // зберігає дерево у файлі
Item3_msTrees.cpp– дивитись відомості про файл Item1_WorTree.cpp
// 3 пункт <робота з декількома деревами> головне меню
void Item3_msTrees ();
//int GetMSTreeManyItem ();
//void DialogCreaateNawTree (); // створення нового дерева
//void DialogChuseCurentTree (int status); // дії з деревами 1 - вибір поточного, 2 - //очищення, 3 - видалення
//void DialoOverVy (); // діалог роздруку дерев
//void DialogTwoTree (int status); // дія з двома деревами 1 - злиття, 2 - віднімання
//void AddTreeToTree (NODE **kor1, NODE *kor2); // додавання двох дерев, викликається //фцією DialogTwoTree
//void DeleteTreeToTree (NODE **kor1, NODE *kor2); // віднімання двох дерев, викликається //фцією DialogTwoTree
Item4_Else.cpp– дивитись відомості про файл Item1_WorTree.cpp
// 4пункт <додаткове> головне меню
void Item4_Else (NODE **kor);
//int GetElseManyItem();
//void DialogGetMaxH (NODE *kor); // діалог отримання максимальної висоти дерева
//void DdialogGetMinH (NODE *kor); // діалог отримання мінімальної висоти дерева
//void DialogVisitTree (NODE *kor, int status); // діалог ручного проходу по дереву 2 - //довідка, 1 - довідка+прохід
//void VisitTree (NODE *kor); // рекурсивна фція ручного проходу по дереве, викликається //фцією DialogVisitTree