CodeMan

Each of us must find a way to love the world. You have found yours.

0%

Programming Erlang exercise 4.11

####找到erlang模块手册页,你会看到它列出了大量的内置函数(远多于我们现在这里讨论过的)。可以用这些信息来解决下面列出的一些问题。

在线手册页:http://www.erlang.org/doc/man/erlang.html

1.扩展geometry.erl。添加一些子句来计算圆和直角三角形的面积。添加一些子句来计算各种几何图形的周长。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
%% coding: latin-1
%%%-------------------------------------------------------------------
%%% @author yfy
%%% @copyright (C) 2016, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 14. 二月 2016 下午3:57

%%%-------------------------------------------------------------------
-module(geometry).
-author("yfy").

-import(math,[pow/2]).

%% API
-export([area/1, circum/1]).

area({rectangle, Width, Height}) ->
Width * Height;

area({square, Side}) ->
Side * Side;

area({circle, Radius}) ->
3.14 * Radius * Radius;

area({right_triangle, SideA, SideB}) ->
SideA * SideB / 2.


circum({rectangle, Width, Height}) ->
(Width + Height) * 2;

circum({square, Side}) ->
Side * 4;

circum({circle, Radius}) ->
2 * 3.14 * Radius;

circum({right_triangle, SideA, SideB}) ->
(SideA + SideB) + math:sqrt(math:pow(SideA, 2) + math:pow(SideB,2)).

2.内置函数tuple_to_list(T)能将元组T里面的元素转换成一个列表。请编写一个名为my_tuple_to_list(T)的函数来做同样的事,但不要使用相同功能的内置函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
%% coding: latin-1
%%%-------------------------------------------------------------------
%%% @author yfy
%%% @copyright (C) 2016, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 16. 二月 2016 下午3:18
%%%-------------------------------------------------------------------
-module(my_tuple_to_list).
-author("yfy").

%% API
-export([m_tuple_to_list/1]).


m_tuple_to_list(T) ->
m_tuple_to_list(T, tuple_size(T), []).

m_tuple_to_list(T, N, Result) ->
if
N > 0 -> m_tuple_to_list(T, N - 1, [element(N, T) | Result]);
N =< 0 -> Result
end.

3.查看erlang:now/0、erlang:date/0和erlang:time/0的定义。编写一个名为my_time_func(F)函数,让它执行fun F并记下执行时间。编写一个名为my_date_string()的函数,用它把当前的日期和时间改成整齐的格式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
%% coding: latin-1
%%%-------------------------------------------------------------------
%%% @author yfy
%%% @copyright (C) 2016, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 16. 二月 2016 下午3:55
%%%-------------------------------------------------------------------
-module(my_time).
-author("yfy").

%% API
-export([my_time_func/1, my_date_string/0]).

%% F = fun() -> math:pow(2,1000) end.

my_time_func(F) ->
{G, S, M} = now(),
F(),
{G1, S1, M1} = now(),
{(G1 - G), (S1 - S), (M1 - M)}.


my_date_string() ->
{Year, Month, Day} = date(),
{Hour, Seconds, Minuts} = time(),
L = tuple_to_list({integer_to_list(Year), "-", integer_to_list(Month), "-", integer_to_list(Day), " ", integer_to_list(Hour), ":", integer_to_list(Seconds), ":", integer_to_list(Minuts)}),
list_to_bitstring(L).

4.高级练习:查找Python datetime模块的手册页。找出Python的datetime类里有多少方法可以通过erlang模块里有并时间的内置函数实现。在erlang的手册页里查找等价的函数。如果有明显的遗漏,就实现它。

python datatime doc: https://docs.python.org/2/library/datetime.html

5.编写一个名为math_functions.erl的模块,并导出函数even/1各odd/1。even(X)函数应当在X是偶数时返回true,否则返回false.odd(X)应当在X是奇整时返回true。
6.向math_functions.erl添加一个名为filter(F,L)的高阶函数,它返回L里所有符合条件的元素X(条件是F(X)为true)。
7.向math_functions.erl添加一个返回{Even,Odd}的split(L)函数,其中Even是一个包含L里所有偶数的列表,Odd是一个包含L里所有奇数的列表。请用两钏不同的方式编写这个函数,一种使用归集器,另一种使用在练习6中编写的filter函数。