-module(dpr). -export([qsort/1,pitag/1,perms/1,area/1,area1/1,area2/1,fac/1,fac1/1,fac2/1, double/1,map/2,filter1/2,filter11/2,filter2/2,sum1/1,sum2/1, filter3/2,map2/2,guards1/1,guards2/1,guards3/1,guards4/1, guards5/1,guards6/1,guards7/1,guards8/1,len/1,fib/1,leni/1, fibi/1,faci/1,sumi/1,average1/1,average2/1,is_member/2, listmax/1,listmaxi/1,average/1,listMax/1,listMin/1,listAppend/2, foldr/3,foldl/3,genExc/2,tryGenExc/2]). pi() -> 3.14159. area1({circle,R}) -> R*R*pi(); area1({rectan,A,B}) -> A*B; area1({square,A}) -> A*A. area2({circle,R}) -> R*R*math:pi(); area2({rectan,A,B}) -> A*B; area2({square,A}) -> A*A. -define(pi,3.14159). area({circle,R}) -> R*R*?pi; area({rectan,A,B}) -> A*B; area({square,A}) -> A*A. %% c(area). %% l(area). %% dpr:area1({circle,2}). %% dpr:area1({rectan,2.5,4}). %% dpr:area1({square,2.5}). %% dpr:area({circle,2}). %% dpr:area({rectan,2.5,4}). %% dpr:area({square,2.5}). double(X) -> 2*X. %% D1 = fun dpr:double/1. %% lists:map(D1,[1,2.3,5]). %% lists:map(fun(X) -> 2*X end,[1,2.3,5]). %% D2 = fun(X) -> 2*X end. %% lists:map(D2,[1,2.3,5]). %% D2(3.3). %% fun(X) -> 2*X end (3.3). %% (v(?))(3.3). %% F1 = fun(X) -> round(X) end, lists:map(F1,[4.5,6.7,8.3,9.1]). %% lists:map(fun(X) -> round(X) end,[4.5,6.7,8.3,9.1]). %% F2 = fun erlang:round/1, lists:map(F2,[4.5,6.7,8.3,9.1]). %% lists:map(fun erlang:round/1,[4.5,6.7,8.3,9.1]). %% F3 = fun erlang:is_atom/1, lists:filter(F3,[a,"a",'A',2,9.3,'+']). %% lists:filter(fun erlang:is_atom/1,[a,"a",'A',2,9.3,'+']). %% F4 = fun(X,Y) -> X+Y end, lists:foldl(F4,0.0,[1,2,3,4,5]). %% F5 = fun(X,Y) -> X+Y end, lists:foldr(F5,0.0,[1,2,3,4,5]). %% lists:foldl(fun(X,Y) -> X+Y end,0.0,[1,2,3,4,5]). %% lists:foldr(fun(X,Y) -> X+Y end,0.0,[1,2,3,4,5]). sum1([]) -> 0; sum1([H|T]) -> H + sum1(T). %% dpr:sum1([1,2,3,4,5]). sum2(L) -> sum21(L,0). sum21([],A) -> A; sum21([H|T],A) -> sum21(T,H+A). %% dpr:sum2([1.2,2.3,3.4,4.5,5.6]). %% qsort([]) -> []; qsort([Pivot|Tail]) -> qsort([X || X <- Tail, X < Pivot]) ++ [Pivot] ++ qsort([X || X <- Tail, X >= Pivot]). %% dpr:qsort([23,9,2,6,27,45,61,82,14,45,78]). pitag(N) -> [{A,B,C} || A <- lists:seq(1,N), B <- lists:seq(1,N), C <- lists:seq(1,N), A+B+C =< N, A*A+B*B =:= C*C ]. %% dpr:pitag(30). perms([]) -> [[]]; perms(L) -> [[H|T] || H <- L, T <- perms(L--[H])]. %% dpr:perms([1,2,3]). %% dpr:perms("dac"). %% Area1 = fun ({circle,R}) -> R*R*3.14159; %% ({rectan,A,B}) -> A*B; %% ({square,A}) -> A*A %% end. %% Area1({circle,2}). %% Area2 = fun dpr:area/1. %% Area2({square,2.5}). %% fun dpr:area/1({circle,5.2}). %% F1 = [Area1, Area2, fun dpr:area/1, 12, area]. %% (lists:nth(1,F1))({circle,2}). %% (lists:nth(3,F1))({circle,2}). %% fac: lineáris rekurzió %% nem elég biztonságos %% negatív értékekre végtelen a rekurzió fac(0) -> 1; fac(N) -> N*fac(N-1). %% fac1: javított változat %% biztonságos, de költségesebb fac1(0) -> 1; fac1(N) when is_integer(N), N>0 -> N*fac1(N-1). %% fac2 a klózok sorrendjére sem érzékeny fac2(N) when is_integer(N), N>0 -> N*fac2(N-1); fac2(0) -> 1. %% true és term mint őr %% if true -> "sik"; true -> "hiu" end. %% if false -> "sik"; true -> "hiu" end. %% if alma -> "sik"; true -> "hiu" end. %% if X -> "sik"; true -> "hiu" end. %% if (1+2) -> "sik"; true -> "hiu" end. %% példák őrökre guards1(X) when is_integer(X), X > 0 -> X. guards2(X) when is_number(X), X =< 0 -> X. guards3(X) when is_tuple(X), tuple_size(X) >= 2, element(2,X) =:= valami -> X. guards4(X) when is_list(X), (length(X) >= 4 orelse hd(X) =:= 'A') -> X. guards5({X,Y,Z}) when X > Y; X > Z -> X. % réteges minta: {X,Y} = XY guards6({X,Y} = XY) when integer(X), X > 0; integer(Y), Y < 0 -> XY. guards7([X,Y|Z]) when is_integer(X), is_integer(Y) andalso X>0; Y>0 andalso Z =/= [] -> {X,Y,Z}. guards8([X,Y|Z]) when is_integer(X), is_integer(Y), is_integer(hd(Z)) -> {X,Y,Z}. %% len: lista hossza len([]) -> 0; len([_|T]) -> 1 + len(T). %% fib: kétfelé ágazó rekurzió fib(0) -> 0; fib(1) -> 1; fib(N) -> fib(N-2) + fib(N-1). %% len iteratív változata sokkal olcsóbb! leni(L) -> leni(L,0). leni([],N) -> N; leni([_|T],N) -> leni(T,N+1). %% len iteratív változata sokkal olcsóbb! fibi(0) -> 0; fibi(N) -> fibi(N,0,1). fibi(1,_Prev,Curr) -> Curr; fibi(N,Prev,Curr) -> fibi(N-1,Curr,Prev+Curr). %% fac iteratív változata is sokkal olcsóbb! faci(N) when is_integer(N), N>=0 -> faci(N,1). faci(0,R) -> R; faci(N,R) -> faci(N-1,N*R). % average average1(L) -> sumi(L) / leni(L). sumi(L) -> sumi(L,0). average2(L) -> average2(L,0,0). average2([],Sum,Len) -> Sum/Len; average2([H|T],Sum,Len) -> average2(T,Sum+H,Len+1). sumi([],Sum) -> Sum; sumi([H|T],Sum) -> sumi(T,H+Sum). % is_member is_member(_X, [])-> false; is_member(X, [X|_]) -> true; is_member(X, [_|T]) -> is_member(X,T). % listmax max(X,Y) when X >= Y -> X; max(_X,Y) -> Y. listmax([]) -> undefined; listmax([X]) -> X; listmax([X|T]) -> max(X,listmax(T)). listmaxi([]) -> undefined; listmaxi([X]) -> X; listmaxi([X,Y|T]) -> listmaxi([max(X,Y)|T]). % magasabb rendű függvények alkalmazása % átlagolás average(L) -> lists:foldl(fun(X,Y) -> X+Y end,0,L) / length(L). % lista maximuma, minimuma: listMax([]) -> undefined; listMax([H|T]) -> lists:foldl(fun max/2,H,T). listMin([]) -> undefined; listMin([H|T]) -> F = fun(X,Y) when X >= Y -> Y; (X,_Y) -> X end, lists:foldl(F,H,T). listAppend(L1,L2)-> foldr(fun(E,L) -> [E|L] end,L2,L1). map(_Fun,[]) -> []; map(Fun, [H|T]) -> [Fun(H)|map(Fun,T)]. %% dpr:map(fun erlang:float/1, [4,6,8,9]). filter1(_Pred,[]) -> []; filter1(Pred,[H|T]) -> filter11(Pred(H),H) ++ filter1(Pred,T). filter11(true,H) -> [H]; filter11(false,_) -> []. %% dpr:filter1(fun erlang:is_number/1, [a,"a",'A',2,9.3,'+']). filter2(_Pred,[]) -> []; filter2(Pred,[H|T]) -> case Pred(H) of true -> [H|filter2(Pred,T)]; false -> filter2(Pred,T) end. %% dpr:filter2(fun erlang:is_float/1, [a,"a",'A',2,9.3,'+']). %% dpr:map(fun erlang:float/1, [4,6,8,9]). %% [float(X) || X <- [4,6,8,9]]. %% dpr:filter1(fun erlang:is_number/1, [a,"a",'A',2,9.3,'+']). %% [X || X <- [a,"a",'A',2,9.3,'+'], is_number(X)]. filter3(Pred,L) -> [X || X <- L, Pred(X)]. %% dpr:filter3(fun erlang:is_integer/1, [a,"a",'A',2,9.3,'+']). map2(Fun,L) -> [Fun(X) || X <- L]. %% dpr:map2(fun erlang:trunc/1, [4.5,6.7,8.3,9.1]). foldr(_,Acc,[]) -> Acc; foldr(Fun,Acc,[H|T]) -> Fun(H,foldr(Fun,Acc,T)). foldl(_,Acc,[]) -> Acc; foldl(Fun,Acc,[H|T]) -> foldl(Fun,Fun(H,Acc),T). %%% rr("dprrec.hrl"). %%% X = #'TODO'{}. % Új rekord (X) létrehozása %%% X1 = #'TODO'{sts=urgent, txt="Diak!"}. % Új rekord (X1) létrehozása %%% X2 = X1#'TODO'{sts=done}. % Rekord (X1) másolása frissítéssel %%% #'TODO'{who=W, txt=T} = X2. % Mezőértékek lekérdezése %%% W. %%% T. %%% X1#'TODO'.sts. %%% rf('TODO'). %%% X2. genExc(A,1) -> A; genExc(A,2) -> throw(A); genExc(A,3) -> exit(A); genExc(A,4) -> erlang:error(A). tryGenExc(X,I) -> try genExc(X,I) of Val -> {I, 'Lefutott', Val} catch throw:X -> {I, 'Kivetelt dobott', X}; exit:X -> {I, 'Befejezodott', X}; error:X -> {I, 'Sulyos hibat jelzett', X} end.