程序设计习题 第 8 章 表一表

 

8.2 序表与排列

1. 有字段名:["user_id","age","due_amt","due_date","user_score"]

数据:[[748147, 21, 258.7045, 2018/5/25, 0.7],[672952, 37, 307.927, 2018/7/9,0],[404196, 24, 252.9809, 2018/3/18, 0.542857],[342769, 23, 107.6503, 2018/2/13, 0.073529],[828139, 23, 201.0499, 2018/7/1, 0.666667]]

1)用给出的字段名和数据生成一个序表,数据的每一个子序列为一条记录

2)在序表的第1条记录前插入一行数据795130,31, 3730.995, 2018/11/25, 0.142857

3)求序表的长度

4)取序表第1条记录

5)取序表的倒数第3条记录

6)比较(4)(5)的user_score值,输出分数高的user_id

7)取序表的第35

8)取序表的第135

9)将(8)中的第2user_score改为0.85,并观察原表和(7)中同一记录的变化

10)将排列(7)和(8)求并集,并计算合并后的长度

11)创建一个新的序表,字段名为Id,Age,Amt

12)将(10)中记录按照对应的字段插入到(11

13)将(1)的原始序表保存为”user_1.xlsx”,(10)的序表保存为”user_2.xlsx”

2. 将第1题中生成的”user_1.xlsx””user_2.xlsx”合并成一个文件命名为”user.xlsx”

3. 将文件”user.xlsx”按照行数拆分,每3行拆分为一个小文件,命名为user1user2……

8.3 序表生成

1. "user_id","age","due_amt","due_date","user_score"为字段名

序列[[748147, 21, 258.7045, 2018/5/25, 0.7],[672952, 37, 307.927, 2018/7/9,0],[404196, 24, 252.9809, 2018/3/18, 0.542857],[342769, 23, 107.6503, 2018/2/13, 0.073529],[828139, 23, 201.0499, 2018/7/1, 0.666667]]的每一个子成员为一条记录,生成序表如下图。

..

2. 向第1题的序表中插入100条数据,其中”user_id””age”取随机整数,”due_amt””user_score”取随机浮点数,”due_date”2018年的任意一天,并将表格保存为”user_104.xlsx”

3. 用字段”amt_flag”标出第2题序表中”due_amt”大于500的用户,大于500标为1反之为0(用A.new()A.derive()分别实现)

4. 8.2习题中的”user_1.xlsx””user_2.xlsx”合并,并追加列”File”,显示数据来源

8.4 循环函数

1.

1)用程序生成一张学生成绩表,效果如下图。学生id取值为150,成绩取100以内的随机数。

..

2)计算数学最高分,英语平均分和总分最低分

3)找出数学最高的学生和总分最低的学生

4)分别筛选出英语在80分以上的人和数学80分以上的人

5)筛选出英语或数学在80分以上的人

6)筛选出英语80分以上但数学没达到80分的人

7)计算英语和数学都在80分以上的人的总分最高分

8)在成绩单上添加字段”total”计算总分,并按照总分排序,从高到低

9)将成绩单按照英语从高到低,体育从低到高排序

10)计算前5名总分和总分前5名的人

11)把”student_id”修改为字符串格式

12)添加字段”total_rank”表示每名学生的排名,并将total_rank<=25的人评价为A,其余为B,用字段flag表示

13)计算这批学生中A级和B级学生数学分数差最大值

14)计算A级和B级学生数学分数差最大的学生对

2. Excel里某产品20211月份的日销售数据

..

1)筛选出偶数日的销售额数据

2)筛选出周六日的销售额数据

3)计算每日的销售额涨幅和累计销售额

4)计算该产品销售额最长连续上涨了多少日

5)计算销售额最高那天的涨幅

6)计算销售额超过15万的日期和涨幅

3. 有订单销售表Orders.xlsx如下图,统计出 2014 年每个月达到 20 笔订单所需天数

..

统计效果如图

..

8.5 字段上的计算

1.

