Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PZ.doc
Скачиваний:
1
Добавлен:
17.11.2018
Размер:
225.28 Кб
Скачать

2 Опис роботи програми

Розробкою даної курсової роботи було створення бази даних робочого місця менеджера в магазині «Автозапчастини». Створена програма на Пролозі дозволяє працювати з динамічними базами даних

Принциповою відмінністю динамічних баз даних є те, що під час роботи з програмою, з них можна видаляти будь-які твердження, а також додавати нові. Інша важлива особливість динамічної бази полягає у тому, що вона може бути збережена на диск та зчитана з диска в оперативну пам’ять.

Розглянемо частини програмного коду.

В розділі domains опишемо області даних, які будуть приймати рядкові значення.

artikul = integer

shafa, poluca = integer

name = string

grn, kop = integer

year, month, day = integer

placedom = place(shafa, poluca)

pricedom = price(grn, kop)

datedom = date(year, month, day)

В розділі database опишемо нашу базу даних.

database - bd

detal(artikul, placedom, name, pricedom, datedom)

database - b1

table1(artikul, placedom, name, pricedom, datedom)

database - b2

table2(artikul, placedom, name, pricedom, datedom)

Опишемо предикати, що будуть використовувати в ході програми.

predicates

nondeterm windows

nondeterm go

nondeterm do(char)

nondeterm open(char)

nondeterm store(char)

nondeterm adding

nondeterm correct(char)

nondeterm indication(char)

nondeterm indicationB1(char)

nondeterm indicationB2(char)

nondeterm see(char)

nondeterm del(char)

nondeterm exists(string)

nondeterm show(artikul, placedom, name, pricedom, datedom)

nondeterm get(artikul, placedom, name, pricedom, datedom)

goal

shapka, go.

Використовуються недетерміновані предикати. Оскільки факти можуть бути додані у будь-який момент під час виконання програми, компілятор завжди повинен враховувати, що існує можливість знайти альтернативне рішення в ході пошуку з поверненням. Якщо в розділі facts є предикат, для якого ніколи не буде більше одного факту, то можна декларувати це, написавши перед оголошенням предиката факту ключове слово determ (або ключове слово single, якщо предикат завжди повинен мати один і лише один факт).

В розділі Clauses описуємо процедури роботи з програмою.

detal(1,place(5,6),"Gayka",price(0,45),date(1996,1,4)).

detal(2,place(6,7),"Gvunt",price(0,65),date(1996,2,5)).

Для створення заголовку використовується предикат заголовок

shapka:-

write("-------------------------------------------------------------------------"),nl,

write(" Робоче місцt менеджера в магазині Автозапчастини "),nl,

write("--------------------------------------------------------------------------").

Для завантаження бази даних з раніше створеного файлу опишемо предикат , що буде здійснювати процедуру пошуку і загрузки файлу бази даних.

відкрити:-write("Введіть розміщення файлу і його ім'я або натисніть\n 1- C:\\Temp\\vurobu.db\n 2 - інший файл\n"),readln(Файл),

Файл="1",existfile(file),consult(file),write("База завантажена");

write("Ведіть куди ви хочете зберегти файл і його ім'я.\n"),

readln(Файл),existfile(Файл),consult(Файл),write("База завантажена"),nl.

Процедура windows виконує управління основним меню програми. При введенні цифри, що відповідає виконанню потрібної дії, вона записується в змінну Choice і передається процедурі do(Choice), де в залежності від натиснутої цифри будуть виконуватись відповідні дії.

windows :-

nl, write(" Виберіть варіант работи з базами даних:"), nl,

nl, write(" 1 :- Загрузити"),

nl, write(" 2 :- Зберагти"),

nl, write(" 3 :- Проглянути"),

nl, write(" 4 :- Коректувати"),

nl, write(" 5 :- Видалити запис по назві"),

nl, write(" 6 :- Створити по назві"),

nl, write(" 7 :- Додати"),

nl, write(" 0 :- Вихід "), nl,

nl, write(" ------------------| |------------------"),nl.

go :-windows,readchar(X), do(X).

Для завантаження баз даних, набираємо цифру 1 головного меню програми. При виборі цифри “1” відбувається do(1), який в свою чергу викликає предикат (N), що відповідає за вибір запису.

do('1') :-

nl, write(" Звідки загрузити "), nl,

nl, write(" 1 :- В bd"),

nl, write(" 2 :- В b1"),

nl, write(" 3 :- В b2"),

nl, write(" 4 :- Меню"), nl,

nl, write(" ------| |------"),nl,

readchar(X), open(X), go, !.

open('1') :-

write("Загрузка bd"), nl,

write(" Імя файла : "), readln(FN),

exists(FN), consult(FN, bd),

nl, write(" Завантажено"), readchar(_), !.

