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 结果