1)用程序生成一张学生成绩表,效果如下图。学生id取值为150,成绩取100以内的随机数。(用宏实现)

..

2)在所有列前面插入一列class,表示学生所在班级,1-25号学生为one26-50号为two

3)添加字段total,计算每名学生的总成绩

2. 将第1题中的学生成绩表英语成绩修改为60-100之间的随机数

3. 将学生成绩表中的各科成绩分箱处理,改用ABC表示,90分以上为A60-89B60分以下为C。修改效果如图

..

4. 在员工信息登记表文件staff.xlsx中,每个sheet有员工信息及他的家庭成员信息,请将员工信息及家庭成员信息分别解析成两个结构化数据表。其中一个sheet如下图:

..

解析效果

员工信息表:

..

家庭成员信息表:

..

参考答案

8.2 序表与排列

1.


A B C
1 ["user_id","age","due_amt","due_date","user_score"] [[748147, 21, 258.7045, 2018/5/25, 0.7],[672952, 37, 307.927, 2018/7/9,0],[404196, 24, 252.9809, 2018/3/18, 0.542857],[342769, 23, 107.6503, 2018/2/13, 0.073529],[828139, 23, 201.0499, 2018/7/1, 0.666667]] =([A1]|B1).record()
2 =C1.insert(1,795130,31, 3730.995, string(“2018/11/25”), 0.142857)
3 =C1.len()
4 =C1(1)
5 =C1.m(-3)
6 >output("user"/if(A4.user_score>A5.user_score,A4.user_id,A5.user_id)/"is better")
7 =C1.to(3,5)
8 =C1.m([1,3,5])
9 >A8(2).user_score=0.85
10 =A7&A8 =A10.len()
11 =create(Id,Age,Amt)
12 =A11.insert(0:A10,user_id:Id,age:Age,due_amt:Amt)
13 =file("user_1.xlsx").xlsexport@t(C1) =file("user_2.xlsx").xlsexport@t(A10)

2.


A
1 =directory@p("data/*.xlsx").(file(~).xlsimport@t()).conj()
2 >file("user.xlsx").xlsexport@t(A1)

3.


