All pastes #478945 Raw Edit

Mine

public text v1 · immutable
·published 2007-05-09 13:36 UTC
rendered paste body
% Samuel Kroslak, 
% 3. rocnik 
% 24172 
%
%   Vytvorte  jednoduchy  databazovy  system  pre  pracu s udajmi
%   o receptoch, ktory by umoznil:
%   - zaradit recept, surovinu
%   - vyhladat recept (skupinu receptov) podla zadanych kriterii
%     (meno, pouzite suroviny)
%   - zoradit recepty podla zvoleneho typu udaja (mena, ceny,
%     casu pripravy)
%   - zistit cenu receptu pre dany pocet osob
%   - zistit, ktore recepty pripadaju do uvahy, ak mame 'nejake'
%     suroviny 
%   Na konci cinnosti vytvorenu databazu receptov ulozi do suboru
%   (ktory bude obsahovat fakty o jednotlivych receptoch) a umozni
%   nacitanie databazy zo suboru do datoveho sveta Arity/Prologu.
%
%   udaje v databaze musia obsahovat minimalne:
%   - meno receptu
%   - potrebne suroviny spolu s ich mnozstvom
%   - cas pripravy
%   - ceny surovin
%   !!!! Pracujte s datovym svetom ARITY/PROLOGU

main :-
	repeat, 
	[!menu, get(InputInt), nl, case(InputInt)!], fail.

menu :-
	nl, 
	write('[1] Zarad recept'), nl,
	write('[2] Zarad surovinu'), nl,
	write('[3] Vyhladaj recept'), nl,
	write('[4] Zorad recepty'), nl,
	write('[5] Zisti cenu receptu'), nl,
	write('[6] Najdi recepty podla surovin'), nl,
	write('[7] Nacitaj z databazy'), nl,
	write('[8] Uloz do databazy'), nl,
	write('[0] Koniec'),nl,

% quit 
case(48) :- 
	nl, write('Koniec programu'), nl, abort.

% add receipe 
case(49) :-
	nl, write('Zaradenie receptu'), nl,
	enterName(Name),
	write('Suroviny:'), nl,
	ingredients(I),
	enterTime(Cas),
	recept(Name, I, Cas)=..[recept, Name, I, Cas],
	recordz(recepty, recept(Name, I, Cas), REF).

enterName(Meno) :-
	write('Meno receptu:  '),
	read_string(50, X), string_term(X, Meno),
	((string_length(X, 0), main);
	(var(Meno), write('Meno musi zacinat malym pismenom!'), nl, main);
	(Str=..[recept, Meno, _, _],
	not(recorded(recepty, Str, _)));
	(write('Recept s tymto menom existuje!'), nl, main)).

enterTime(Cas) :-
	write('Cas pripravy [min]:  '),
	read_string(50, X), string_term(X, Pomoc),
	((string_length(X, 0), main);
	(integer(Pomoc), Pomoc > 0, Cas = Pomoc);
	(write('Nespravne zadany cas!'), nl, zadaj_cas(Cas))).

ingredients([H1-H2|T]):-
	write('Meno ingredients:  '),
	read_string(50, X), string_term(X, Meno),
	((string_length(X, 0), main);
	(Struct=..[surovina, Meno, _],
	recorded(ingredients, Struct, _));
	(write('Neznama surovina!'), nl, main)),
	write('Mnozstvo [g],[ml]:  '),
	read_string(50, Y), string_term(Y, Mnozstvo),
	((string_length(Y, 0), main);
	((not(number(Mnozstvo)); Mnozstvo =< 0),
	write('Zle zadane mnozstvo!'), nl, main );
	(number(Mnozstvo), Mnozstvo > 0,
	H1 = Meno, H2 = Mnozstvo)),
	write('Dalsiu surovinu [A/N]:  '), get(Dalej), nl,
	ifthenelse(Dalej =:= 97, ingredients(T), T = []).

%pridanie ingredients
case(50) :-
	meno_sur(Meno), cena_sur(Cena),
	surovina(Meno, Cena)=..[surovina, Meno, Cena],
	recordz(ingredients, surovina(Meno, Cena), REF).

meno_sur(Meno) :-
	write('Meno ingredients:  '),
	read_string(50, X), string_term(X, Pomoc),
	((string_length(X, 0), main);
	(var(Pomoc), write('Meno musi zacinat malym pismenom!'), nl, meno_sur(Meno));
	(Struc=..[surovina, Pomoc, _],
	recorded(ingredients, Struc, _),
	write('Tato surovina je v databaze!'),
	nl, meno_sur(Meno));
	Meno = Pomoc).

