% (1).扩展 geometry.erl 添加一些子句来计算圆和直角三角形的面积。
% 添加一些子句来计算各种几何图形的周长
-module(geometry).
-export([area/1]).
area({rectangle, Width, Height}) ->
Width * Height;
area({square, Side}) ->
Side * Side;
% 计算圆面积
area({round, Radius}) ->
3.1415 * Radius * Radius.
% (2).内置函数 tuple_to_list(T) 能将元组T里的元素转换成一个列表。
% 请编写一个名为 my_tuple_to_list() 的函数来做同样的事。
% 不要使用内置函数
-module(mytupletolist).
%-export([my_tuple_to_list/1, my_tuple_to_list/4]). 注意不能这么写
-export([my_tuple_to_list/1]).
% T是元组,F是伐值=>0,L是列表
my_tuple_to_list(T) ->
my_tuple_to_list(T, tuple_size(T), 0, []).
my_tuple_to_list(T, Index, F, L) when Index > F ->
my_tuple_to_list(T, Index-1, F, [element(Index, T) | L]);
my_tuple_to_list(T, Index, F, L) when Index =:= F ->
L.
% (3).查看 erlang:now/0、erlang:data/0 和 erlang:time/0 的定义。
% 编写一个名为 my_time_func(F) 的函数,让它执行 fun F 并记下执行时间。
% 编写一个名为 my_date_string() 的函数,用它把当前的日期和时间改成整齐的格式
-module(mytimefunc).
-export([my_time_func/1, my_date_string/0]).
my_time_func(F) ->
%{MegaSecs1, Secs1, MicroSecs1} = erlang:now(),
{Hour1, Minute1, Second1} = erlang:time(),
F,
%{MegaSecs2, Secs2, MicroSecs2} = erlang:now(),
{Hour2, Minute2, Second2} = erlang:time(),
io:format("runtime:~f~n", [((Hour2-Hour1)/3600+(Minute2-Minute1)/60+(Second2-Second1))/1000]).
my_date_string() ->
{Year, Month, Day} = erlang:date(),
{Hour, Minute, Second} = erlang:time(),
io:format("~p年~p月~p日:~p时~p分~p秒~n", [Year, Month, Day, Hour, Minute, Second]).
% (4).高级练习,查找Python datetime 模块手册页。找出Python的datetime类里有多啊函数哦啊方法
% 可以通过erlang模块里有关时间的内置函数实现。在erlang的手册页里查找等价的函数。
% 如果有明显的遗漏,就实现它。
戳 这里 查看相关模块,也可以在python shell
中输入 import datetime 后,再输入 help(datetime) 查看相关模块。
这个问题就不一一实现了,大家感兴趣可以去看看。
% (5).编写一个名为 math_functions.erl 的模块,并导出函数 even/1 和 odd/1。
% even(X) 函数应当是偶整数时返回 true,否则返回false。odd(X)应当在 X 是奇整数时返回 flase
-module(mathfunctions).
-export([even/1, odd/1]).
even(X) when is_integer(X) ->
case (X rem 2 =:= 0) of
true -> true;
false -> false
end.
odd(X) when is_integer(X) ->
case (X rem 2 =/= 0) of
true -> true;
false ->false
end.
% (6).向 math_functions.erl 添加一个名为 filter(F, L) 的高阶函数,
% 它返回 L 里所有符合条件的元素 X (条件是F(X)为true)
-module(mathfunctions).
-export([filter/2]).
filter(F, L) ->
[X || X <- L, F(X) =:= true].
% (7).向 math_functions.erl 添加一个返回{Even,Odd}的split(L)函数,
% 其中 Even 是一个包含 L 里所有偶数的列表,Odd是一个包含L里所有技术的列表。
% 请用两种不同的方式编写这个函数,一种使用归集器,另一种使用在联系6中编写的filter函数。
-module(mathfunctions).
-export([split/1]).
%归集器版本,只遍历一遍,但结果是反的
%split(L) ->
% split(L, [], []).
%split([H|L], Odd, Even) ->
% case (H rem 2 =:= 0) of
% true -> split(L, Odd, [H|Even]);
% false -> split(L, [H|Odd], Even)
% end;
%split([], Odd, Even) ->
% {Even, Odd}.
%遍历两遍
split(L) ->
Odd = [X || X <- L, (X rem 2) =/= 0],
Even = [X || X <- L, (X rem 2) =:= 0],
{Even, Odd}.