A
1 =file("user.xlsx").xlsimport@t()
2 =A1.len().step(3,1)
3 =A2.(file("data/user"/#/".xlsx").xlsexport@t(A1.to(~,~+2)))

8.3 序表生成

1-3

4.


A
1 [[748147, 21, 258.7045, 2018/5/25, 0.7],[672952, 37, 307.927, 2018/7/9,0],[404196, 24, 252.9809, 2018/3/18, 0.542857],[342769, 23, 107.6503, 2018/2/13, 0.073529]]
2 =A1.new(A1(#)(1):user_id,A1(#)(2):age,A1(#)(3):due_amt,date(A1(#)(4),"yyyy/MM/dd"):due_date,A1(#)(5):user_score)
3 =A2.insert(0:100,int(rand()*1000000):user_id,rand(42)+18:age,rand()*1000:due_amt,date("2018-01-01")+rand(365):due_date,rand():user_score)
4 >file("C:/Users/29636/Desktop/tmp/user_104.xlsx").xlsexport@t(A3)
5 =A2.new(user_id,if(due_amt>500,1,0):amt_flag)
6 =A2.derive(if(due_amt>500,1,0):amt_flag)


A
1 =directory@p("data/*.xlsx")
2 =A1.(file(~).xlsimport@t().derive(filename@n(A1.~):File)).conj()
3 >file("user.xlsx").xlsexport@t(A2)

8.4 循环函数

1.


A B C
1 =50.new(~:student_id,rand(100):English,rand(100):Math,rand(100):PE)
2 =A1.max(Math) =A1.avg(English) =A1.min(English+Math+PE)
3 =A1.maxp@a(Math) =A1.minp@a(English+Math+PE)
4 =A1.select(English>=80) =A1.select(Math>=80)
5 =A4&B4
6 =A4\B4
7 =(A4^B4).max(English+Math+PE)
8 =A1.derive(English+Math+PE:total) =A8.sort@z(total)
9 =A8.sort(-English,PE)
10 =A8.top(-5,total) =A8.top(-5;total)
11 >A8.run(student_id=string(student_id))
12 =A8.ranks@z(total) =A8.derive(A12(#):total_rank,:flag) >B12.run(flag=if(total_rank<=25,"A","B"))
13 =B12.select(flag=="A") =B12.select(flag=="B") =A13.max(B13.max(abs(A13.Math-Math)))
14 =A13.conj(B13.([A13.~,~])) =A14.maxp@a(abs(~(1).Math-~(2).Math))

2.


A B
1 =T("C:/Users/29636/Desktop/tmp/dailysales.xlsx")
2 =A1.select(#%2==0)
3 =A1.select(day@w(Date)==7 || day@w(Date)==1)
4 =A1.derive(Sales-Sales[-1]:Gain,Sales+CumSales[-1]:CumSales)
5 =(a=0,A4.(if(Gain>0,a+=1,a=0))).max()
6 =A4.maxp(Sales).Gain
7 =A4.pselect@a(Sales>150000) =A4.calc(A7,Gain)
8 =A7.new(A4(~).Date,B7(#):Gain)

3.


A
1 =T ("Orders.xlsx")
2 =A1.select(year(OrderDate)==2014)
3 =A2.sort(OrderDate)
4 =A3.select(seq(month(OrderDate))==20)
5 =A4.new(month(OrderDate):month,day(OrderDate):day)

A2 选出 2014 年数据

A3 按照订单日期排序

A4 使用函数 seq() 计算每个月份的订单序号,并选出每个月序号为 20 的记录

A5 根据每个月序号为 20 的订单日期,算出其月份和日子,即为所求结果

8.5 字段上的计算

1.

2.


A
1 [English,Math,PE]
2 =A1.("rand(100):"/~).concat@c()
3 =50.new(~:student_id,${A2})
4 =A3.fname().concat@c()
5 =A3.new(if(student_id<=25,"one","two"):class,${A4})
6 =A5.derive(~.array().to(3,).sum():total)


A
1 [English,Math,PE]
2 =A1.("rand(100):"/~).concat@c()
3 =50.new(~:student_id,${A2})
4 =A3.field("English",50.(60+rand(40)))

3.


A B C
1 [English,Math,PE]
2 =A1.("rand(100):"/~).concat@c()
3 =50.new(~:student_id,${A2})
4 for A1 =A3.field(A4) =B4.(if(~>=90:"A",~<60:"C";"B"))
5
>A3.field(A4,C4)

4.


A B C
1 =create(IDCard,Name,Sex,Birthday,Nation,Phone,Depart,Home,Marital,Entry)
2 =create(IDCard,Name,Relation,Workplace,Phone)
3 [B4,B3,D3,F3,H3,F4,H4,B5,F5,H5]
4 =file("staff.xlsx").xlsopen()
5 for A4 =A3.(eval($[A4.xlscell(]/~/",\""/A5.stname/"\")")) >A1.record(B5)
6
=A4.xlsimport@t(Family,Name,Relation,Workplace,Phone;A5.stname,6)
7
=B6.rename(Family:IDCard) >B7.run(IDCard=B5(1))
8
>A2.insert@r(0:B7)

A1 创建列名分别为IDCardNameSexBirthdayNationPhoneDepartHomeMaritalEntry的空序表,用于保存主表员工信息

A2 创建列名分别为IDCardNameRelationWorkplacePhone的空序表,用于保存子表员工家庭成员信息

A3 定义主表员工信息所在单元格序列

A4 打开Excel数据文件

A5 循环读取Excel文件各sheet数据

B5 读取员工信息序列

C5 B5读取的员工信息保存到序表A1

B6 从第6行开始读取员工家庭成员信息,只读指定的5FamilyNameRelationWorkplacePhone

B7 B6序表的Family列改名为IDCard

C7 B7序表的IDCard列赋值为员工信息中的IDCard

B8 B7中的员工家庭成员信息追加到序表A2