cena_sur(Cena) :-
	write('Cena ingredients za [kg], [l]:  '),
	read_string(50, X), string_term(X, Pomoc),
	((string_length(X, 0), main);
	(number(Pomoc), Pomoc > 0, Cena = Pomoc);
	(write('Zle zadana cena!'), nl, cena_sur(Cena))).

%
case(51) :-
	podmenu1, get(Vyber), nl,
	hladaj(Vyber).

podmenu1 :-
	nl, write('1. Vyhladat recept podla mena'), nl,
	write('2. Vyhladat recept podla surovin'), nl,
	write('3. Vyhladat vsetky recepty'), nl,
	write('4. Vyhladat vsetky ingredients'), nl,
	write('0. Navrat do hlavneho menu'), nl,
	write('Zadaj volbu:  ').

cit_meno(Meno) :-
	write('Meno receptu:  '),
	read_string(50, X), string_term(X, Pomoc),
	((string_length(X, 0), main);
	(nonvar(Pomoc),
	Meno = Pomoc)).

hladaj(48).

hladaj(49) :-
	nl, write('Hladanie receptu podla mena:'), nl,
	cit_meno(Meno), !,
	(recept(Meno, Suroviny, Cas)=..[recept, Meno, Suroviny, Cas],
	recorded(recepty, recept(Meno, Suroviny, Cas), _)),
	nl, write('Meno:  '), write(Meno), nl,
	write('Cas:  '), write(Cas), nl,
	write('Suroviny:  '), write(Suroviny), nl.

vypis([]).
vypis([X|Y]):-
	X=..[_, Meno, Suroviny, Cas],
	write('Meno:  '), write(Meno), nl,
	write('Cas pripravy:  '), write(Cas), nl,
	write('Pouzite ingredients:  '), write(Suroviny), nl, nl,
	get0_noecho(_), vypis(Y).

vypis_sur([]).
vypis_sur([H|T]):-
	write(H), nl, vypis_sur(T).

vypis_surovin([], 0).
vypis_surovin([Surovina-Mnozstvo-Cena|T], Cena1) :-
	write(Surovina), write(' - '),
	write(Mnozstvo), nl,
	vypis_surovin(T, Cena2),
	Cena1 is Cena2 + Mnozstvo * Cena.

hladaj(50) :-
	nl, write('Hladanie receptu podla surovin:'), nl,
	ingredients1(Suroviny), nl,
	not(najdi(Suroviny)).

hladaj(51) :-
	findall(X, recorded(recepty, X, _), Zoznam),
	vypis(Zoznam).

hladaj(52) :-
	findall(X, recorded(ingredients, X, _), Zoznam),
	vypis_sur(Zoznam).

ingredients1([H|T]):-
	write('Meno ingredients:  '),
	read_string(50, X), string_term(X, Meno),
	((string_length(X, 0), main);
	((surovina(Meno, _)=..[surovina, Meno, _],
	not(recorded(ingredients, surovina(Meno, _), _))),
	write('Neznama surovina!'), nl, main);
	H = Meno),
	write('Dalsiu surovinu [A/N]:  '), get(Dalej), nl,
	ifthenelse((Dalej =:= 65; Dalej =:= 97), ingredients1(T), T = []).

najdi(Suroviny) :-
	recept(Meno, X, Cas)=..[recept, Meno, X, Cas],
	recorded(recepty, recept(Meno, X, Cas), _),
	jev(Suroviny, X),
	write('Meno:  '), write(Meno), nl,
	write('Cas:  '), write(Cas), nl,
	write('Suroviny:  '), write(X), nl, nl,
	get0_noecho(_), fail.

jev([], X).
jev([Surovina|T], X) :-
	not(niejev(X, Surovina)),
	jev(T, X).

niejev([], X).
niejev([H-_|T], X) :- H \= X, niejev(T, X).

%zoradit recepty
case(52) :-
	menu2, get(Vyber), nl,
	zorad(Vyber).

menu2 :-
	nl, write('1. Zoradit recepty podla mena'), nl,
	write('2. Zoradit recepty podla ceny'), nl,
	write('3. Zoradit recepty podla casu pripravy'), nl,
	write('0. Navrat do hlavneho menu'), nl,
	write('Zadaj volbu:  ').

