l 问题
一家杀毒软件公司的产品采用按时间购买的方式销售,用户必须不断续购“许可key”才可以继续使用软件,“许可key”分为半年授权、一年授权和终身授权,详细情况如下:
ID |
Key Type |
TermOfValidity |
Price |
1 |
Six months |
6 months |
20 |
2 |
One Year |
12 months |
36 |
3 |
Unlimited |
Infinity |
500 |
下面是该公司推行这种销售模式后头几年的销售记录表:
如果客户授权到期而又没有续购授权,则停止软件使用,不再视为公司客户。请算出公司这头几年中每年的客户增长率。
l 思路
大致思路:此问题由于涉及到年底结算的问题,而年份又不是确定的,所以需要按天循环,同时用另一个序表来同步记录当前的客户,在每一天的循环中,删去已经过期的用户,添加新的用户,并给老用户续费,而后到了年底再结算用户数量即可。
1. 先写出每种key的有效期延长时间,并写入序表。由于延长时间不是确定的(大月小月平年闰年等),所以这里用after函数将其计算方法的算式写下来,后面的计算中直接调用即可。
2. 先做一些循环之前的准备,首先创建一个记录当前有效用户的序表,再建立一个记录年用户数和增长率的结果表。
3. 先标记好按天循环的前后范围,也就是销售记录的日期范围。
4. 循环销售记录日期范围内的每一天。循环体内,首先删除当天已经超过有效期的客户。
5. 找出当天的销售记录。
6. 循环这些记录,在客户表中找出相应的客户,如果没有则新建一条客户记录。
7. 按照销售记录所购买的key类型,算出用户的有效期。
8. 如果到了年底,将当前的客户数量写入前面的结果表中。
9. 循环结束后,再用结果表算出每一天的客户数量增长率。
l 代码
|
A |
B |
C |
D |
|
1 |
=file("C:\\txt\\AVwareSales.txt").import@t().sort(Date) |
|
|
|
销售记录表 |
2 |
/ID |
/算式 |
|
|
写出各种Key的日期算式备用 |
3 |
1 |
elapse@m(?,6) |
|
|
算式备用 |
4 |
2 |
elapse@y(?,1) |
|
|
|
5 |
3 |
'null |
|
|
|
6 |
=create(ID,Pattern).record([A3:B5],0) |
=A6.keys(ID) |
|
|
将KeyID和算式写入序表 |
7 |
=create(User,TermOfValidity) |
=A7.keys(User) |
|
|
创建一个当前用户表 |
8 |
=create(Year,NoOfUsers,GrowthRate) |
|
|
|
创建一个记录增长率结果表 |
9 |
=date(A1.Date) |
=date(A1.m(-1).Date) |
|
|
循环起始日期和结束日期 |
10 |
for |
>A7.delete(A7.select(TermOfValidity!=null && TermOfValidity<A9)) |
|
|
循环每天。删除当天已经过有效期的用户 |
11 |
|
=A1.select(date(Date)==A9) |
|
|
找出当天的销售记录 |
12 |
|
for B11 |
=A7.find(B12.User) |
|
循环这些销售记录,找出相应的用户记录 |
13 |
|
|
if C12==null |
>A7.insert(0,B12.User,A9) |
如果没有,就新建记录 |
14 |
|
|
|
>C12=A7.m(-1) |
|
15 |
|
|
>C12.run(TermOfValidity=eval(A6.find(B12.KeyID).Pattern,TermOfValidity)) |
|
按照key相应的算式,算出新的有效期 |
16 |
|
if month(A9)==12 && day(A9)==31 |
|
|
如果到了年底 |
17 |
|
|
>A8.insert(0,year(A9),A7.count()) |
|
记下当前的用户数量 |
18 |
|
>A9=elapse@d(A9,1) |
|
|
循环变量增进一天 |
19 |
|
if A9>B9 |
break |
|
如果循环超过了销售记录的日期范围,就可以结束循环了 |
20 |
=A8.run(if(#>1,GrowthRate=round((NoOfUsers-NoOfUsers[-1])/NoOfUsers[-1],2))) |
|
|
|
算出每年的客户增长率 |
l 结果