Міністерство освіти
Російської Федерації b> p>
Хабаровський Державний
Технічний Університет
Кафедра: «Програмне забезпечення» p>
Курсова робота
На тему «Розробка бази даних, b> p>
що відбиває облік успішності студентів » b> p>
Виконав студент b>
гр. ПО-02 Самойленко П. Р. p>
Перевірив викладач b> p>
Белоусова Людмила p>
Василівна p>
Хабаровськ 2001
Зміст: p>
1. Завдання на розробку, постановка задачі. P>
2. Опис бази даних. P>
3. Опис засобів, що використовуються при створенні програми. P>
4. Початкові дані. P>
5. Інтерфейс програми. P>
6. Опис використовуваних змінних і процедур. P>
7. Можливості отриманого програмного продукту. P>
Постановка завдання. p>
Побудувати систему управління базою даних (надалі-СУБД), що відображає облік успішності студентів вузу. При цьому треба передбачити, що
дані можуть вноситися різними людьми. Побудувати базу даних, яка була б максимально гнучкою. У базі даних мають міститися дані про студентів,
оцінках, викладачів та предмети. p>
Опис бази даних. p>
База даних нормалізована і складається з чотирьох таблиць. Вона розбита на чотири таблиці, щоб бути максимально гнучкою. При цьому різні
таблиці можуть заповнюватись різними людьми, а потім об'єднуватися в одну загальну базу даних. Наприклад, таблицю про студентів заповнюють на кафедрі, на якій
вчитися студент, таблицю про викладача та предмети - на кафедрі цих викладачів, а оцінки ставить викладач. p>
Структура таблиць p>
Назва стовпця b>
Опис
Таблиця студентів (tt1)
T1
Номер студентського квитка
T2
Прізвище студента
T3
Назва
T4
По-батькові
T5
Стипендія
Таблиця предметів (tt2)
T1
Номер предмета
T2
Назва предмета
T3
Номер викладача
T4
Годинники
T5
Курс
Таблиця викладачів (tt3)
T1
Номер вчителя
T2
Прізвище вчителя
T3
Його ім'я
T4
По-батькові
T5
Дата прийняття викладача на роботу
Таблиця успішності (tt4)
T1
Код факту здачі навчальної дисципліни
T2
Оцінка
T3
Дата здачі
T4
Номер студентського квитка
T5
Код навчального предмета
Усі атрибути мають рядковий тип даних. Причому стовпець T1 у кожної з таблиць є первинним ключем, то є дані в ньому унікальні. P>
Зобразимо
зв'язок між таблицями: p>
Зв'язок цей здійснюється через унікальні поля кожної з таблиць. Зі схеми видно, що зв'язок між викладачами і
наприклад, студентами, здійснюється тільки через таблицю предметів. Така організація бази даних дозволяє уникнути дублювання даних. Наприклад, якщо
б у нас таблиця предметів була об'єднана з таблицею викладачів, то міг виповзти такий випадок - один викладач веде два предмети, отже
його прізвище, ім'я та по батькові будуть повторяться в таблиці двічі. А це вже називається надмірністю даних. P>
Опис
засобів, що використовуються при створенні програми b>
Даний програмний продукт працює в текстовому режимі, періодично міняючи колір символів, що виводяться за допомогою процедури textcolor (). Ця процедура належить модуля crt. Крім неї з цього модуля використовується ще два
процедури: clrscr - для отчистки екрану, та gotoxy - для переходу на задані координати екрану. p>
У програмі використовуються списки, записи, власні модулі. Які ж переваги дають використані кошти? P>
Списки дозволяють раціонально використовувати пам'ять комп'ютера і виділяти її динамічно, не займаючи її даремно. Правда при
використанні списків я помітив значне збільшення коду програми у порівнянні з випадком, коли б ми використовували масиви і запису. Але працювати з записами
набагато ефективніше, особливо при створенні баз даних. При роботі над даною СУБД я використав стандартні процедури для роботи з вказівниками: p>
New () - виділення пам'яті для змінної p>
Dispose () - Повернення пам'яті в купу. p>
Покажчик в моєму випадку вказує на наступний кортеж в даній таблиці. p>
Чотири таблиці зберігаються в динамічному списку. Список закінчується, як тільки наступний елемент приймає значення nil, тобто ні на що не вказує. P>
Записи допомагають структурувати дані, уникнути надмірності. p>
Модуль я використовую для передбачення в ньому типів і заповнення записів, значення яких будуть потім використані в основний
програмі. У цих записах я зберігаю масиви строк - строк меню. Таким чином, цей код не «захаращують» код основної програми. І додавати нові елементи в
меню набагато простіше - не треба переробляти всю програму. p>
Початкові дані b> p>
Для прикладу я ввів деякі дані і зберіг у файлі pasha. Ось ці дані, виведені за допомогою команди - « Зберегти.
в текст. файл b >»: p>
Студенти p>
+---------------------------------------------- ----------------------------+ p>
| Студентський | Прізвище | Ім'я | По батькові | Стипендія | p>
+--------------+--------------+--------------+- -------------+--------------| p>
| 3412 | Поляков | Анатолій | Олексійович | 54.50 | p>
| 3413 | Старова | Любов | Михайлівна | 17.00 | p>
| 3414 | Гриценко | Володимир | Миколайович | 0.00 | p>
| 3415 | Котенко | Анатолій | Миколайович | 0.00 | p>
| 3416 | Нагорний | Євген | Васильович | 25.50 | p>
+---------------------------------------------- ----------------------------+ p>
Предмети p>
+---------------------------------------------- ----------------------------+ p>
| Код предмета | Назва | Код викладач. | Час навчання | Курс | p>
+--------------+--------------+--------------+- -------------+--------------| p>
| 2001 | Фізика | 4001 | 34 | 1 | p>
| 2002 | Хімія | 4002 | 68 | 1 | p>
| 2003 | Математика | 4003 | 68 | 1 | p>
| 2004 | Філософія | 4005 | 17 | 2 | p>
| 2005 | Економіка | 4004 | 17 | 3 | p>
+---------------------------------------------- ----------------------------+ p>
Викладачі p>
+---------------------------------------------- ----------------------------+ p>
| Код викладач. | Прізвище | Ім'я | По батькові | Початок роботи | p>
+--------------+--------------+--------------+- -------------+--------------| p>
| 4001 | Викулина | Валентина | Іванівна | 01/04/1984 | p>
| 4002 | Костыркин | Олег | Володимирович | 01/09/1997 | p>
| 4003 | Казанка | Віталій | Володимирович | 01/09/1988 | p>
| 4004 | Позднякова | Любов | Олексіївна | 01/09/1998 | p>
| 4005 | Загарійчук | Ігор | Дмитрович | 10/05/1989 | p>
+---------------------------------------------- ----------------------------+ p>
Оцінки p>
+---------------------------------------------- ----------------------------+ p>
| Код здачі | Оцінка | Дата здачі | Студентський | Код предмета | p>
+--------------+--------------+--------------+- -------------+--------------| p>
| 1001 | 5 | 10/06/1999 | 3412 | 2001 | p>
| 1002 | 4 | 10/06/1999 | 3413 | 2003 | p>
| 1003 | 3 | 11/06/1999 | 3414 | 2005 | p>
| 1004 | 4 | 12/06/1999 | 3412 | 2003 | p>
| 1005 | 5 | 12/06/1999 | 3416 | 2004 | p>
+---------------------------------------------- ----------------------------+ p>
Ці дані будуть використовуватися в прикладах. p>
Інтерфейс
програми b>
Для того, щоб зрозуміти, що робить програма розглянемо її меню: p>
p>
На малюнку 1 представлено головне меню програми, яке з'являється при її запуску. Тут: p>
« Завантаження b>» - введення бази даних з типізований файлу. p>
« Зберегти. в тип. файл b> »- збереження бази даних у типізований файлі. p>
« Зберегти. в текст. файл b> »- збереження вибраної таблиці в текстовий файл. p>
« Перегляд b>» - перегляд даних таблиць. p>
« Коригування b>» - зміна записів таблиць. p>
« Сортування b>» - сортування записів за певним полю. p>
« Запити b>» - пошук даних в чотирьох таблицях, що відповідають заданій умові. p>
« Вихід b>» - вихід з програми. p>
Головне меню містить вкладені. Наприклад на 2 малюнку показано меню, що служить
для вибору таблиці (однієї з чотирьох). Вхід до нього може бути здійснений по різному. Тобто це меню ви будете проходити при перегляді даних, за
коригування та при збереженні в текстовий файл. Це меню коментарів не потребує. P>
При виборі «Коригування» ви перейдете до меню, показаному на малюнку 3. p>
« Додавання b>» - додавання нового кортежу в задану за допомогою попереднього меню таблицю. p>
« Видалення b>» - видалення рядки з таблиці, причому запис в таблиці шукається за одну колонку. p>
« Зміна b>» - зміна властивостей існуючої в базі даних рядка. p>
Остання підменю - це підменю запитів, на якому треба зупинитися детальніше. Розглянемо малюнок: p>
«Знайти оцінку» - знайти оцінку студента за його прізвища і предмету, який він здавав. p>
«Хто приймав іспит» - прізвище викладача, який брав даний предмет. p>
«Знайти розмір стипендії» - розмір стипендії обраного студента. p>
«Висновок з оцінки» - показати всіх студентів, які отримали дану оцінку. p>
«Дата здачі іспиту» - знайти дати, коли приймався даний предмет. p>
У запитах використовуються реальні назви предметів, прізвища студентів, а не їх номери (для студентів наприклад номер
відповідає номеру студентського квитка). p>
Більше в програмі меню такого типу немає, але є багато рядкового введення,
наприклад виконаємо запит з пошуком оцінок. Після запиту екран буде виглядати так (шукали четверочніков): p>
Результат запиту відображається червоним кольором. p>
Опис використовуваних процедур. b> p>
У
додатку використовуються як глобальні, так і локальні змінні. До
глобальним змінним відносяться:
1) names, namer: string [10] - рядкові змінні, які винесені в глобальні, щоб зробити програму більш
компактною. Інакше б у різних процедурах треба було вводити аналогічні типи даних, а так можна обійтися лише парою глобальних змінних. P>
2) key, kr: char - символьні змінні. У змінної key зберігається код натиснутою клавіші. А в
змінної kr знаходиться поточний стан зірочки. Зірочка буде розглянута нижче. P>
3) tek, i, j, izm: integer - цілочисельні змінні. З них i і j-циклічні, тимчасові
змінні. Tek та izm показують, яке меню активно у поточний момент. Вони допомагають зрозуміти програмі від якого меню до якого
перейшли, тобто допомагає відновити послідовність дій. p>
4) exist, vfile, issor: boolean - Логічні змінні. Exist - служить для виходу з
програми. Vfile - дозволяє пускати одну процедуру двома шляхами - або виводити дані на екран,
або у файл. Issor - показує меню вибору таблиць, що наступним кроком повинна бути сортування
даної таблиці. p>
5) nast: pered - типізований змінна, в якій зберігаються рядка поточного меню. Опис типу pered мається на модулі: p>
pered = record p>
st: array [1 .. 12] of string; p>
m: byte; (кількість рядків у меню) p>
end; p>
temr, tt1, tt2, tt3, tt4: cc - Таблиці бази даних. Тут tt1 - таблиця з даними про
студентів, tt2 - предмети, tt3 - викладачі, tt4 - оцінки (успішність). Temr - тимчасова таблиця. Усі ці змінні є динамічними списками. Вони
описані у файлі tips.pas: p>
tabl2 = record (Сама таблиця) p>
t1, t2, t3, t4, t5: string [12]; (Складається з рядків) p>
end; p>
cc = ^ tab; p>
tab = record (Створення динамічного списку) p>
tabl: tabl2; p>
sled: cc; p>
end; p>
p>
Програма
відповідає на те, яку клавішу натиснув користувач і передає управління
процедурі main. Процедура readkey використовується в основному блоці програми. Для роботи з
керуючими клавішами використовуються їх коди в таблиці ISCII. Тут:
80 - курсор вгору p>
72 - курсор вниз p>
27 - ESC p>
13 - Enter p>
При натисканні на клавішу «Введення» управління передається продцедуре main. При цьому використовуються глобальні змінні. P>
У процедурі main управління переходить до підпрограмі, згідно поточному меню, але деколи треба знати звідки був
здійснено вхід. Як я вже говорив, зайти в меню вибору таблиць можна по різному. Все меню мають різні заголовки, які і використовуються для їх
ідентифікації. При натисканні на кнопку « Вихід b>», цього стає початкове меню. P>
Інтерфейсна частина програми складається з трьох процедур: p>
procedure menus (m: pered; max: byte); (Висновок меню) p>
begin p>
clrscr; p>
For i: = 1 to max do begin
if i = 1 then begin p>
textcolor (1); gotoxy (9,2); write (m.st [i ]); p>
end p>
else begin p>
if i = 2 then textcolor (9) p>
else textcolor (3); p>
gotoxy (8, i +3); write (m.st [i ]); p>
end; p>
end; p>
end; p>
За допомогою цієї процедури на екрані змінюються меню. Потрібно врахувати, що спочатку ми знаємо, з склоку рядків складається кожне
меню, що спрощує завдання. Заголовок і зміст меню пишуться різними кольорами. Зміна кольору символів, що виводяться йде за допомогою команди textcolor, параметром якому є
зумовлена константа. p>
Наступна процедура: p>
procedure krutis; (Зірочка поруч з активним елементом) p>
begin p>
textcolor (14); p>
if kr = '/' then kr :='-' p>
else if kr = '-' then kr :='' p>
else if kr =''then kr :='|' p>
else kr :='/'; p>
gotoxy (6, tek 3); write (kr); p>
textcolor (3); p>
end; p>
Ця процедура працює таким чином - звернення до неї йде з основного блоку програми, в якому стоїть нескінченний цикл. На екрані
відображається щось схоже на бенгальська вогонь. Це досягається шляхом послідовного виводу на одному і тому ж місці символів:, |, /, -. У
змінної tek у нас міститься номер активної рядки, а щодо неї ми і повинні поставити зірочку. p>
Наступна процедура: p>
procedure ramka (ch: char); (переміщення покажчика) p>
begin p>
gotoxy (6, tek 3); Writeln ( ''); p>
textcolor (3); gotoxy (8, tek 3); write (nast.st [tek ]); p>
if ch = '+' then tek: = tek 1 p>
else tek: = tek-1; p>
if tek = 1 then tek: = nast.m p>
else if tek = nast.m 1 then tek: = 2; p>
key: = # 0; p>
textcolor (9); gotoxy (8, tek 3); write (nast.st [tek ]); p>
krutis; p>
end; p>
Дана процедура має параметр символьного типу. За змістом ch визначається - вгору або вниз зрушила активна рядок. Звернення до цієї
процедурі йде з основного блоку програми. Більше процедур такого роду немає (до всіх інших процедур звернення йде з процедури main). P>
Ця процедура затирає елемент, який був активний перед цим кольором за замовчуванням (блакитним) і пере попереднє положення
зірочки. Після цього виходячи зі значення ch змінюється значення tek і виділяється елемент, на який було здійснено перехід. У
підпрограмі вставлені дві умови: p>
if tek = 1 then tek: = nast.m p>
else if tek = nast.m 1 then tek: = 2; p>
Вони спрацьовують коли активним є верхній елемент меню і користувач натиснув кнопку вгору, тоді поточної стає
останній рядок, і навпаки - поточний рядок є останньою, а користувач натиснув кнопку вниз, тоді активної стане перший рядок активного
меню. p>
Процедури наступного типу здійснюють завантаження і вивантаження даних з файлу. Я не буду тут наводити повний текст
процедур, тому що його можна подивитися у додатку. Читання здійснюється за допомогою readetip, а
запис - writetip. В цих процедурах використовуються глобальні змінні. Завантаження йде за допомогою
таблиць tt1, tt2, tt3, tt4. Під час роботи користувач працює як би з одним файлом, хоча реально кожна з таблиць зберігається в свій файл. При запиті користувач
вводить назва файлу, а потім на цей титул додається ліворуч цифра - 1, 2, 3 або 4. Наприклад, якщо при збереженні в типізований файл імені зберігається
файлу присвоїти значення pasha, то таблиця tt1 буде збережена у файлі 1pasha, tt2 - 2pasha, tt3 - 3pasha, tt4 - 4pasha. У разі вивантаження з файлу
присвоєння імен йде таким же чином. Для збереження в текстовий файл використовується процедура tabl11 (t: integer; rab: cc), де rab - зберігається таблиця, а t - допомагає знайти заголовки?? толбцов поточної таблиці. Результат
виконання цієї процедури можна подивитися вище, де показані таблиці первинних даних. Для виведення вмісту таблиці на екран використовується
процедура tabl1 (t: integer; rab: cc; yd: boolean), дія якої аналогічно попередньої, тільки додається параметр yd, від якого залежить, чи потрібно затирати таблицю відразу або вона
повинна повисіти на екрані, поки користувач не ввів будь-які дані. Наприклад при видаленні записів з
таблиці, користувачеві буде зручніше, якщо він буде зміст таблиці перед очима. Наприклад покажемо зміст таблиці студентів, які будуть
виведені після натискання на кнопку «Перегляд»: p>
Наступна процедура - obrabotka (iz, t: integer; var rab: cc). Ця процедура викликається при коригуванні записів. Через параметр
iz процедура вибирає шлях подальшого ходу. Тобто чи треба додати запис, змінити або видалити.
Параметр rab - це таблиця, яка передається в процедуру, і параметр var показує, що дану таблицю можна
змінювати безпосередньо з процедури. p>
У ній використовуються локальні змінні - p>
dlud: string; p>
bis: boolean; p>
tems, temr, tem: cc; p>
Тут всі змінні типу cc - тимчасові, dlud служить для введення даних, а bis показує, здійснимо чи
обрану дію чи ні. p>
Продцедура sort (iz, t: integer; var rab: cc) здійснює сортування записів в обраній таблиці по обраному полю. Її
робота і параметри з змінними аналогічні попередньої процедури. p>
При запитах виконується процедура zapros (num: integer), де через параметр num передається, який саме запит повинен виконуватися. Потім
через умова case йде обробка запитів. Як показано на схемі взаємодії таблиць, щоб перейти
від студентів до викладачів треба пройти через таблицю оцінок. Зв'язок між таблицями здійснюється за
унікальним полях. Наприклад для знаходження оцінки студента треба спочатку з таблиці студентів знайти номер його студентського, а потім знайти номер здаваного
предмета з таблиці, а вже після цього, використовуючи отримані номери, знайти з таблиці успішності отриману студентом оцінку. Тобто зв'язок йде за трьома
таблиць. У запитах я намагався якомога більше показати можливості моєї бази даних. На останньому малюнку показаний один із запитів і результат його
виконання. Можливість створення гнучких запитів є найважливішим завданням програмування баз даних. P>
Можливості
отриманого b>
програмного продукту b> p>
Таким чином ми побудували гнучку модель бази даних, в якій легко створити потрібний запит, дані представлені в зручному для
користувача вигляді. Інтерфейс програми побудований без надлишків і налаштований на максимальну зручність користувача. Програма дозволяє заповнювати базу даних
одночасно декількома користувачами, кожен з яких буде заповнювати свою таблицю. Так як програма працює з динамічними списками, то вона швидка і
дозволяє уникнути надмірності даних у таблицях. p>
Текст програми Kurs.pas p>
program Delphins; p>
uses crt, tips; p>
var names, namer: string [10]; p>
key, kr: char; p>
tek, i, j, izm: integer; p>
exist, vfile, issor: boolean; p>
nast: pered; p>
temr, tt1, tt2, tt3, tt4: cc; p>
outf: file of tabl2; p>
procedure menus (m: pered; max: byte); (Висновок меню) p>
begin p>
clrscr; p>
For i: = 1 to max do begin p>
if i = 1 then begin p>
textcolor (1); gotoxy (9,2); write (m.st [i ]); p>
end p>
else begin p>
if i = 2 then textcolor (9) p>
else textcolor (3); p>
gotoxy (8, i +3); write (m.st [i ]); p>
end; p>
end; p>
end; p>
procedure krutis; (Зірочка поруч з активним елементом) p>
begin p>
textcolor (14); p>
if kr = '/' then kr :='-' p>
else if kr = '-' then kr :='' p>
else if kr =''then kr :='|' p>
else kr :='/'; p>
gotoxy (6, tek 3); write (kr); p>
textcolor (3); p>
end; p>
procedure ramka (ch: char); (переміщення покажчика) p>
begin p>
gotoxy (6, tek 3); Writeln ( ''); p>
textcolor (3); gotoxy (8, tek 3); write (nast.st [tek ]); p>
if ch = '+' then tek: = tek 1 p>
else tek: = tek-1; p>
if tek = 1 then tek: = nast.m p>
else if tek = nast.m 1 then tek: = 2; p>
key: = # 0; p>
textcolor (9); gotoxy (8, tek 3); write (nast.st [tek ]); p>
krutis; p>
end; p>
procedure tabl11 (t: integer; rab: cc); (Вивід таблиці у файл) p>
var ooutf: text; p>
tem: cc; p>
begin p>
clrscr; p>
writeln ( 'Введіть ім'я файлу'); p>
readln (names); p>
assign (ooutf, names); p>
rewrite (ooutf); p>
writeln (ooutf, menu2.st [t ]); p>
writeln (ooutf ,'+----------------------------------------- ---------------------------------+'); p>
writeln (ooutf ,'|', mm [t-1, 1]: 14 ,'|', mm [t-1, 2]: 14 ,'|', mm [t-1, 3]: 14 ,'|', mm [t-1, 4]: 14 ,'|', mm [t-1, 5]: 14 ,'|'); p>
writeln (ooutf ,'+--------------+--------------+----------- ---+--------------+--------------|'); p>
tem: = rab; p>
while tem <> nil do p>
begin p>
writeln (ooutf ,'|', tem ^. tabl.t1: 14 ,'|', tem ^. tabl.t2: 14 ,'|', tem ^. tabl.t3: 14 ,'|', tem ^. tabl.t4: 14, p>
'|', tem ^. tabl.t5: 14 ,'|'); p>
tem: = tem ^. sled; p>
end; p>
writeln (ooutf ,'+----------------------------------------- ---------------------------------+'); p>
close (ooutf); p>
nast: = menu1; p>
menus (nast, nast.m); p>
tek: = 2; p>
end; p>
procedure tabl1 (t: integer; rab: cc; yd: boolean); (Вивід таблиці на екран) p>
var tem: cc; p>
begin p>
clrscr; p>
writeln (menu2.st [t ]); p>
writeln ('+------------------------------------------- -------------------------------+'); p>
writeln ('|', mm [t-1, 1]: 14 ,'|', mm [t-1, 2]: 14 ,'|', mm [t-1, 3]: 14, '|', mm [t-1, 4]: 14 ,'|', mm [t-1, 5]: 14 ,'|'); p>
writeln ('+--------------+--------------+------------- -+--------------+--------------|'); p>
tem: = rab; p>
while tem <> nil do p>
begin p>
writeln ('|', tem ^. tabl.t1: 14 ,'|', tem ^. tabl.t2: 14 ,'|', tem ^. tabl.t3: 14 ,'|', tem ^ . tabl.t4: 14, p>
'|', tem ^. tabl.t5: 14 ,'|'); p>
tem: = tem ^. sled; p>
end; p>
writeln ('+------------------------------------------- -------------------------------+'); p>
if not yd then begin p>
readln; p>
nast: = menu1; p>
menus (nast, nast.m); p>
tek: = 2; p>
end; p>
yd: = false; p>
end; p>
procedure sort (iz, t: integer; var rab: cc); (Сортування по полю) p>
var po: integer; p>
te1, te2, tem: cc; p>
str1, str2: string; p>
ttrtt: tabl2; p>
begin p>
tabl1 (tek, rab, true); p>
writeln ( 'Введіть номер стовпчика по якому треба відсортувати дані'); p>
readln (po); p>
te1: = rab; p>
while te1 <> nil do begin p>
te2: = te1 ^. sled; p>
while te2 <> nil do begin p>
case po of p>
1: begin str1: = te1 ^. tabl.t1; str2: = te2 ^. tabl.t1; end; p>
2: begin str1: = te1 ^. tabl.t2; str2: = te2 ^. tabl.t2; end; p>
3: begin str1: = te1 ^. tabl.t3; str2: = te2 ^. tabl.t3; end; p>
4: begin str1: = te1 ^. tabl.t4; str2: = te2 ^. tabl.t4; end; p>
5: begin str1: = te1 ^. tabl.t5; str2: = te2 ^. tabl.t5; end; p>
end; p>
if str1> str2 then begin p>
ttrtt: = te1 ^. tabl; p>
te1 ^. tabl: = te2 ^. tabl; p>
te2 ^. tabl: = ttrtt; p>
end; p>
te2: = te2 ^. sled; p>
end; p>
te1: = te1 ^. sled; p>
end; p>
tabl1 (tek, rab, false); p>
end; p>
procedure obrabotka (iz, t: integer; var rab: cc); (Обробка записів) p>
var dlud: string; p>
bis: boolean; p>
tems, temr, tem: cc; p>
begin p>
clrscr; p>
if iz = 1 then begin (додавання запису) p>
if rab <> nil then begin p>
tem: = rab; p>
while tem ^. sled <> nil do tem: = tem ^. sled; p>
new (tem ^. sled); p>
tem: = tem ^. sled; p>
end p>
else begin p>
new (rab); p>
tem: = rab; p>
end; p>
writeln (mm [t, 1]); readln (tem ^. tabl.t1); p>
writeln (mm [t, 2]); readln (tem ^. tabl.t2); p>
writeln (mm [t, 3]); readln (tem ^. tabl.t3); p>
writeln (mm [t, 4]); readln (tem ^. tabl.t4); p>
writeln (mm [t, 5]); readln (tem ^. tabl.t5); p>
tem ^. sled: = nil; p>
tem: = rab; p>
izm: = 0; p>
nast: = menu1; p>
menus (nast, nast.m); p>
tek: = 2; iz: = 0; p>
end p>
else if iz = 2 then begin (Видалення запису) p>
tems: = rab; p>
tabl1 (tek, rab, true); p>
writeln ( 'Введіть унікальний номер'); readln (dlud); p>
bis: = true; p>
if rab ^. tabl.t1 = dlud then begin p>
rab: = rab ^. sled; p>
bis: = false; p>
end p>
else begin p>
while tems <> nil do begin p>
if tems ^. sled ^. tabl.t1 = dlud then begin p>
tem: = tems ^. sled; p>
tems ^. sled: = tems ^. sled ^. sled; p>
dispose (tem); p>
bis: = false; p>
break; p>
end; p>
tems: = tems ^. sled; p>
end; p>
end; p>
if bis then writeln ( 'Даною запису не виявлений'); p>
nast: = menu1; p>
menus (nast, nast.m); p>
tabl1 (tek, rab, false); p>
izm: = 0; p>
tek: = 2; p>
end p>
else if iz = 3 then begin (зміна даних) p>
tems: = rab; p>
tabl1 (tek, rab, true); p>
writeln ( 'Введіть унікальний номер'); readln (dlud); p>
bis: = true; p>
while tems <> nil do begin p>
if tems ^. tabl.t1 = dlud then begin p>
writeln (mm [t, 1]); readln (tems ^. tabl.t1); p>
writeln (mm [t, 2]); readln (tems ^. tabl.t2); p>
writeln (mm [t, 3]); readln (tems ^. tabl.t3); p>
writeln (mm [t, 4]); readln (tems ^. tabl.t4); p>
writeln (mm [t, 5]); readln (tems ^. tabl.t5); p>
break; p>
end; p>
tems: = tems ^. sled; p>
end; p>
if bis then writeln ( 'Даною запису не виявлений'); p>
nast: = menu1; p>
menus (nast, nast.m); p>
tabl1 (tek, rab, false); p>
izm: = 0; tek: = 2; p>
end; p>
end; p>
procedure zapros (num: integer); (Запити) p>
var str1, str2, str3: string; p>
tem1, tem2: cc; p>
nay: boolean; p>
zz: tabl2; p>
begin p>
clrscr; p>
nay: = false; p>
case num of p>
2: begin (Знайти оцінку) p>
tem1: = tt1; p>
writeln ( 'Введіть прізвище'); readln (str1); p>
writeln ( 'Введіть назву предмета'); readln (str2); p>
while tem1 <> nil do begin p>
if tem1 ^. tabl.t2 = str1 then begin str1: = tem1 ^. tabl.t1; break; end; p>
tem1: = tem1 ^. sled; p>
end; p>
tem1: = tt2; p>
while tem1 <> nil do begin p>
if tem1 ^. tabl.t2 = str2 then begin str2: = tem1 ^. tabl.t1; break; end; p>
tem1: = tem1 ^. sled; p>
end; p>
tem1: = tt4; p>
while tem1 <> nil do begin p>
if ((tem1 ^. tabl.t5 = str2) and (tem1 ^. tabl.t4 = str1)) then begin p>
textcolor (red); p>
writeln ( 'Оцінка цього студента-', tem1 ^. tabl.t2); p>
nay: = true; break; p>
end; p>
tem1: = tem1 ^. sled; p>
end; p>
end; p>
3: begin (Викладач) p>
writeln ( 'Виїдемо назва предмету'); p>
readln (str1); p>
tem1: = tt2; p>
while tem1 <> nil do begin p>
if tem1 ^. tabl.t2 = str1 then begin str1: = tem1 ^. tabl.t3; break; end; p>
tem1: = tem1 ^. sled; p>
end; p>
tem1: = tt3; p>
while tem1 <> nil do begin p>
if tem1 ^. tabl.t1 = str1 then begin p>
textcolor (red); p>
writeln ( 'Викладач-'); p>
with tem1 ^. tabl do write ( '', t2, ',', t3, ',', t4); p>
nay: = true; break; p>
end; p>
tem1: = tem1 ^. sled; p>
end; p>
end; p>
4: begin (Знайти розмір стипендії) p>
writeln ( 'Введіть прізвище студента'); p>
readln (str1); p>
tem1: = tt1; p>
while tem1 <> nil do begin p>
if tem1 ^. tabl.t2 = str1 then begin p>
textcolor (red); p>
writeln ( 'Стипендія-', tem1 ^. tabl.t5); p>
nay: = true; break; p>
end; p>
tem1: = tem1 ^. sled; p>
end; p>
end; p>
5: begin (Виведення всіх студентів з обраною оцінкою) p>
writeln ( 'Введіть оцінку'); p>
readln (str1); p>
tem1: = tt4; tem2: = tt1; p>
textcolor (red); p>
while tem1 <> nil do begin p>
if tem1 ^. tabl.t2 = str1 then begin p>
str2: = tem1 ^. tabl.t4; p>
while tem2 <> nil do begin p>
if tem2 ^. tabl.t1 = str2 then begin p>
with tem2 ^. tabl do p>
writeln ( 'Студент-', t3, '', t4, '', t2); p>
nay: = true; p>
end; p>
tem2: = tem2 ^. sled; p>
end; p>
end; p>
tem2: = tt1; tem1: = tem1 ^. sled; p>
end; p>
end; p>
6: begin (Знайти дату здачі предмета) p>
writeln ( 'Введіть назву предмета'); p>
readln (str1); p>
tem1: = tt2; p>
while tem1 <> nil do begin p>
if tem1 ^. tabl.t2 = str1 then begin str1: = tem1 ^. tabl.t1; break; end; p>
tem1: = tem1 ^. sled; p>
end; p>
tem1: = tt4; p>
while tem1 <> nil do begin p>
if tem1 ^. tabl.t5 = str1 then begin p>
textcolor (red); p>
writeln ( 'Дата здачі-', tem1 ^. tabl.t3); p>
nay: = true; p>
end; p>
tem1: = tem1 ^. sled; p>
end; p>
end; p>
end; p>
textcolor (red); p>
if not nay then writeln ( 'Запит нездійсненний'); p>
textcolor (3); readln; p>
nast: = menu1; menus (nast, nast.m); p>
tek: = 2; p>
end; p>
procedure writetip (temr: cc); p>
begin p>
clrscr; p>
write ( 'Введіть ім'я файлу'); p>
writeln ( 'в якому хочете зберегти дані'); p>
readln (names); p>
for i: = 1 to 4 do begin p>
if temr <> nil then begin temr: = nil; end; p>
case i of p>
1: begin temr: = tt1; namer: = '1 '+ names; end; p>
2: begin temr: = tt2; namer: = '2 '+ names; end; p>
3: begin temr: = tt3; namer: = '3 '+ names; end; p>
4: begin temr: = tt4; namer: = '4 '+ names; end; p>
end; p>
assign (outf, namer); rewrite (outf); p>
while temr <> nil do begin p>
write (outf, temr ^. tabl); p>
temr: = temr ^. sled; p>
end; p>
CLOSE (outf); p>
end; p>
nast: = menu1; menus (nast, nast.m); tek: = 2; p>
end; p>
procedure readtip (temr: cc); p>
var tems: cc; p>
begin p>
clrscr; p>
write ( 'Введіть ім'я файлу'); p>
writeln ( 'з якого треба взяти дані'); readln (names); p>
for i: = 1 to 4 do begin p>
if temr <> nil then begin temr: = nil; end; p>
if tems <> nil then begin tems: = nil; end; p>
case i of p>
1: begin new (tt1); temr: = tt1; namer: = '1 '+ names; end; p>
2: begin new (tt2); temr: = tt2; namer: = '2 '+ names; end; p>
3: begin new (tt3); temr: = tt3; namer: = '3 '+ names; end; p>
4: begin new (tt4); temr: = tt4; namer: = '4 '+ names; end; p>
end; p>
assign (outf, namer); reset (outf); p>
if eof (outf) then begin p>
case i of p>
1: begin dispose (tt1); tt1: = nil; end; p>
2: begin dispose (tt2); tt2: = nil; end; p>
3: begin dispose (tt3); tt3: = nil; end; p>
4: begin dispose (tt4); tt4: = nil; end; p>
end; p>
end p>
else begin p>
tems: = temr; p>
while temr <> nil do begin p>
if eof (outf) then break; p>
read (outf, temr ^. tabl); p>
if eof (outf) then break; p>
new (temr ^. sled); p>
temr: = temr ^. sled; p>
end; p>
temr ^. sled: = nil; p>
case i of p>
1: tt1: = tems; p>
2: tt2: = tems; p>
3: tt3: = tems; p>
4: tt4: = tems; p>
end; p>
end; p>
CLOSE (outf); p>
end; p>
nast: = menu1; menus (nast, nast.m); tek: = 2; p>
end; p>
procedure main; p>
begin p>
key: = # 0; p>
if nast.st [1] = menu1.st [1] then begin (Якщо меню - основне) p>
case tek of p>
2: readtip (temr); p>
3: writetip (temr); p>
4,5,7: begin p>
nast: = menu2; menus (nast, nast.m); p>
if tek = 7 then issor: = true; p>
if tek = 4 then vfile: = true p>
else if tek = 5 then vfile: = false; p>
tek: = 2; p>
end; p>
6: begin p>
nast: = menu3; menus (nast, nast.m); tek: = 2; p>
end; p>
8: begin p>
nast: = menu4; menus (nast, nast.m); tek: = 2; p>
end; p>
9: begin p>
exist: = true; p>
end; p>
end; p>
end p>
else if nast.st [1] = menu3.st [1] then begin (Якщо поточне меню-menu3) p>
case tek of p>
2,3,4: begin p>
izm: = tek-1; p>
nast: = menu2; menus (nast, nast.m); tek: = 2; p>
end; p>
5: begin p>
nast: = menu1; p>
menus (nast, nast.m); tek: = 2; p>
end; p>
end; p>
end p>
else if nast.st [1] = menu4.st [1] then begin (Якщо поточне меню-menu4) p>
case tek of p>
2,3,4,5,6: zapros (tek); p>
7: begin p>
nast: = menu1; p>
menus (nast, nast.m); tek: = 2; p>
end; p>
end; p>
end p>
else if nast.st [1] = menu2.st [1] then begin (Якщо поточне меню-menu2) p>
if izm> 0 then begin p>
case tek of p>
2: obrabotka (izm, tek-1, tt1); p>
3: obrabotka (izm, tek-1, tt2); p>
4: obrabotka (izm, tek-1, tt3); p>
5: obrabotka (izm, tek-1, tt4); p>
6: begin p>
nast: = menu1; menus (nast, nast.m); izm: = 0; tek: = 2; p>
end; p>
end; p>
end p>
else if issor = true then begin p>
issor: = false; p>
case tek of p>
2: sort (izm, tek-1, tt1); p>
3: sort (izm, tek-1, tt2); p>
4: sort (izm, tek-1, tt3); p>
5: sort (izm, tek-1, tt4); p>
6: begin p>
nast: = menu1; menus (nast, nast.m); izm: = 0; tek: = 2; p>
end; p>
end; p>
end p>
else begin p>
case tek of p>
2: if vfile then tabl11 (tek, tt1) p>
else tabl1 (tek, tt1, false); p>
3: if vfile then tabl11 (tek, tt2) p>
else tabl1 (tek, tt2, false); p>
4: if vfile then tabl11 (tek, tt3) p>
else tabl1 (tek, tt3, false); p>
5: if vfile then tabl11 (tek, tt4) p>
else tabl1 (tek, tt4, false); p>
6: begin p>
nast: = menu1; menus (nast, nast.m); izm: = 0; tek: = 2; p>
end; p>
end; p>
end; p>
end; p>
end; p>
begin p>
clrscr; p>
textBackground (black); p>
tek: = 2; kr :='-'; p>
exist: = false; p>
nast: = menu1; menus (nast, nast.m); p>
while 1> 0 do begin p>
if keypressed then key: = readkey; p>
case key of p>
# 80: ramka ('+'); p>
# 72: ramka ('-'); p>
# 27: exist: = true; p>
# 13: main; p>
end; p>
if exist then exit; p>
krutis; p>
end; p>
end. p>
Текст модуля Tips.pas p>
Unit tips; p>
interface p>
type p>
pered = record p>
st: array [1 .. 12] of string; p>
m: byte; p>
end; p>
tabl2 = record p>
t1, t2, t3, t4, t5: string [12]; p>
end; p>
cc = ^ tab; p>
tab = record p>
tabl: tabl2; p>
sled: cc; p>
end; p>
var p>
menu1, menu2, menu3, menu4: pered; p>
mm: array [1 .. 5,1 .. 5] of string [50]; p>
implementation p>
begin p>
with menu1 do begin p>
st [1]: = 'БАЗА ДАНИХ'; p>
st [2]: = "ЗАВАНТАЖЕННЯ"; p>
st [3]: = 'Зберегти. в тип. файл '; p>
st [4]: = 'Зберегти. в текст. файл '; p>
st [5]: = 'Перегляд'; p>
st [6]: = 'Коректування'; p>
st [7]: = 'Сортування'; p>
st [8]: = 'Запити'; p>
st [9]: = 'Вихід'; p>
m: = 9; p>
end; p>
mm [1,1]: = 'Студентський'; p>
mm [1,2]: = 'Прізвище'; p>
mm [1,3]: = 'Назва'; p>
mm [1,4]: = 'По батькові'; p>
mm [1,5]: = 'Стипендія'; p>
mm [2,1]: = 'Код предмета'; p>
mm [2,2]: = 'Назва'; p>
mm [2,3]: = 'Код викладач .'; p>
mm [2,4]: = 'Час навчання'; p>
mm [2,5]: = 'Курс'; p>
mm [3,1]: = 'Код викладач .'; p>
mm [3,2]: = 'Прізвище'; p>
mm [3,3]: = 'Назва'; p>
mm [3,4]: = 'По батькові'; p>
mm [3,5]: = 'Початок роботи'; p>
mm [4,1]: = 'Код здачі'; p>
mm [4,2]: = 'Оцінка'; p>
mm [4,3]: = 'Дата здачі'; p>
mm [4,4]: = 'Студентський'; p>
mm [4,5]: = 'Код предмета'; p>
with menu2 do begin p>
st [1]: = 'ПЕРЕГЛЯД'; p>
st [2]: = 'Студенти'; p>
st [3]: = 'Предмети'; p>
st [4]: = 'Викладачі'; p>
st [5]: = 'Оцінки'; p>
st [6]: = 'Вихід'; p>
m: = 6; p>
end; p>
with menu3 do begin p>
st [1]: = 'Коректування'; p>
st [2]: = 'Додавання'; p>
st [3]: = 'Видалення'; p>
st [4]: = 'Зміна'; p>
st [5]: = 'Вихід'; p>
m: = 5; p>
end; p>
with menu4 do begin p>
st [1]: = 'ЗАПИТИ'; p>
st [2]: = 'Знайти оцінку'; p>
st [3]: = 'Хто приймав іспит'; p>
st [4]: = 'Знайти розмір стипендії'; p>
st [5]: = 'Висновок з оцінки'; p>
st [6]: = 'Дата здачі іспиту'; p>
st [7]: = 'Вихід'; p>
m: = 7; p>
end; p>
end. p>