zorad(50) :-
	findall(C-M, (recorded(recepty, recept( M, S, _),_),scitaj(S,C)), Y),
	sort(Y, Z),
	tr(Z,X),
	vypis_rec(X).

tr([],[]).
tr([C-M|T],[M|T2]) :-	tr(T,T2).

%zoradenie podla ceny
zorad(49) :-
	findall(Meno, recorded(recepty, recept(Meno, _, _), _), Y),
	sort(Y, Z),
	vypis_rec(Z).

vypis_rec([Meno|T]) :-
	recorded(recepty, recept(Meno, X, Cas), _),
	write('Meno:  '), write(Meno), nl,
	write('Cas:  '), write(Cas), nl,
	write('Suroviny:  '), write(X), nl,
	write('Cena:  '), scitaj(X,Y), write(Y),nl,nl,
	get0_noecho(_), vypis_rec(T).
vypis_rec([]).


zorad(48).
zorad(51) :-
	findall(Cas, recorded(recepty, recept(_, _, Cas), _), Y),
	sort(Y, Z),
	vypis_rec_cas(Z).

vypis_rec_cas([Cas|T]) :-
	recorded(recepty, recept(Meno, X, Cas), _),
	write('Meno:  '), write(Meno), nl,
	write('Cas:  '), write(Cas), nl,
	write('Suroviny:  '), write(X), nl, nl,
	get0_noecho(_), vypis_rec_cas(T).
vypis_rec_cas([]).

%zisti cenu receptu
case(53) :-
	nl, write('Zistenie ceny: '), nl,
	cit_meno(Meno), cit_pocet(Pocet),
	recept(Meno, Suroviny, _)=..[recept, Meno, Suroviny, _], !,
	recorded(recepty, recept(Meno, Suroviny, _), _),
	scitaj(Suroviny, Cena),
	VCena is Cena * Pocet,
	write('Recept '), write(Meno) ,
	write(' pre pocet osob: '), write(Pocet),
	write(' bude stat: '), write(VCena), nl.

cit_pocet(Pocet) :-
	write('Zadaj pocet osob:  '), read_string(50, X),
	string_term(X, Pomoc),
	((string_length(X, 0), main);
	(integer(Pomoc), Pomoc > 0, Pocet = Pomoc);
	(write('Zly pocet osob!'), nl, cit_pocet(Pocet))).

scitaj([], 0).
scitaj([Meno-Mnozstvo|T], Cena) :-
	surovina(Meno, C)=..[surovina, Meno, C],
	recorded(ingredients, surovina(Meno, C), _),
	scitaj(T, C1),
	Cena is C * (Mnozstvo / 1000) + C1.

%najst recepty
case(54) :-
	write('Suroviny:'), nl,
	ingredients1(Suroviny), nl,
	hladaj(Suroviny).

hladaj(Suroviny) :-
	recept(Meno, X, Cas)=..[recept, Meno, X, Cas],
	recorded(recepty, recept(Meno, X, Cas), _),
	urobi(Suroviny, X),
	write('Meno:  '), write(Meno), nl,
	write('Cas:  '), write(Cas), nl,
	write('Suroviny:  '), write(X), nl, nl,
	get0_noecho(_),
	fail.

urobi(Suroviny, []).
urobi(Suroviny, [X-_|T]) :- not(nenachadza1(Suroviny, X)), urobi(Suroviny, T).

nenachadza1([], X).
nenachadza1([H|T], X) :- H \= X, nenachadza1(T, X).

%nacitanie databazy
case(55) :-
	fileerrors(_, off),
	(open(H, databaza, r); write('Subor data neexistuje!'), nl, fail),
	fileerrors(_, on),
	repeat,
	read(H, X),
	(X = end_of_file, !, close(H);
	((X =.. [recept|T],not(recorded(recepty, X, _)),recordz(recepty, X, REF));
	(X =.. [surovina|T],not(recorded(ingredients, X, _)),recordz(ingredients, X, REF));
	true),
	fail).

%uloz databazu
case(56) :-
	create(H, databaza),
	(recorded(recepty, X, _);recorded(ingredients, X, _)),
	[!writeq(H, X), writeq(H, .), nl(H)!],
	fail.

case(56) :- open(H, databaza, r), close(H), X is H - 1, close(X).