open('2') :-

write("Загрузка b1"), nl,

write(" Імя файла : "), readln(FN),

exists(FN), consult(FN, b1),

nl, write(" Завантажено"), readchar(_), !.

open('3') :-

write("Загрузка b2"), nl,

write(" Імя файлу : "), readln(FN),

exists(FN), consult(FN, b2),

nl, write(" Завантажено"), readchar(_), !.

open('4') :-

!.

open(_) :-

write("!!!!ПОМИЛКА!!!! "),nl,

write(" Виберіть в меню"), readchar(_),

do('1').

Якщо потрібно зберегти дані в базах, набираємо 2 в головному меню програми. Виконується do(2), який викликає процедуру збереження записів select(N), робота якої вже описана раніше.

do('2') :-

nl, write(" Що зберегти ?"), nl,

nl, write(" 1 :- bd"),

nl, write(" 2 :- b1"),

nl, write(" 3 :- b2"),

nl, write(" 4 :- Меню"), nl,

nl, write(" ------| |------"),nl,

readchar(X), store(X), go, !.

store('1') :-

write(" Збереження\n"), nl,

write(" Імя файла : "), readln(FN), save(FN, bd),

nl, write(" Збережено"), readchar(_), !.

store('2') :-

write(" Збереження\n"), nl,

write(" Імя файла : "),

readln(FN), save(FN, b1),

nl, write(" Збережено"), readchar(_), !.

store('3') :-

write(" Збереження\n"), nl,

write(" Имя файла : "),

readln(FN), save(FN, b2),

nl, write(" Збережено"), readchar(_), !.

store('4') :-

!.

store(_) :-

write("!!!!ПОМИЛКА!!!! "),nl,

write(" Виберіть в меню"), readchar(_),

do('2').

Якщо потрібно переглянути базу даних, набираємо 3 в головному меню програми. Виконується предикат do(3), що здійснює вивід даних в заданому форматі.

see('1') :-

write(" Перегляд "),nl,

detal(Art,place(NC,NS),Name,price(GRN,Kop),date(Year,Mon,Day)),

show(Art,place(NC,NS),Name,price(GRN,Kop),date(Year,Mon,Day)),

nl,nl,write("Натисніть ENTER для продовжения..."),

readchar(_), nl, fail.

see('1') :-

do('3'), !.

see('2') :-

write(" Перегляд b1"),nl,

table1(Art,place(NC,NS),Name,price(GRN,Kop),date(Year,Mon,Day)),

show(Art,place(NC,NS),Name,price(GRN,Kop),date(Year,Mon,Day)),

nl,nl,write("Натисніть ENTER для продовжения..."),

readchar(_), nl, fail.

see('2') :-

do('3'), !.

see('3') :-

write(" Перегляд b2"),nl,

table2(Art,place(NC,NS),Name,price(GRN,Kop),date(Year,Mon,Day)),

show(Art,place(NC,NS),Name,price(GRN,Kop),date(Year,Mon,Day)),

nl,nl,write("Натисніть ENTER для продовжения..."),

readchar(_), nl, fail.

see('3') :-

do('3'), !.

see('4') :- !.

see(_) :-

write("!!!!ПОМИЛКА!!!! "),nl,

write(" Виберіте в меню"), readchar(_),

do('3').

Для корекції даних потрібно використати предикат do(4). Для цього набираємо 4 в основному меню. Можемо здійснити корекцію даних по базах.

do('4') :-

write("Корегування записів"), nl,

write(" Спосіб нахождення записів: "), nl,

nl, write(" 1 :- по номеру артикула"),

nl, write(" 2 :- по назві"),

nl, write(" 3 :- Меню"), nl,

nl, write(" ------| |------"),

readchar(X), correct(X), go, !.

correct('1') :-

write(" Корекція записів, знайдених по артикулу "),

write("Номер артикула: "), readint(X),

detal(X,place(NC,NS),Name,price(GRN,Kop),date(Year,Mon,Day)),

nl, write("Старий запис:"), nl, nl,

show(X,place(NC,NS),Name,price(GRN,Kop),date(Year,Mon,Day)), nl, nl,

write("Введіть новий варіант:"), nl, nl,

get(ArtD,place(NCD,NSD),NameD,price(GRND,KopD),date(YearD,MonD,DayD)), nl,

retract(detal(X,place(NC,NS),Name,price(GRN,Kop),date(Year,Mon,Day))),

assert(detal(ArtD,place(NCD,NSD),NameD,price(GRND,KopD),date(YearD,MonD,DayD))),

do('4'), !.

correct('1') :-

do('4'), !.

correct('2') :-

write(" Корекція записів, знайдених по назві "),

write("Назва: "), readln(X),

detal(Art,place(NC,NS),X,price(GRN,Kop),date(Year,Mon,Day)),

