项目地址:https://github.com/Moonhuman/131700309
PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 60 |
Estimate | 估计这个任务需要多少时间 | 20 | 20 |
Development | 开发 | 300 | 250 |
Analysis | 需求分析 (包括学习新技术) | 180 | 120 |
Design Spec | 生成设计文档 | 90 | 60 |
Design Review | 设计复审 | 90 | 30 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 10 |
Design | 具体设计 | 60 | 120 |
Coding | 具体编码 | 300 | 600 |
Code Review | 代码复审 | 30 | 10 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 20 |
Reporting Standard | 报告 | 60 | 40 |
Test Repor | 测试报告 | 60 | 40 |
Size Measurement | 计算工作量 | 20 | 10 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 20 |
合计 | 1330 | 1410 |
计算模块接口的设计与实现过程
代码有两个类,一个用来处理解析字符串的类class Solution,一个用来存储姓名、手机、地址等信息的类class SingleItem。
运行过程为主函数每次读入一条字符串(即每条数据),将字符串传给Solution类,这个类中有多种函数,它们用来:解析难度等级、姓名、手机号、还有七级地址。
Solution类将分割出来的信息存到用来SingleItem类中。
最后SingleItem类调用函数来输出。
其中最为关键的即为7个七级地址的解析函数,这7个函数为顺序执行,每一级获取当前的地址,然后将它截取,在送给下一级处理,因为是顺序处理结果,流程简单清晰,所以不必画出流程图。
算法的关键在于每一级获取当前最大的地址,然后把它删掉在给下一级处理。
算法的独到之处:因为可能缺失,比如说少了区,但后面有个地址带“区”字,为了防止误判,如果我得到的这个“区”字的位置靠后,即认为它并不是真正的区,将它丢掉。
算模块接口部分的性能改进
开始存储省市的数据结构用的是C++ STL中的map,它是用红黑树实现的,所以插入删除操作要logn的时间,所以可以改用unordered_map,它是一个哈希表,虽然常数比较大,但效果还是比map的效果要好。
可以看到消耗最大的两个函数为Solve()函数和Print()函数。
计算模块部分单元测试展示
input:
1!洪嘹,广东佛山市高明区更15198460545合镇广明高速公路界村林场.
1!娄伤囚,13592755594浙江省杭州市所前镇袄庄陈村工业园区5号楼.
2!乐愿,山东省潍坊安丘15223742753市兴安街道南关头巷南关头幼儿园.
2!李四,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层.
1!张三,福建福州闽13599622362侯县上街镇福州大学10#111.
2!王五,福建省福州市鼓楼18960221533区五一北路123号福州鼓楼医院.
3!小美,北京市东15822153326城区交道口东大街1号北京市东城区人民法院.
1!小陈,广东省东莞市凤岗13965231525镇凤平路13号.
output:
[{"姓名":"洪嘹","手机":"15198460545","地址":["广东省","佛山市","高明区","更合镇","广明高速公路界村林场"]},{"姓名":"娄伤囚","手机":"13592755594","地址":["浙江省","杭州市","所前镇袄庄陈村工业园区","","5号楼"]},{"姓名":"乐愿","手机":"15223742753","地址":["山东省","潍坊市","安丘市","兴安街道","南关头巷","","南关头幼儿园"]},{"姓名":"李四","手机":"13756899511","地址":["福建省","福州市","鼓楼区","鼓西街道","湖滨路","110号","湖滨大厦一层"]},{"姓名":"张三","手机":"13599622362","地址":["福建省","福州市","闽侯县","上街镇","福州大学10#111"]},{"姓名":"王五","手机":"18960221533","地址":["福建省","福州市","鼓楼区","","五一北路","123号","福州鼓楼医院"]},{"姓名":"小美","手机":"15822153326","地址":["北京","北京市","东城区","","交道口东大街","1号","北京市东城区人民法院"]},{"姓名":"小陈","手机":"13965231525","地址":["广东省","东莞市","","凤岗镇","凤平路13号"]}]
计算模块部分异常处理说明
如果转码失败,则输出bad conversion,并退出。
初始读入已有省份信息时,如果文件打开失败则输出"Can not open AddressData file",并退出。