程序设计习题 第 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