文章目录
- 资料
- 一些不同(keng)
- 1、将列表中的integer,float,atom转成字符串并合并成一个字个字符串:[1,a,4.9,"sdfds"] 结果:"1a4.9sdfds"(禁用++ -- append concat实现)
- 2、得到列表或元组中的指定位的元素 {a,g,c,e} 第1位a [a,g,c,e] 第1位a(禁用erlang lists API实现)
- 3、根据偶数奇数过淲列表或元组中的元素(禁用API实现)
- 4、便用匿名函数对列表奇数或偶数过淲
- 5、计算数字列表[1,2,3,4,5,6,7,8,9]索引N到M的和
- 6、查询List1是为List2的前缀(禁用string API实现)
- 7、逆转列表或元组(禁用lists API实现)
- 8、对列表进行排序
- 9、对数字列表进行求和再除以指定的参数,得到商余
- 10、获得当前的堆栈???
- 11、获得列表或元组中的最大最小值(禁用API实现)
- 12、查找元素在元组或列表中的位置
- 14、判断A列表([3,5,7,3])是否在B列表([8,3,5,3,5,7,3,9,3,5,6,3])中出现,出现则输出在B列表第几位开始
- 15、{8,5,2,9,6,4,3,7,1} 将此元组中的奇数进行求和后除3的商(得值A),并将偶数求和后剩3(得值B),然后求A+B结果
- 16、在shell中将unicode码显示为中文???
- 17、传入列表L1=[K|_]、L2=[V|_]、L3=[{K,V}|_],L1和L2一一对应,L1为键列表,L2为值列表,L3存在重复键,把L3对应键的值加到L2???
- 18、删除或查询元组中第N个位置的值等于Key的tuple(禁用lists API实现)
- 19、对一个字符串按指定符字劈分(禁用string API实现)
- 20、合并多个列表或元组
- 21、{5,1,8,7,3,9,2,6,4} 将偶数剩以它在此元组中的偶数位数, 比如,8所在此元组中的偶数位数为1,2所在此元组中的偶数位数为2
- 22、排序[{"a",5},{"b",1},{"c",8},{"d",7},{"e",3},{"f",9},{"g",2},{"h",6},{"i",4}], 以元组的值进行降序 优先用API
- 23、{8,5,2,9,6,4,3,7,1} 将此元组中的奇数进行求和
- 24、传入任意I1、I2、D、Tuple四个参数,检查元组Tuple在索引I1、I2位置的值V1、V2,如果V1等于V2则删除V1,把D插入V2前面,返回新元组,如果V1不等于V2则把V2替换为V1,返回新元组。注意不能报异常,不能用try,不满足条件的,返回字符串提示
- 25、删除列表或元组中全部符合指定键的元素
- 26、替换列表或元组中第一个符合指定键的元素
- 27、将指定的元素插入到列表中指定的位置,列表中后面的元素依次向后挪动
- 28、对[6,4,5,7,1,8,2,3,9]进行排序(降序--冒泡排序)或API排序
- 30、移除元组或列表中指定位置的元素
- 31、指定列表第几位之后的数据进行反转。如:指定[2,3,5,6,7,2]第3位后进行反转(谢绝一切API(lists:concat,lists:reverse等)、++、--方法)
- 32、使用“匿名函数”检查列表的每个元素是否符合传入的最大最小值(都是闭区间)
- 33、获得列表或元组的最大最小值
- 34、成生指定数量元组,每个元素为随机integer元素, 元素不能有相同的
- 35、对一个int进行位移操作,取出0到16位的数据,16到32位的数据,输出这两个数
- 36、输入A(元子列表),B(数值列表)两个相同长度的参数进行随机匹配(要求字母为Key,数值为Value),支持指定的Key和Value在一组
- 37、对相同类型的数据进行拼接,如binary(<<1,2>><<3,4>> =<<1,2,3,4>>) tuple({a,b},{c} ={a,b,c}) list([10],[20] =[10,20])
- 38、将列表中相同key的值进行合并,[{a,1},{b,2},{c,3},{b,4},{b,5},{c,6},{d,7},{d,8}]
- 39、Erlang程序设计(第2版)中5.3节的count_characters方法有错,自行修改证
资料
erlong 中文手册
阔以用来查找erlong的库函数的用法:erlong 中文手册
一些不同(keng)
1
好像if后面的判断条件(guard关卡)不能是函数,case后的就行
1、将列表中的integer,float,atom转成字符串并合并成一个字个字符串:[1,a,4.9,“sdfds”] 结果:“1a4.9sdfds”(禁用++ – append concat实现)
erl文件
-module(lpfmerge).
-export([getstr/1,to_string/1]).
getstr([])->"";
getstr([H|T])->
if
is_atom(H)->[atom_to_list(H)|getstr(T)];
is_integer(H)->[integer_to_list(H)|getstr(T)];
is_float(H)->[float_to_list(H,[{
decimals,1}])|getstr(T)]; %注意这里小数点保留一位
is_list(H)->[H|getstr(T)]
end.
to_string(L)->binary_to_list(list_to_binary(getstr(L))).
最后一句就是先转换成 二进制文件 然后再转换回list,不然就会成下面第四个运行代码那样是分开的
输入erlong shell测试
PS D:\lpf\lpf练习题\未完成\1> erl
Eshell V8.3 (abort with ^G)
1> c(lpfmerge).
{
ok,lpfmerge}
2> L=[1,a,4.9,"sdfds"].
[1,a,4.9,"sdfds"]
3> lpfmerge:to_string(L).
"1a4.9sdfds"
4> lpfmerge:getstr(L).
["1","a","4.9","sdfds"]
5>
2、得到列表或元组中的指定位的元素 {a,g,c,e} 第1位a [a,g,c,e] 第1位a(禁用erlang lists API实现)
erl文件
先用2个参数的把元组都统一弄成列表 然后再处理
-module(q2).
-export([getPosVal/2]).
getPosVal([],Pos)->[]; %列表为空
getPosVal({
},Pos)->{
}; %元组为空
getPosVal(L,Pos)->
if
is_tuple(L)->
getPosVal(tuple_to_list(L),Pos); %如果是元组,就先转换成列表
true->
getPosVal(L,Pos,1)
end.
getPosVal([H|T],Pos,Index)when Pos==Index->H;
getPosVal([H|T],Pos,Index)->getPosVal(T,Pos,Index+1).
输入erlong shell测试
PS D:\lpf\lpf练习题\已完成\2> erl
Eshell V10.7 (abort with ^G)
1> c(q2).
q2.erl:4: Warning: variable 'Pos' is unused
q2.erl:5: Warning: variable 'Pos' is unused
q2.erl:14: Warning: variable 'T' is unused
q2.erl:15: Warning: variable 'H' is unused
{
ok,q2}
2> L=[10,20,30,40,50,60].
[10,20,30,40,50,60]
3> q2:getPosVal(L,3).
30
4>
3、根据偶数奇数过淲列表或元组中的元素(禁用API实现)
erl文件
-module(lpffilter).
-export([filter/1]).
filter([])->[];
filter({
})->{
};
filter([H|T])->
if
is_tuple(H)
->filter(tuple_to_list(H)); %之前写成 ->filter([tuple_to_list(H)|T]);就不对,为啥喃?
(H rem 2)=:=0
->[H|filter(T)];
true
->filter(T)
end.
输入erlong shell测试
PS D:\lpf\lpf练习题\已完成\3> erl
Eshell V8.3 (abort with ^G)
1> c(lpffilter).
{
ok,lpffilter}
2> L=[1,2,3,4,5,6,7,8,{
9,10,11,12},13,14,15,16].
[1,2,3,4,5,6,7,8,{
9,10,11,12},13,14,15,16]
3> lpffilter:filter(L).
[2,4,6,8,10,12]
4>
4、便用匿名函数对列表奇数或偶数过淲
erl文件
-module(q4).
-export([filter/2]).
filter(F,[H|T])->
case F(H) of
true->[H|filter(F,T)];
false->filter(F,T)
end;
filter(F,[])->[].
输入erlong shell测试
PS D:\lpf\lpf练习题\已完成\4> erl
Eshell V10.7 (abort with ^G)
1> c(q4).
q4.erl:16: Warning: variable 'F' is unused
{
ok,q4}
2> L=[1,2,3,4,5,6,7,8].
[1,2,3,4,5,6,7,8]
3> F=fun(X)->(X rem 2) =:=0 end.
#Fun<erl_eval.7.126501267>
4> q4:filter(F,L).
[2,4,6,8]
5>
5、计算数字列表[1,2,3,4,5,6,7,8,9]索引N到M的和
erl文件
我是写的for循环来做的,计算的是 [ I , J ) [I,J) [I,J) 左闭右开区间的和
用if判断:
-module(lpffor).
-export([for/4]).
for(Index,I,J,[H|T])->
if
(Index>=I) and (Index<J)
->H+for(Index+1,I,J,T);
true
->for(Index+1,I,J,T)
end;
for(Index,I,J,[])->0.
用 when 判断:
-module(lpffor).
-export([for/4]).
for(Index,I,J,[H|T]) when (Index>=I) , (Index<J)
->H+for(Index+1,I,J,T);
for(Index,I,J,[H|T])
->for(Index+1,I,J,T);
for(Index,I,J,[])
->0.
输入erlong shell测试
PS D:\lpf\lpf练习题\未完成\5> erl
Eshell V8.3 (abort with ^G)
1> c(lpffor).
lpffor.erl:11: Warning: variable 'I' is unused
lpffor.erl:11: Warning: variable 'Index' is unused
lpffor.erl:11: Warning: variable 'J' is unused
{
ok,lpffor}
2> L=[10,20,30,40,50,60,70,80,90].
[10,20,30,40,50,60,70,80,90]
3> lpffor:for(1,2,7,L).
200
4>
6、查询List1是为List2的前缀(禁用string API实现)
erl文件
这是看的别人的代码,原来export中只写在外面调用的函数就行,里面用到的其他函数可以不写,比如这里用了is_prefix2
还有就是,要想对列表操作的话,参数就要写成,(H|T)这种,这样写的话又不能表示整体的这个列表了,所以这里要弄两个
-module(q6).
-export([is_prefix/2]).
is_prefix([], L2) -> false;
is_prefix([], []) -> false;
is_prefix(L1, L2) ->
if
length(L1) >= length(L2)
-> false;
true
-> is_prefix2(L1,L2)
end.
is_prefix2([H1|T1],[H2|T2]) ->
if
(H1 == H2 andalso T1 == [] )
-> true;
H1 == H2
-> is_prefix2(T1,T2);
H1 /= H2
-> false;
T1 == []
-> true
end.
输入erlong shell测试
PS D:\lpf\lpf练习题\未完成\6> erl
Eshell V8.3 (abort with ^G)
1> c(q6).
q6.erl:4: Warning: variable 'L2' is unused
q6.erl:5: Warning: this clause cannot match because a previous clause at line 4 always matches
{
ok,q6}
2> L1=[1,2,3].
[1,2,3]
3> L2=[1,2,3,4,5].
[1,2,3,4,5]
4> L3=[2,3,4].
[2,3,4]
5> q6:is_prefix(L1,L2).
true
6>
7、逆转列表或元组(禁用lists API实现)
erl文件
-module(lpfReverse).
-export([lpfreverse/1,lpfreverse/2]).
lpfreverse(L)->lpfreverse(L,[]).
lpfreverse([H|T],Reversed)->lpfreverse(T,[H|Reversed]);
lpfreverse([],Reversed)->Reversed.
输入erlong shell测试
PS D:\lpf\lpf练习题\未完成\7> erl
Eshell V8.3 (abort with ^G)
1> c(lpfReverse).
{
ok,lpfReverse}
2> L=[1,3,5,7,9].
[1,3,5,7,9]
3> lpfReverse:lpfreverse(L).
[9,7,5,3,1]
4>
8、对列表进行排序
erl文件
书上的快排例子,erlong写快排好简洁呀ヽ( ̄▽ ̄)ノ
-module(lpfsort).
-export([sort/1]).
sort([])->[];
sort([Mid|T])
->sort([X||X<-T , X<Mid]) ++ [Mid] ++ sort([X||X<-T , X>=Mid]).
9、对数字列表进行求和再除以指定的参数,得到商余
erl文件
-module(q9).
-export([get_sum_rem/2]).
get_sum_rem(L,Num)
->{
sum(L)/Num,sum(L) rem Num}.
sum([H|T])->H+sum(T);
sum([])->0.
输入erlong shell测试
PS D:\lpf\lpf练习题\未完成\9> erl
Eshell V8.3 (abort with ^G)
1> c(q9).
q9.erl: no such file or directory
error
2> c(q9).
{
ok,q9}
3> L=[10,20,30,40,50].
[10,20,30,40,50]
4> q9:get_sum_rem(L,7).
{
21.428571428571427,3}
5> 150/7.
21.428571428571427
6>
10、获得当前的堆栈???
这个是直接在shell里写
大概就是写一个会产生错误的函数,比如 generate_exception(1),因为看下面错误信息的第一行 shell_undef ,意思是没有定义这个函数
然后就会报错,调用get_stacktrace()就能得到栈的信息了
PS D:\lpf\lpf练习题\未完成\10> erl
Eshell V8.3 (abort with ^G)
1> try generate_exception(1)
catch
error:X->
{
X,erlang:get_stacktrace()}
end.
{
{
shell_undef,generate_exception,1,[]},
[{
shell,shell_undef,2,[{
file,"shell.erl"},{
line,1061}]},
{
erl_eval,local_func,6,[{
file,"erl_eval.erl"},{
line,562}]},
{
erl_eval,try_clauses,8,[{
file,"erl_eval.erl"},{
line,904}]},
{
shell,exprs,7,[{
file,"shell.erl"},{
line,686}]},
{
shell,eval_exprs,7,[{
file,"shell.erl"},{
line,641}]},