nl, write("Старий запис:"), nl, nl,

show(Art,place(NC,NS),X,price(GRN,Kop),date(Year,Mon,Day)), nl, nl,

write("Введіть новий варіант:"), nl, nl,

get(ArtD,place(NCD,NSD),NameD,price(GRND,KopD),date(YearD,MonD,DayD)), nl,

retract(detal(Art,place(NC,NS),X,price(GRN,Kop),date(Year,Mon,Day))),

assert(detal(ArtD,place(NCD,NSD),NameD,price(GRND,KopD),date(YearD,MonD,DayD))),

do('4'), !.

correct('2') :-

do('4'), !.

correct('3') :- !.

correct(_) :-

write("!!!!ПОМИЛКА!!!! "),nl,

write(" Виберіть в меню"), readchar(_),

do('4').

Для видалення записів, потрібно вибрати 5 у головному меню програми, при цьому виконується предикат do(5).

do('5') :-

write(" Видалення:"), nl,

write(" Введіть назву :"), nl,

nl, write(" 1 :- По артикулу"),

nl, write(" 2 :- По назві"),

nl, write(" 3 :- Удалить всю базу"),

nl, write(" 4 :- Меню"), nl,

nl, write(" ------| |------"),nl,

readchar(X), del(X),

go, !.

del('1') :-

write(" Видалення по артикулу "), nl,

write(" Номер артикула: "), readint(X),

retract(detal(X,place(NC,NS),Name,price(GRN,Kop),date(Year,Mon,Day))), nl,

write(" Готово."), readchar(_),

do('5'), !.

del('1') :-

write("!!!!ПОМИЛКА!!!! "),nl,

write(" Запис не знайдено."), readchar(_),

do('5').

del('2') :-

write(" Видалення по назві "), nl,

write(" Назва: "), readln(X),

retract(detal(Art,place(NC,NS),X,price(GRN,Kop),date(Year,Mon,Day))), nl,

write(" Готово."), readchar(_),

do('5'), !.

del('2') :-

write("!!!!ПОМИЛКА!!!! "),nl,

write(" Запис не знайдено."), readchar(_),

do('5').

del('3') :-

write(" Видалення всієї бази "),

retract(detal(_,place(_,_),_,price(_,_),date(_,_,_))),

fail.

del('3') :-

write(" База видалена."), readchar(_),

do('5'), !.

del('4') :-

!.

del('_') :-

write("!!!!ПОМИЛКА!!!! "),nl,

write(" Виберіть в меню"), readchar(_),

do('5').

Якщо потрібно створити нову базу даних від потреби – вибираємо 6 в основному меню.

do('6') :-

write(" Створити базц поназві "), nl,

write(" Яку базу створити ?"), nl,

nl, write(" 1 :- B1"),

nl, write(" 2 :- B2"),

nl, write(" 3 :- Меню"), nl,

nl, write(" ------| |------"),nl,

readchar(X), indication(X), go, !.

indication('1') :-

write(" Створити базу B1 "), nl,

write(" Введіть по чому будем створювати:"), nl,

nl, write(" 1 :- По місцю зберігання"),

nl, write(" 2 :- По ціні"),

nl, write(" 3 :- По даті поступлення"),

nl, write(" 4 :- Меню"), nl,

nl, write(" ------| |------"),

readchar(X), indicationB1(X),

do('6'), !.

indication('2') :-

write(" Створити базу B2 "), nl,

write(" Введіть по чому будем створювати:"), nl,

nl, write(" 1 :- По місцю зберігання"),

nl, write(" 2 :- По ціні"),

nl, write(" 3 :- По даті поступлення"),

nl, write(" 4 :- Меню"), nl,

nl, write(" ------| |------"),

readchar(X), indicationB2(X),

do('6'), !.

indication('3') :-

!.

indication(_) :-

write("!!!!ПОМИЛКА!!!! "),nl,

write(" Виберіть в меню"), readchar(_),

do('6').

indicationB1('1') :-

write(" Створити базу B1 по місцю зберігання"), nl,

write(" Номер шафи: "), readint(X),

write(" Номер полиці: "), readint(Y),

detal(Art,place(X,Y),Name,price(GRN,Kop),date(Year,Mon,Day)),

assert(table1(Art,place(X,Y),Name,price(GRN,Kop),date(Year,Mon,Day))),

fail.

indicationB1('1') :-

indication('1').

indicationB1('2') :-

write(" Створити базу B1 по ціні"), nl,

write(" Гривень: "), readint(X),

write(" Копійок: "), readint(Y),

detal(Art,place(NC,NS),Name,price(X,Y),date(Year,Mon,Day)),

assert(table1(Art,place(NC,NS),Name,price(X,Y),date(Year,Mon,Day))),

fail.

