Розробити програму на алгоритмічній мові
програмування С + +, що реалізовує навчальну систему управління базою даних
(СУБД). H2>
Звіт до роботи по курсу b> "Системне програмування" p>
Розробив Чепасов І.О. p>
Пензенський Державний Технічний Університет,
Кафедра: "Інформаційно-обчислювальні системи" p>
1998 p>
1 Формулювання завдання h2>
Розробити програму на алгоритмічній мові
програмування С + +, що реалізовує навчальну систему управління базою даних
(СУБД). P>
2 Технічне завдання h2>
2.1 Підстава для розробки h2>
Підставою для розробки є завдання з дисципліни
"Системне програмування", видане на кафедрі ІТТ ПДТУ. P>
2.2 Вимоги до програми h2>
2.2.1 Вимоги до функціональних характеістікам p>
Програма повинна виконувати операції введення, зберігання,
редагування, видалення та пошуку інформації про студентів, що зберігається в базі
даних. p>
Інформація про студентів повинна містити наступні
дані: p>
ПІБ p>
Рік народження: p>
Адреса p>
Навчальна група. p>
Вхідними даними програми являеются: вихідна база
даних, що зберігається на диску під ім'ям base_o.dat і дані, що вводяться
чи що змінюються користувачем у процесі роботи програми. p>
Вихідними даними в програмі є база даних,
яка записується на диск під ім'ям base_o.dat по завершенні роботи
програми. p>
2.2.2 Вимоги до складу і параметрів технічних
коштів p>
Програма повинна працювати на стандартному комплексі
технічних засобів зі складу персональних комп'ютерів IBM PC із процесором i386
або вище. p>
2.2.3 Вимоги до програмної та інформаційної
сумісності p>
Програма повинна працювати з операційною системою
MS-DOS 6.0 або вище. P>
Програма повинна бути написана на мові
програмування С + + l v.3.1. p>
2.3 Порядок контролю та приймання h2>
Для контролю правильності роботи програми повинні бути
розроблені тестові приклади, які можуть використовуватися і для приймання
роботи. У тестових прикладах повинні бути враховані всі можливі сполучення вихідних
даних, що відображають роботу всіх частин програми. Під час приймання необхідно
перевірити правильність функціонування програми шляхом виконання тестових
прикладів. Під час приймання програма повинна функціонувати правильно. P>
3 Проектування h2>
Проектування проводиться окремо для частини
програми, що організує роботу з базою даних, і для інтерфейсній частини
програми, оскільки кожна з цих частин може бути використана окремо.
Фактично кожна частина програми будується на основі різних об'єктів. Основою
інтерфейсу є абстрактний клас wind, нащадками якого є
власне елементи інтерфейсу, а база даних заснована на класі One_Record,
виконує основні функції роботи з базами даних. p>
Інтерфейсна частина програми заснована на абстрактному
класі wind, що містить загальні для всіх вікон дані, такі як розташування,
розмір і колір вікон, і віртуальні методи, такі як перемальовування, активізація.
На основі цього класу створюються всі інші класи, що перекривають
віртуальні методи конкретно для даного типу візуальних об'єктів. Створюється
ланцюжок вікон, адресується через її перший елемент. При запуску методу redr
першого елемента він повинен забезпечити перемальовування віх наступних шляхом виклику
того ж методу всіх інших об'єктів, оскільки в ланцюжок можуть бути
з'єднані будь-класи на основі wind. При натисканні TAB активним стає
Наступне в ланцюжку елемент. p>
Конкретно кажждий клас містить наступні поля і
методи: p>
Клас wind - абстрактний клас, при використанні
видає рамку p>
Поля: p>
x, y, dx, dy - розташування і розміри вікна p>
pap, ink, apap - кольори вікна p>
ts - можливість активізації p>
next - покажчик на наступне вікно. p>
Методи: p>
add - додати нового вікна в список. p>
Клас ed_win - клас строк редагування, при ts = 0
використовується як рядок виводу без можливості редагування. p>
Власні поля: p>
capt - вміст p>
pcapt - старе вміст p>
maxlen - максимальна довжина рядка. p>
Віртуальні методи: p>
redr, active. p>
Клас bt_win - клас кнопок p>
Власні поля: p>
fun - покажчик на викликається при активізації функцію p>
capt - вміст кнопки. p>
Віртуальні методи: p>
redr, active. p>
Клас sc_win - клас скроллером, залежить від
конкретного застосування p>
Власні поля: p>
m_fio, m_addr, m_yy, m_grp - маски полів класу
One_Record p>
pnt - перший елемент списку. p>
Віртуальні методи: p>
redr, active. p>
База даних представлена класом One_Record,
що містить всі необхідні поля даних і методи. Для організації бази
використовуються покажчики на початковий і на поточний елементи бази. p>
Поля класу: p>
fio, yy, addr, grp - дані про студента p>
next - наступний елемент p>
last - попередній елемент. p>
Методи класу: p>
save - запис у файл поточного і всіх наступних
елементів p>
FindUp - пошук вгору за списком p>
FindDown - пошук вниз за списком. p>
Ці методи повертають покажчик на знайдений елемент
списку: p>
add - додавання елемента в список. p>
Для знищення елемента використовується деструктор,
причому цей деструктор знищує всі наступні елементи. Для ініціалізації
існує два види конструкторів - ініціалізація завантаженням з файлу і безпосереднім
зазначенням всіх полів нового елементу. Другий спосіб використовується тільки при
порожній базі даних і використовується функцією add усередині класу. p>
При проектуванні програми створюються два списки вікон
- Один для головного меню, інший для підменю введення та редагування. Всі
основне меню складається з об'єктів класу кнопок, для кожної з яких пишеться
своя функція - обробник події. Організовується цикл перемальовування ->
активізація -> перевірка прапора виходу. p>
4 Аналіз результатів тестування p>
В ході випробувань програми була перевірена правильність
її роботи при введенні, редагуванні, видалення та пошуку певних елементів
бази даних щодо окремих значень полів. p>
У ході проведення тестування з'ясувалося, що
програма повністю працездатна. p>
Висновок p>
В процесі роботи була визначена структура даних
програми, розроблено алгоритм розв'язання задачі, була розроблена структура
програми. p>
Реалізація програми була проведена на алгоритмічній
мові С + + l v.3.10. p>
Результати тестування показали, що програма
працює правильно. p>
# include
p>
# include
p>
# include
p>
# include
p>
# include
p>
# include
p>
# include
p>
# include
p>
# include p>
// ОПИСУ КЛАСІВ
------------------------------------------- p>
// Клас, що визначає один елемент бази даних p>
class One_Record ( p>
public: p>
char fio [60] p>
//
ПІБ p>
char yy [5] p>
// Рік народження p>
char addr [60] p>
// Адреса p>
char grp [10] p>
// Група p>
One_Record * next p>
// Наступний p>
One_Record * last p>
// Попередній p>
One_Record (int, One_Record
*) P>
// Конструктор - читає елемент з файлу p>
// Конструктор - створює новий елемент p>
One_Record (char *
m_fio, char * m_yy, char * m_addr, char * m_grp) p>
// Деструктор p>
~ One_Record () () p>
// Запис у файл p>
void save (int) p>
// Пошук вперед p>
One_Record *
FindUp (char * m_fio, char * m_yy, char * m_addr, char * m_grp) p>
// Пошук тому p>
One_Record *
FindDown (char * m_fio, char * m_yy, char * m_addr, char * m_grp) p>
// Додавання p>
void add (One_Record
*) P>
) p>
// Клас вікон p>
class wind ( p>
public: p>
int x, y, dx, dy p>
// Координати
і розміри вікна p>
int pap, ink, apap p>
// Кольори вікна p>
char ts p>
//
Активізується чи ні при натисканні TAB p>
wind * next p>
// Наступне p>
wind (int, int, int, int)
p>
// Конструктор p>
~ wind () () p>
// Деструктор p>
void add (void * p) p>
// Додати у
список p>
void setact (char) p>
// Змінити
значення прапора TS p>
virtual void redr () p>
// Перемальовування p>
virtual void * active () p>
// Актівізіроать - повертає вказівник на p>
//
наступне активну p>
) p>
// Нащадок класу WIND - рядок редагування p>
class ed_win: public
wind ( p>
public: p>
char capt [100] p>
// Вміст p>
char pcapt [100] p>
//
Попереднє вміст p>
int maxlen p>
// Максимальна довжина p>
public: p>
// Конструктор p>
ed_win (int, int, int, int, char
*, int) p>
// Перемальовування p>
virtual void redr ()
p>
// Активізація p>
virtual void *
active () p>
) p>
// Нащадок WIND - кнопка p>
class bt_win: public
wind ( p>
void (* fun) () p>
// її викликає при натисканні функція p>
char capt [50] p>
// Назва p>
public: p>
// Конструктор p>
bt_win (int, int, int, int, char
*, void (*)()) p>
// Перемальовування p>
virtual void redr ()
p>
// Активізація p>
virtual void *
active () p>
) p>
// Скроллер p>
class sc_win: public
wind ( p>
public: p>
// Маска вибору p>
char * m_fio p>
char * m_addr p>
char * m_yy p>
char * m_grp p>
// Початковий елемент p>
One_Record * pnt p>
// Конструктор p>
sc_win (int, int, int, int, One_Record
*, char *, char *, char *, char *) p>
// Перемальовування p>
virtual void redr ()
p>
// Активізація p>
virtual void *
active () p>
) p>
// прототип функції КНОПОК ----------------------------------- p>
void fun_add () p>
void fun_del () p>
void up () p>
void down () p>
void find () p>
void edit () p>
void fun_exit () p>
void about () p>
// ГЛОБАЛЬНІ ЗМІННІ
-------------------------------------- p>
// Покажчик на активне вікно p>
wind * act p>
// Прапор, який встановлюється для виходу p>
int f_exit = 0 p>
// Список вікон оснвного меню p>
wind * stwin p>
// Список вікон меню введення даних p>
wind * edwin p>
// Перший і поточний елементи бази даних p>
One_Record *
ndb = NULL p>
One_Record *
ctb = NULL p>
// Дані про вікнах меню p>
// Основне меню p>
bt_win
add_w (10,10,60,30, "New", fun_add) p>
bt_win
del_w (80,10,60,30, "Del", fun_del) p>
bt_win
edt_w (150,10,60,30, "Edit", edit) p>
bt_win
fin_w (220,10,60,30, "Find", find) p>
bt_win
ext_w (290,10,60,30, "Exit", fun_exit) p>
bt_win
abt_w (360,10,60,30, "About", about) p>
bt_win
up_w (430,10,30,14, "Up", up) p>
bt_win
down_w (430,26,30,14, "Dn", down) p>
// Введення/редагування даних про студента/введення маски
пошуку p>
ed_win
ifio (100,100,400,30, "FIO", 55) p>
ed_win
iyy (100,140,400,30, "Year", 4) p>
ed_win
iaddr (100,180,400,30, "Addres", 55) p>
ed_win
igrp (100,220,400,30, "Group", 9) p>
// ГЛОБАЛЬНІ ФУНКЦІЇ
----------------------------------------- p>
// Функція порівняння рядка A з маскою B p>
int stc (char *
a, char * b) ( p>
int n p>
if
(strlen (a)
for (n = 0 p>
n
n + +) if (a [n]! = b [n])
return 0 p>
return 1 p>
) p>
// опису МЕТОДІВ КЛАСІВ
----------------------------------- p>
// Об'єкт ЗАПИС
------------------------------------------ p>
// Конструктор p>
One_Record:: One_Record (char
* M_fio, char * m_yy, char * m_addr, char * m_grp) ( p>
strcpy (fio, m_fio) p>
strcpy (yy, m_yy) p>
strcpy (addr, m_addr)
p>
strcpy (grp, m_grp) p>
next = NULL p>
last = NULL p>
) p>
// Коснтруктор для випадку читання з файлу p>
One_Record:: One_Record (int
handle, One_Record * lst) ( p>
char rs [140] p>
// Читання в тимчасову рядок p>
read (handle, rs, 140)
p>
strcpy (fio, rs) p>
strcpy (yy, rs 60) p>
strcpy (addr, rs +65) p>
strcpy (grp, rs 125) p>
next = NULL p>
last = lst p>
if (! eof (handle)) p>
next = new One_Record (handle, this) p>
) p>
// Запис даних файл p>
void
One_Record:: save (int handle) ( p>
char rs [140] p>
strcpy (rs, fio) p>
strcpy (rs 60, yy) p>
strcpy (rs 65, addr) p>
strcpy (rs 125, grp) p>
_write (handle, rs, 140)
p>
if (next! = NULL)
next-> save (handle) p>
) p>
// Додавання запису до списку p>
void
One_Record:: add (One_Record * a) ( p>
// Перевірка, далі чи запис за алфавітом p>
if
(strcmp (a-> fio, fio) <0) ( p>
// Вставка перед цим елементом p>
if (last! = NULL)
( p>
a-> last = last p>
a-> next = this p>
last-> next = a p>
last = a p>
) else ( p>
a-> next = this p>
a-> last = NULL p>
last = a p>
) p>
// Далі - або додавання в кінець, або перехід до
наступного p>
) else if
(next! = NULL) next-> add (a) p>
else ( p>
next = a p>
a-> last = this p>
a-> next = NULL
p>
) p>
) p>
// Знайти вгору за списком елемент, що потрапляє під маску p>
One_Record *
One_Record:: FindUp (char * m_fio, char * m_yy, char * m_addr, char * m_grp) ( p>
if
(stc (fio, m_fio )&& p>
stc (fio, m_fio )&& p>
stc (fio, m_fio )&& p>
stc (fio, m_fio)) return this p>
if (last! = NULL)
return last-> FindUp (m_fio, m_yy, m_addr, m_grp) p>
else return NULL p>
) p>
// Знайти вниз за списком елемент, що потрапляє під маску p>
One_Record *
One_Record:: FindDown (char * m_fio, char * m_yy, char * m_addr, char * m_grp) ( p>
if
(stc (fio, m_fio )&& p>
stc (yy, m_yy )&& p>
stc (addr, m_addr )&& p>
stc (grp, m_grp)) return this p>
if (next! = NULL)
return next-> FindDown (m_fio, m_yy, m_addr, m_grp) p>
else return NULL p>
) p>
// Клас вікон
--------------------------------------------- p>
// Конструктор p>
wind:: wind (int
ix, int iy, int idx, int idy) ( p>
x = ix p>
y = iy p>
dx = idx p>
dy = idy p>
pap = 8 p>
ink = 15 p>
apap = 1 p>
ts = 1 p>
next = NULL p>
) p>
// Перемальовування p>
void wind:: redr () ( p>
setfillstyle (1, pap)
p>
setcolor (ink) p>
bar (x, y, x + dx, y + dy) p>
rectangle (x +3, y +3, x + dx-3, y + dy-3)
p>
if (next! = NULL)
next-> redr () p>
) p>
// Додавання до списку p>
void wind:: add (void * p) ( p>
if (next! = NULL)
next-> add (p) p>
else next = (wind *)
p p>
) p>
// Активізація p>
void *
wind:: active () ( p>
// Перевірка, активізувати чи p>
if (ts) ( p>
// Промальовування активного стану p>
setfillstyle (1, apap)
p>
setcolor (ink) p>
bar (x, y, x + dx, y + dy) p>
rectangle (x +3, y +3, x + dx-3, y + dy-3) p>
char c p>
// Обробка клавіатури - TAB - наступне, ESC - вихід p>
do ( p>
c = getch () p>
) while ((c! = 9) & & (c! = 27)) p>
if (c == 27) f_exit = 1 p>
return next p>
) else return next p>
// Ні --
повернути вказівник на наступне p>
) p>
// Зміна прапора TS p>
void
wind:: setact (char a) ( p>
ts = a p>
) p>
// Клас рядків редагування
----------------------------- p>
// Конструктор p>
ed_win:: ed_win (int
ix, int iy, int idx, int idy, char * p, int mln): p>
wind (ix, iy, idx, idy)
( p>
maxlen = mln p>
strcpy (capt, p) p>
strcpy (pcapt, p) p>
) p>
// Перемальовування p>
void
ed_win:: redr (){ p>
setfillstyle (1, pap)
p>
setcolor (ink) p>
bar (x, y, x + dx, y + dy) p>
rectangle (x +3, y +3, x + dx-3, y + dy-3)
p>
settextjustify (1,1)
p>
outtextxy (x + dx/2, y + dy/2, capt)
p>
if (next! = NULL)
next-> redr () p>
) p>
// Активізація p>
void *
ed_win:: active (){ p>
unsigned char c p>
char ps [200] p>
if (! ts) return next p>
// Перевірка, активізувати або пропустити p>
// Перемальовування p>
setfillstyle (1, apap)
p>
setcolor (ink) p>
bar (x, y, x + dx, y + dy) p>
rectangle (x +3, y +3, x + dx-3, y + dy-3)
p>
settextjustify (1,1) p>
do ( p>
// Висновок рядки із символом "_" в якості
курсору p>
strcpy (ps, capt) p>
strcat (ps ,"_") p>
bar (x 4, y 4, x + dx-4, y + dy-4) p>
outtextxy (x + dx/2, y + dy/2, ps) p>
// Опитування клавіатури p>
c = getch () p>
if (c == 0) c = getch () p>
else ( p>
if
(c == 8) ( p>
// Видалити --
перемістити кінець рядка 0 на одиницю лівіше p>
if
(strlen (capt)> 0) capt [strlen (capt) -1] = 0 p>
) p>
if (c == 13) strcpy (pcapt, capt) p>
// ENTER - запам'ятати вміст p>
if (c == 27)
strcpy (capt, pcapt) p>
// ESC - відновити вміст p>
if
((c> 32) & & (strlen (capt)
// Інакше
- Додати символ p>
capt [strlen (capt) +1] = 0
p>
capt [strlen (capt)] = c
p>
) p>
) p>
) while (c! = 9) p>
return next p>
) p>
// Клас кнопок
------------------------------------------- p>
// Конструктор p>
bt_win:: bt_win (int
ix, int iy, int idx, int idy, char * p, void (* ifun )()): p>
wind (ix, iy, idx, idy)
( p>
apap = 12 p>
pap = 3 p>
strcpy (capt, p) p>
fun = ifun p>
) p>
// Перемальовування p>
void
bt_win:: redr (){ p>
setfillstyle (1, pap)
p>
setcolor (ink) p>
bar (x, y, x + dx, y + dy) p>
rectangle (x +3, y +3, x + dx-3, y + dy-3)
p>
settextjustify (1,1)
p>
outtextxy (x + dx/2, y + dy/2, capt)
p>
if (next! = NULL)
next-> redr () p>
) p>
// Активізація p>
void *
bt_win:: active (){ p>
char c p>
if (ts) ( p>
// Перемальовування активної кнопки p>
setfillstyle (1, apap)
p>
setcolor (ink) p>
bar (x, y, x + dx, y + dy) p>
rectangle (x +3, y +3, x + dx-3, y + dy-3) p>
settextjustify (1,1) p>
outtextxy (x + dx/2, y + dy/2, capt) p>
// Обробка подій p>
do ( p>
c = getch () p>
if (c == 13)
fun () p>
// ENTER - виконання функції p>
) while
((c! = 13) & & (c! = 9) & & (c! = 27 )&&(! f_exit)) p>
// Перевірка умови завершення p>
if (c == 27)
f_exit = 1 p>
// Якщо ESC - вихід з програми p>
) p>
return next p>
) p>
// Клас скроллером
--------------------------------------- p>
// Конструктор p>
sc_win:: sc_win (int
ix, int iy, int idx, int idy, One_Record * ipnt, char * ifio, char * iyy, char *
iaddr, char * igrp): p>
wind (ix, iy, idx, idy)
( p>
apap = 1 p>
pap = 1 p>
strcpy (m_fio, ifio) p>
strcpy (m_addr, iaddr)
p>
strcpy (m_yy, iyy) p>
strcpy (m_grp, igrp) p>
pnt = ipnt-> FindDown (ifio, iyy, iaddr, igrp)
p>
) p>
// Перемальовування p>
void sc_win:: redr ()
( p>
int n p>
int dlt = dx/5 p>
One_Record * p p>
// Перемальовування p>
setfillstyle (1, apap)
p>
setcolor (ink) p>
bar (x, y, x + dx, y + dy) p>
rectangle (x +3, y +3, x + dx-3, y + dy-3)
p>
settextjustify (1,1) p>
// Виведення всіх рядків таблиці p>
p = pnt p>
n = 20 p>
while
((p! = NULL) & & (n
outtextxy (x + dlt, y + n, p-> fio) p>
outtextxy (x + dlt * 2, y + n, p-> yy) p>
outtextxy (x + dlt * 3, y + n, p-> addr) p>
outtextxy (x + dlt * 4, y + n, p-> grp) p>
// Спроба знайти наступний елемент p>
if (p-> next! = NULL)
p = p-> next-> FindDown (m_fio, m_yy, m_addr, m_grp) p>
else p = NULL p>
n + = 20 p>
) p>
) p>
// Активізація p>
void *
sc_win:: active () ( p>
char c p>
One_Record * p p>
do ( p>
redr () p>
c = getch () p>
if (! c) c = getch () p>
if (c == 72) if (pnt! = NULL) ( p>
// На початок p>
p = pnt-> FindUp (m_fio, m_yy, m_addr, m_grp) p>
if (p! = NULL) pnt = p p>
) p>
if (c == 80) if (pnt! = NULL) ( p>
// Вниз p>
p = pnt-> FindDown (m_fio, m_yy, m_addr, m_grp) p>
if (p! = NULL) pnt = p p>
) p>
) while (c! = 27) p>
setfillstyle (3,4) p>
bar (0,0,639,479) p>
return next p>
) p>
// ТІЛА ФУНКЦІЙ КНОПОК
---------------------------------------- p>
// Вихід - просто встановлення прапора p>
void fun_exit () ( p>
f_exit = 2 p>
) p>
// На початок - переміщення покажчика та перемальовування полів
редагування p>
void up () ( p>
if (ctb! = NULL) if
(ctb-> next! = NULL) ( p>
ctb = ctb-> next p>
strcpy (ifio.capt, ctb-> fio) p>
strcpy (iyy.capt, ctb-> yy) p>
strcpy (iaddr.capt, ctb-> addr) p>
strcpy (igrp.capt, ctb-> grp) p>
edwin-> redr ()
p>
) p>
) p>
// Вниз - переміщення покажчика та перемальовування полів
редагування p>
void down () ( p>
if (ctb! = NULL) if
(ctb-> last! = NULL) ( p>
ctb = ctb-> last p>
strcpy (ifio.capt, ctb-> fio) p>
strcpy (iyy.capt, ctb-> yy) p>
strcpy (iaddr.capt, ctb-> addr) p>
strcpy (igrp.capt, ctb-> grp) p>
edwin-> redr () p>
) p>
) p>
// Видалення p>
void fun_del () ( p>
if (ctb! = NULL) ( p>
if (ctb-> last == NULL) ( p>
ndb = ctb-> next p>
ctb-> next-> last = NULL p>
delete ctb p>
ctb = NULL p>
if (ndb == NULL) setfillstyle (3,4) p>
bar (0,0,639,479) p>
) else ( p>
ctb-> last-> next = ctb-> next p>
ctb-> next-> last = ctb-> last p>
delete ctb p>
ctb = NULL p>
) p>
) p>
) p>
// Додавання p>
void fun_add () ( p>
wind * act p>
act = edwin p>
One_Record * a p>
do ( p>
edwin-> redr () p>
act = (wind *) act-> active () p>
if (act == NULL) act = edwin p>
) while (! f_exit) p>
if (f_exit == 2) ( p>
a = new
One_Record (ifio.capt, iyy.capt, iaddr.capt, igrp.capt) p>
if (ndb == NULL) ndb = a p>
else ( p>
ndb-> add (a) p>
if (ndb-> last! = NULL) ndb = ndb-> last p>
) p>
) p>
f_exit = 0 p>
) p>
// Пошук p>
void find () ( p>
act = edwin p>
if (ctb == NULL)
return p>
do ( p>
edwin-> redr () p>
act = (wind *) act-> active () p>
if (act == NULL) act = edwin p>
) while (! f_exit) p>
if (f_exit == 2) ( p>
sc_win
a (10,100,500,300, ndb, ifio.capt, iyy.capt, iaddr.capt, igrp.capt) p>
a.active () p>
) p>
f_exit = 0 p>
) p>
// Редагування p>
void edit () ( p>
act = edwin p>
if (ctb == NULL)
return p>
do ( p>
edwin-> redr () p>
act = (wind *) act-> active () p>
if (act == NULL) act = edwin p>
) while (! f_exit) p>
if (f_exit == 2) ( p>
strcpy (ctb-> fio, ifio.capt) p>
strcpy (ctb-> yy, iyy.capt) p>
strcpy (ctb-> addr, iaddr.capt) p>
strcpy (ctb-> grp, igrp.capt) p>
) p>
f_exit = 0 p>
) p>
void about () ( p>
cleardevice () p>
setfillstyle (6,5) p>
bar (0,0,639,479) p>
setfillstyle (1,0) p>
bar (100,100,539,379)
p>
rectangle (100,100,539,379)
p>
outtextxy (320,130, "
Про ПРОГРАМІ ") p>
getch () p>
setfillstyle (3,4) p>
bar (0,0,639,479) p>
) p>
// Основна програма p>
void main () ( p>
int drv, mode p>
int handle p>
drv = DETECT p>
initgraph (& drv, & mode, "")
p>
setfillstyle (3,4) p>
bar (0,0,639,479) p>
ed_win
hlp (10,440,620,40, p>
"Вибір пункту - TAB, Активізація - ENTER, Вихід - ESC", 0) p>
hlp.setact (0) p>
// спроба вважати базу даних p>
handle = open ( "base_o.dat", O_RDONLY | O_BINARY)
p>
if (handle> = 0) ( p>
ndb = new One_Record (handle, NULL) p>
) p>
// Додавання до списків відповідних вікон p>
wind * stwin p>
stwin = (wind *) new
ed_win (10,50,590,20, "Student database", 5) p>
stwin-> setact (0)
p>
stwin-> add (& hlp)
p>
stwin-> add (& add_w)
p>
stwin-> add (& del_w)
p>
stwin-> add (& edt_w)
p>
stwin-> add (& fin_w)
p>
stwin-> add (& ext_w)
p>
stwin-> add (& abt_w)
p>
stwin-> add (& up_w)
p>
stwin-> add (& down_w)
p>
act = stwin p>
edwin = (wind *) new
bt_win (250,300,100,20, "OK", fun_exit) p>
edwin-> add (& ifio)
p>
edwin-> add (& iyy)
p>
edwin-> add (& iaddr)
p>
edwin-> add (& igrp)
p>
// Обробка подій p>
do ( p>
// Перевірка, щоб вказівник на поточний при непорожній
списку завжди p>
// показував на один з елементів p>
if (ctb == NULL)
ctb = ndb p>
if (ctb! = NULL) ( p>
strcpy (ifio.capt, ctb-> fio) p>
strcpy (iyy.capt, ctb-> yy) p>
strcpy (iaddr.capt, ctb-> addr) p>
strcpy (igrp.capt, ctb-> grp) p>
edwin-> redr () p>
) p>
// Перемальовування p>
stwin-> redr () p>
// Активізація чергового вікна p>
act = (wind *) act-> active () p>
if (act == NULL) act = stwin p>
) while (! f_exit) p>
closegraph () p>
// Запис у файл або його видалення при порожній базі p>
if (ndb! = NULL) ( p>
handle = open ( "base_o.dat", O_WRONLY | O_TRUNC | O_CREAT | O_BINARY)
p>
if (handle> = 0) ( p>
while (ndb-> last! = NULL) ndb = ndb-> last p>
ndb-> save (handle) p>
) else perror ( "Error:") p>
) else ( p>
remove ( "base_o.dat") p>
) p>
close (handle) p>
) p>
Список літератури h2>
Для підготовки даної роботи були використані
матеріали з сайту http://kurslab.chat.ru/
p>