第一次个人编程作业

项目地址: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个函数为顺序执行,每一级获取当前的地址,然后将它截取,在送给下一级处理,因为是顺序处理结果,流程简单清晰,所以不必画出流程图。
算法的关键在于每一级获取当前最大的地址,然后把它删掉在给下一级处理。
算法的独到之处:因为可能缺失,比如说少了区,但后面有个地址带“区”字,为了防止误判,如果我得到的这个“区”字的位置靠后,即认为它并不是真正的区,将它丢掉。


(vs好像出了点问题,上面这张类视图每个东西都有两个)

算模块接口部分的性能改进

开始存储省市的数据结构用的是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",并退出。

原文地址:https://www.cnblogs.com/1e9add7/p/11609860.html