%meno: Michal Ivanic %oc: 23317 %zadanie 2: Zamestnanci %-----pouzivatelske rozhranie----- %run - hlavna ponuka programu run:- dynamic(zamestnanec/6), %deklaracia dynamickeho predikatu abolish(zamestnanec/6), %vymazanie zaznamov z db db_read, %nacitanie zo vstupneho suboru repeat, nl, write('/--------------------------\'), nl, write('| 1 - zaradit zamestnanca |'), nl, write('| 2 - vyradit zamestnanca |'), nl, write('| 3 - vyhladat zamestnanca |'), nl, write('| 4 - zoradit zamestnancov |'), nl, write('|--------------------------|'), nl, write('| subor = employee.txt |'), nl, write('| 5 - nacitat zo suboru |'), nl, write('| 6 - ulozit do suboru |'), nl, write('|--------------------------|'), nl, write('| 7 - koniec |'), nl, write('\--------------------------/'), nl, write('Zadaj svoju volbu: '), sread(Choice), choice(Choice), Choice = 7, !. %koniec %vyber - podla hlavnej ponuky programu %zaradenie zamestnanca choice(1):- flush, nl, write('zaradit zamestnanca'), nl, %nacitanie udajov, vsetky su povinne rread('Meno: ',Meno, (atom(Meno), len(Meno,M), M > 0 )), rread('Priezvisko: ',Priezvisko, (atom(Priezvisko), len(Priezvisko,P), P > 0 )), rread('Funkcia: ',Funkcia, (atom(Funkcia), len(Funkcia,F), F > 0 )), rread('Nadriadeny: ',Nadriadeny, (atom(Nadriadeny), len(Nadriadeny,N), N > 0 )), rread('Datum nastupu (DD-MM-RR): ',Datum, (len(Datum,D), D > 0 ,check_date(Datum))), rread('Oddelenie: ',Oddelenie, (atom(Oddelenie), len(Oddelenie,O), O > 0 )), db_add(Meno,Priezvisko,Funkcia,Nadriadeny,Datum,Oddelenie). %vyradenie zamestnanca choice(2):- flush, nl, write('vyradit zamestnanca'), nl, %nacitanie udajov, oba su povinne rread('Meno: ',Meno, (atom(Meno), len(Meno,M), M > 0 )), rread('Priezvisko: ',Priezvisko, (atom(Priezvisko), len(Priezvisko,P), P > 0 )), db_del(Meno,Priezvisko). %vyhladanie zamestnanca - hlada sa, len ak je v db nejaky zamestnanec choice(3):- (clause(zamestnanec(_,_,_,_,_,_),_), flush, nl, write('vyhladat zamestnanca'), nl, rread('Meno: ',Meno,atom(Meno)), %nacitanie udaju ccheck(Meno,MMeno), %ak nebolo zadane,nahradi sa anonymnou premennou rread('Priezvisko: ',Priezvisko,atom(Priezvisko)), ccheck(Priezvisko,PPriezvisko), rread('Funkcia: ',Funkcia,atom(Funkcia)), ccheck(Funkcia,FFunkcia), rread('Nadriadeny: ',Nadriadeny,atom(Nadriadeny)), ccheck(Nadriadeny,NNadriadeny), rread('Datum nastupu (DD-MM-RR): ',Datum, ((len(Datum,D),D=0);check_date(Datum))), ccheck(Datum,DDatum), rread('Oddelenie: ',Oddelenie,atom(Oddelenie)), ccheck(Oddelenie,OOddelenie), db_search(MMeno,PPriezvisko,FFunkcia,NNadriadeny,DDatum,OOddelenie,Result), %vyhladanie showw(Result), %zobrazenie vysledkov vyhladavania !); (write('v db nie su ziadne zaznamy o zamestnancoch'), nl). %zoradit zamestnancov choice(4):- flush, nl, write('zoradit zamestnancov'), nl, write('zvolte si kritetium, podla ktoreho chcete usporiadat zamestnancov: '), nl, write('/--------------------\'), nl, write('| 1 - Meno |'), nl, write('| 2 - Priezvisko |'), nl, write('| 3 - Funkcia |'), nl, write('| 4 - Nadriadeny |'), nl, write('| 5 - Datum nastupu |'), nl, write('| 6 - Oddelenie |'), nl, write('\--------------------/'), nl, write('zadajte svoju volbu: '), sread(Choice), number(Choice), Choice > 0, Choice < 7, ( (clause(zamestnanec(_,_,_,_,_,_),_), %len ak su v db nejake zaznamy db_sort(Choice,Result), %zoradenie showw(Result), ! ) ; (write('db neobsahuje ziadne zaznamy'), nl ) ). %nacitat zamestnancov zo suboru choice(5):- db_read. %zapis zamestnancov do suboru choice(6):- db_write. %koniec, aj ulozenie zamestnancov do suboru choice(7):- db_write. %-----funkcie na pracu s db----- %zaradenie do databazy db_add(Meno, Priezvisko, Funkcia, Nadriadeny, Datum, Oddelenie) :- assertz(zamestnanec(Meno, Priezvisko, Funkcia, Nadriadeny, Datum, Oddelenie)), %zapisanie do db nl, write('Zamestnanic bol zaradeny'), nl. %vyhladanie v db - vsetky pozadovane zaznamy db_search(MMeno, PPriezvisko, FFunkcia, NNadriadeny, DDatum, OOddelenie,Result):- findall([MMeno,PPriezvisko,FFunkcia,NNadriadeny,DDatum, OOddelenie], zamestnanec(MMeno,PPriezvisko,FFunkcia,NNadriadeny,DDatum,OOddelenie), Result). %vyradenie z databazy db_del(Meno, Priezvisko):- ((clause(zamestnanec(Meno, Priezvisko,_,_,_,_),_), %ak je zamestnanec v db db_search(Meno,Priezvisko,_,_,_,_,Result), %vyhlada vyhovujuce zaznamy len(Result,Pocet), %kolko je vyhovujucich zaznamov ((Pocet>1, %viac ako 1 vysledok, vyberie sa ktory zaznam zmazat showw(Result), %zobrazenie zaznamov rread( 'Zvol poradove cislo zamestnanca, ktoreho chces vyradit: ',No,true), %write('Zvol poradove cislo zamestnanca, ktoreho chces vyradit: '), %read(No), number_atom(Noo,No), member([Me,Pr,Fu,Na,Da,Od],Result,Noo), retract(zamestnanec(Me,Pr,Fu,Na,Da,Od)), %vyradenie nl, write('Zamestnanec vyradeny.'), nl, ! ); (Pocet=1, %existuje len jeden zaznam retract(zamestnanec(Meno,Priezvisko,_,_,_,_)), nl, write('Zamestnanec vyradeny.'), nl, !)), ! ); (nl, write('Pozadovany zaznam nebol najdeny.'),nl) ). %nacitanie zo suboru do db db_read:- abolish(zamestnanec/6), %vycistenie db - zmazanie vsetkych zaznamov see('employee.txt'), %presmerovanie vstupu na subor inpos(0), %nastavenie pozicie na zaciatok suboru repeat, ( (at_end_of_file, !, seen, nl, write('udaje boli uspesne nacitane'),nl); (read(Line), assertz(Line), fail) ). %zapisanie z db do soboru db_write:- ( clause(zamestnanec(_,_,_,_,_,_),_), %kontrola, ci su v db nejake zaznamy db_search(_,_,_,_,_,_,Result), %vsetky zaznamy del('employee.txt'), %zmazanie suboru tell('employee.txt'), %presmerovanie vystupu na subor %showw(Result), db_wwrite(Result), told, nl,write('udaje boli uspesne ulozene'),nl, ! ); (write('databaza neobsahuje ziadne udaje na zapisanie'),nl). %zapisanie do suboru db_wwrite([]). db_wwrite([[Meno,Priezvisko,Funkcia,Nadriadeny,Datum,Oddelenie]|T]):- write('zamestnanec('''), write(Meno),write(''','''), write(Priezvisko),write(''','''), write(Funkcia),write(''','''), write(Nadriadeny),write(''','''), write(Datum),write(''','''), write(Oddelenie),write(''').'),nl, db_wwrite(T). %zoradenie zaznamov v db podla zadaneho kriteria db_sort(Choice,Result):- db_search(_,_,_,_,_,_,SResult), %vyhladanie vsetkych zaznamov sort(SResult,Result,[Choice]), abolish(zamestnanec/6), %vymazanie vsetkych zaznamov db_reload(Result). %zapisanie usporiadanych %zapisanie zaznamov do db db_reload([]). db_reload([[Me,Pr,Fu,Na,Da,Od]|T]):- assertz(zamestnanec(Me,Pr,Fu,Na,Da,Od)), db_reload(T). %-----pomocne funkcie----- %zobrazenie zaznamov zaslanych ako argument showw([]). showw([[Me,Pr,Fu,Na,Da,Od]|T]):- nl, write('Meno: '),write(Me),nl, write('Priezvisko: '),write(Pr),nl, write('Funckia: '),write(Fu),nl, write('Nadriadeny: '),write(Na),nl, write('Datum nastupu: '),write(Da),nl, write('Oddelenie: '),write(Od),nl, showw(T). %nacitanie - vypisanie poziadavky, nacitanie, skontrolovanie podmienok rread(Text,Reply,Test):- write(Text), %read(Reply), fread(a,0,-1,Reply), call(Test), !. rread(Text,Reply,Test):- %ak neboli podmienky splnene, pokusi sa nacitat vstup opat write('Nespravny format vstupu.'),nl, rread(Text,Reply,Test). %kontrola, ci nacitany datum ma spravny format check_date(Dat):- atom(Dat), cat(DD,Dat,[2,1,2,1]), %rozdelenie datumu DD = [D1,D2,D3,D4,D5], D2=D4, %kontrola pomlciek D2='-', number_atom(DDD1,D1), %kontrola cisel number_atom(DDD2,D3), number_atom(DDD3,D5). %ak nebola polozka zadana, nahradi ju anonymnou, inak ponech ccheck('',_):-!. ccheck(P,P).