Обговорення проекту бази даних
На цьому кроці ми розглянемо створення бази даних, що знаходиться в оперативній пам'яті.
Процес створення бази даних починається з етапу проектування бази. При цьому потрібно врахувати такі фактори:
- розмір бази даних;
- організацію елементів бази даних;
- способи роботи та змісту бази даних.
Використання баз даних, які у оперативної пам'яті (резидентних), цілком виправдано, якщо цяБДмає дуже великий обсяг.
Для початку необхідно задати початкові дані та створити саму базу. Потім настає черга системи управління базою даних (СУБД), орієнтованої на діалог з користувачем. Будь-яка система такого роду повинна містити як мінімум такі можливості:
- занесення до бази нових даних;
- видалення даних із бази;
- вибірка та виведення містяться у базі даних.
Ці вимоги передбачають наявність у системі меню, що представляє користувачеві можливість легко орієнтуватися при зверненні до стандартних функційСУБД, а також віконної системи, що дає чітке уявлення про доступні користувачеві засоби.
Обговорення проекту бази даних
Найкращий спосіб розпочати проектування програми – це намалювати її структурну схему (рис. 1).
Мал.1. Структурна схема резидентної БД
Вона показує, що модульМенюдозволяє користувачеві вибрати між чотирма модулями:process(1)для запису даних у базу,process(2)для видалення даних,process(3)для виведення даних на екран, іprocess(4)для виходу із системи.
Створення бази даних
Створимо футбольнуБД. Дані є інформацією про п'ятьфутболістів. Вони включають імена гравців, назви команд, номери, позиції, зростання, вага, кількість зіграних сезонів. Вся інформація, що використовується, наведена в таблиці 1.
| Єгор Тітов | Спартак | 9 | пз | 182 | 72 | 78 |
| Сергій Овчинніков | Локомотив | 1 | в | 188 | 74 | 82 |
| Дмитро Буликін | Динамо | 11 | н | 188 | 80 | 53 |
| Дмитро Лоськов | Локомотив | 9 | н | 180 | 78 | 102 |
| Дмитро Парфьонов | Спартак | 7 | пз | 174 | 70 | 77 |
Для роботи з нею необхідний предикат, що кодує інформацію. Відповідним є:
Прологвимагає, щоб усі твердження одного і того ж предикату були згруповані в одному місці. Відповідно до цієї вимоги група предикатуplayerзаписується у вигляді:
Зауважимо, що в тому випадку, коли об'єкти тверджень є рядками і починаються з великих літер, вони полягають у лапки. Також відзначимо, що зростання гравця задається у вигляді рядка, хоча він має на увазі числове значення; вБДяк число не використовується.
Наступною фазою створенняБДє завдання відповідних описів типів. Розділ програмиdomainsвиглядатиме так:
Предикати динамічної бази даних описуються розділ програмиdatabase. У нашому випадку потрібен лише один такий предикат:
Коли програма запускається на рахунок,затвердження динамічноїБДмістяться в оперативній пам'яті окремо від "звичайних" тверджень. (Це одна з причин того, що предикати динамічноїБДописуються у спеціальному розділі програми.) У цей моментБДповністю готова до роботи .
У розділіpredicatesслід описати всі інші предикати, які у програмі. Ці описи виглядають так:
Як раніше говорилося, на початку роботи програми необхідно занести в динамічнуБДпризначену для неї інформацію, що міститься в статичнійБД. Це завдання виконує предикатassert_database. Предикатclear_databaseпризначений для очищенняБДперед закінченням роботи програми.
Завданням предикатуerrorє реагування на введення неправильної вхідної інформації.
Предикатplayerпризначений для завдання початкового вмісту бази даних, тієї інформації, яка відображена в таблиці 1. Коли програма починає роботу, ця інформація посилається на затвердження предикатуdplayer.
Предикатdo_mbaseє основним правилом (модулем) програми. Він також є у цільовому затвердженні. Предикатmenuвизначає правило, яке здійснює інтерфейс з користувачем за допомогою меню. Предикатprocess(integer)визначає різні правила, що виконують всі можливі операції надБД.
Розділ програмиgoalмістить правилоdo_mbase.
Тепер можна узагальнити все сказане вище та визначити "скелет" нашої програмиБД. Тіла правил будуть визначені у розділі програми у розділі програмиclauses.
Написання програмних модулів
Після завершення стадії проектування можна приступити до стадіїреалізації проекту. Тепер нашим завданням є написання предикатних виразів та допоміжних правил, які будуть потрібні основним модулям.
1. Головний модуль програмиdo_mbaseє одночасно і метою програми:
Модуль засилає в базу інформацію із твердженьplayer, створює вікно, виводить меню та очищаєБДпісля закінчення роботи програми.
Вихідний вмістБДзадається за допомогою тверджень з використанням статичних предикатів. Правилом для занесення до бази цієї інформації є:
Цей предикат використовує метод відкату після невдачі для перебору всіх твердженьplayer.
Предикат очищення бази даних:
Так як об'єкти твердженьdplayerу цьому правилі не становлять інтересу, використовуються анонімні змінні.
Меню призначене для зручності користувача у виборі програмних функцій. Для забезпечення відповідного вимогам екранного простору створюється вікно на весь екран (25 рядків, 80 колонок). Модульmenuвиводить чотири доступні користувачеві опції:
Модульmenuв основному складається з предикатівwrite, які виводять на екран перелічені вище опції.
Звернімо увагу на техніку, використану для забезпечення повторних дзвінків модуляmenu. Якщо користувач введе число, не рівне 4 (4 викликає закінчення програми), підцільChoice=4стає неуспішною, що викликає відкат до предикатуrepeat.
2. Модуль для введення даних
Правилоprocess(1)призначене для занесення до бази даних. Цей модуль створює вікно для тексту, просить користувача ввести дані з клавіатури, зчитує їх і заносить уБДнове твердженняdplayer. Після цьогомодуль прибирає новостворене вікно і повертає керування головному меню.
Окреме, менше за розміром, вікно створюється для забезпечення діалогу з програмою. За предикатомmakewindow, що створює це вікно, йдуть предикатиwrite, readlnіreadint, які інформують користувача про те, які дані він має ввести, і зчитують ці дані з клавіатури:
Аналогічно за допомогоюwrite, readlnтаreadintвводяться номер гравця, його позиція, зростання, вага, стаж виступів. За предикатамиwrite, readlnіreadintслідує предикатassertz. Цей предикат містить нові твердженняdplayerслідом за вже наявними.
Щоб вводити дані українською мовою можна скористатися, наприклад, україніфікаторомПаскаляrkega.com, запустивши його до завантаженняПрологу. Перехід на українську та назад праву та лівуShift.
Об'єктами цього нового твердження є значення, надані зміннимP_name, T_name, P_numberтощо:
Останні рядки сигналізують про закінчення процесу введення та прибирають додаткове вікно.
3. Модуль для видалення даних
Призначенням модуляprocess(2)є видалення інформації з бази даних. Це правило, як і правилоprocess(1), створює своє власне вікно, запитує у користувача ім'я гравця і видаляє зБДтвердження, що містить інформацію про це гравець. Після очищення вікна керування знову передається головному меню.
Слідом за предикатами, що створюють вікно і зсувають його, йдуть предикати, які запитують ім'я гравця. Введене користувачем значення присвоюється змінноюP_name:
Наступна частина правила здійснює операцію видалення затвердженняБД, посилає коротке повідомлення про це користувачеві, чекає натискання ним довільної клавіші та прибирає з екрана додаткове вікно:
Для видалення з бази обраного користувачем твердження застосований предикатretract. Так як будь-яка інша інформація про гравця, крім його імені, не цікавить цю операцію, то на місці всіх інших об'єктів стоять анонімні змінні.
4. Модуль для вибірки даних
Призначенням модуляprocess(3)є пошук містяться в базі даних. Цей модуль, як і два вже розібрані, створює своє власне вікно, а потім запитує ім'я гравця. Якщо вБДзнаходиться твердження, що містить введене ім'я, модуль здійснює вибірку даних і виводить їх на екран у зручному форматі:
Предикатdplayerшукає потрібне затвердження в базі даних і вибирає рядкові та цілі значення за кожним запитуваним пунктом. Цілий ряд предикатівwriteпотім виводить отримані значення:
Якщо уБДнемає затвердження з введеним користувачем ім'ям гравця, програма видає повідомлення про помилку. Вікно для цього повідомлення повинне розташовуватись на видному місці, наприклад, у центрі екрана. Варіантprocess(3), що відповідає за видачу повідомлення про помилку, виглядає так:
Модульprocess(4)забезпечує нормальне закінчення сеансу роботи з базою даних. Цей модуль не створює власного вікна. Нове вікно тут зайве, оскільки повідомлення дуже короткі і вимагають багато місця на екрані. Модуль, однак, вимагає від користувача чіткої відповіді на запитання, чи він хоче закінчити роботу з програмою:
Зазначимо наявність у правилі предикатуfrontchar. Він успішний тільки в тому випадку, якщо відповідь користувача на запит програми починається злітериy. Якщо вводиться інша літера, предикат є неуспішним, тому відбувається відкат до предикату repeat модуля menu.
6. Модуль реакції на помилку
Акуратно написана програма має належним чином реагувати на допущені користувачем помилки під час введення. Якщо користувач введе число, менше 1 або більше 4, буде успішним одне з правил:
Футбольна база даних
Реалізацією наведеного проекту динамічної бази даних є програма "Футбольна база даних".
Мал.2. Результат роботи програмиpro63_1.pro
Кожен із фрагментів програми, спроектований та описаний у попередніх розділах розділу, займає відведене йому у програмі місце.
Вихідна інформація дляБДміститься на початку розділуclauses. Коли програма запускається на рахунок, підцільassert_databaseстворює затвердження dplayer, що містять такі ж дані, що і затвердження статичного предикатуplayer, і заносить ці твердження в динамічнуБД. Після цього можна додавати, видаляти чи переглядати дані, вибираючи відповідні опції меню.
На наступному кроці ми розглянемо прикладивикористання внутрішньої бази фактів.