indicationB1('2') :-

indication('1').

indicationB1('3') :-

write(" Створити базу B1 по даті"), nl,

write(" Рік: "), readint(X),

write(" Місяць: "), readint(Y),

write(" День: "), readint(Z),

detal(Art,place(NC,NS),Name,price(GRN,Kop),date(X,Y,Z)),

assert(table1(Art,place(NC,NS),Name,price(GRN,Kop),date(X,Y,Z))),

fail.

indicationB1('3') :-

indication('1').

indicationB1('4') :- !.

indicationB1(_) :-

write("!!!!ПОМИЛКА!!!! "),nl,

write(" Виберіть в меню"), readchar(_),

indication('1').

indicationB2('1') :-

write(" Створити базу B1 по місцю зберігання"), nl,

write(" Номер шафи: "), readint(X),

write(" Номер полиці: "), readint(Y),

detal(Art,place(X,Y),Name,price(GRN,Kop),date(Year,Mon,Day)),

assert(table2(Art,place(X,Y),Name,price(GRN,Kop),date(Year,Mon,Day))),

fail.

indicationB2('1') :-

indication('2').

indicationB2('2') :-

write(" Створити базу B2 по ціні"), nl,

write(" Гривень: "), readint(X),

write(" Копійок: "), readint(Y),

detal(Art,place(NC,NS),Name,price(X,Y),date(Year,Mon,Day)),

assert(table2(Art,place(NC,NS),Name,price(X,Y),date(Year,Mon,Day))),

fail.

indicationB2('2') :-

indication('2').

indicationB2('3') :-

write(" Створити базу B1 по даті"), nl,

write(" Рік: "), readint(X),

write(" Місяць: "), readint(Y),

write(" День: "), readint(Z),

detal(Art,place(NC,NS),Name,price(GRN,Kop),date(X,Y,Z)),

assert(table2(Art,place(NC,NS),Name,price(GRN,Kop),date(X,Y,Z))),

fail.

indicationB2('3') :-

indication('2').

indicationB2('4') :- !.

indicationB2(_) :-

write("!!!!ПОМИЛКА!!!! "),nl,

write(" Виберіть в меню"), readchar(_),

indication('2').

При виборі 7 в основному меню програми, здійснюється додавання даних до головної бази.

do('7') :-

write(" Додати запис до головної бази "),

adding, go, !.

adding :-

get(Art,place(NC,NS),Name,price(GRN,Kop),date(Year,Mon,Day)),

nl, write(" Ви ввели :"),

nl, show(Art,place(NC,NS),Name,price(GRN,Kop),date(Year,Mon,Day)), nl,

nl, write(" Додати ? (Yes/No)"), readchar(A),

A='y',

assert(detal(Art,place(NC,NS),Name,price(GRN,Kop),date(Year,Mon,Day)));

!.

Для завантаження бази використовуємо предикат do (8).

do('0') :-

write(" Перевірка"), nl,

write(" Выйти ? (Yes-0/No-1)"), readchar(X),

X='0',nl,write("Кінець роботи "), exit;

go, !.

do(_) :-

write("!!!!ПОМИЛКА!!!! "),nl,

write(" Выберите из меню"), readchar(_), go.

Розшифровка основних посилань приведена нижче:

exists(FN) :-

existfile(FN);

write("!!!!ПОМИЛКА!!!! "),nl,

write(" Файл ",FN," не знайдено!"),

readchar(_), do('1').

show(Art,place(NC,NS),Name,price(GRN,Kop),date(Year,Mon,Day)) :-

write(" Артикул : ",Art),

nl, write(" Місце знаходження (Шафа, Полиця) : ",NC,", ",NS),

nl, write(" Назва : ",Name),

nl, write(" Вартість (Гривень:Копійок) : ",GRN,":",Kop),

nl, write(" Дата поступлення (Рік-Місяць-День): ",Year,"-",Mon,"-",Day).

get(Art,place(NC,NS),Name,price(GRN,Kop),date(Year,Mon,Day)) :-

write(" Артикул : "), readint(Art),

write(" Місце знаходження : "), nl,

write(" Шафа : "), readint(NC),

write(" Полиця : "), readint(NS),

write(" Наназва деталі : "), readln(Name),

write(" Вартість : "), nl,

write(" Гривень : "), readint(GRN),

write(" Копійок : "), readint(Kop),

write(" Дата поступлення : "), nl,

write(" Рік : "), readint(Year),

write(" Місяць : "), readint(Mon),

write(" День : "), readint(Day).

Процес роботи з програмою проілюстрований на наступних рисунках.

Рисунок 2.1 – Вікно додавання записів до головної бази

Рисунок 2.2 – Вікно перегляду бази даних

Рисунок 2.3 – Вікно редагування та зберігання даних

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]