一、GitHub链接
https://github.com/0x06c0/031702119.git
二、PSP表格(初步估计)
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 120 | |
Estimate | 估计这个任务需要多少时间 | 120 | |
Development | 开发 | 1800 | |
Analysis | 需求分析 (包括学习新技术) | 780 | |
Design Spec | 生成设计文档 | 0 | |
Design Review | 设计复审 | 60 | |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 60 | |
Design | 具体设计 | 60 | |
Coding | 具体编码 | 750 | |
Code Review | 代码复审 | 30 | |
Test | 测试(自我测试,修改代码,提交修改) | 60 | |
Reporting | 报告 | 180 | |
Test Repor | 测试报告 | 60 | |
Size Measurement | 计算工作量 | 60 | |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | |
合计 | 2100 |
三、计算模块接口的设计与实现过程
编码转换
string GbkToUtf8(const char *src_str)
string Utf8ToGbk(const char *src_str)
提取一、二级地址
string FirstAdd(string a)
string SecondAdd(string a)
四、计算模块接口部分的性能改进
一开始我设计了四个函数分别获取前四级地址,为了补全缺失的后缀,我将第二、三级地址以前一级地址作为键,储存为Json格式,如第二级所有地址我以"xx省":["xx市","xx市"]的Json格式存在文档中,以上一级地址为索引条件能较快地找到下一级可能存在的所有地址。而寻找每一级的地址时我先从地址中取前两个字,当匹配成功时直接返回文档中存的字符串,因为文档中的值都是带后缀的,所以直接解决了后缀补全的问题。后发现第三、四级后缀不会缺失,所以放弃了第三、四级地址的获取函数改为直接在主函数中通过匹配后缀来获取。性能分析如下:
五、计算模块部分单元测试展示
测试部分:提取地址功能
测试数据:从测试样例中随机抽取10个
输入:
1!乔哥踢,山东省13761422352枣庄市薛城区南安阳村民委员会.
1!宓蔫久,山西省晋城市城13719021976区西街街道苗孟庄社区泰丰小区网格2号楼.
1!伍莫珍,广西壮族自治区钦州13175764582钦南区黄屋屯镇屯兴街1号黄屋屯中学.
1!涂晓蹂,吉林省长春市长春高新技术产业开发区高新开发区102国道以北规划富裕河14781957580以南长春恒大名都131号香得益彰麻辣居.
1!佴赴,浙江省舟山市岱山县高亭镇13943898664银厦路88号南峰海鲜面馆.
1!怀喷,甘肃省天水15618942866市清水县草川铺镇449县道腰林秦惠琴希望小学.
1!幸晴,贵州省黔东南苗族侗族自治州岑巩县思13377199751旸镇磨寨村磨寨小学.
2!满茧腌,湖北省鄂州市涂家垴镇发13387889865展路9号鄂州市涂家垴派出所.
2!夹谷抡枯,18795320124甘肃省兰州城关区皋兰路街道皋兰路210号郑家台小区.
3!孙旗乖,13366755810白城市洮北区长庆南街65号.
输出:
[{"姓名": "乔哥踢","手机": "13761422352","地址": ["山东省","枣庄市","薛城区","","南安阳村民委员会"]},
{"姓名": "宓蔫久","手机": "13719021976","地址": ["山西省","晋城市","城区","西街街道","苗孟庄社区泰丰小区网格2号楼"]},
{"姓名": "伍莫珍","手机": "13175764582","地址": ["广西壮族自治区","钦州市","钦南区","黄屋屯镇","屯兴街1号黄屋屯中学"]},
{"姓名": "涂晓蹂","手机": "14781957580","地址": ["吉林省","长春市","长春高新技术产业开发区","","高新开发区102国道以北规划富裕河以南长春恒大名都131号香得益彰麻辣居"]},
{"姓名": "佴赴","手机": "13943898664","地址": ["浙江省","舟山市","岱山县","高亭镇","银厦路88号南峰海鲜面馆"]},
{"姓名": "怀喷","手机": "15618942866","地址": ["甘肃省","天水市","清水县","草川铺镇","449县道腰林秦惠琴希望小学"]},
{"姓名": "幸晴","手机": "13377199751","地址": ["贵州省","黔东南苗族侗族自治州","岑巩县","思旸镇","磨寨村磨寨小学"]},
{"姓名": "满茧腌","手机": "13387889865","地址": ["湖北省","鄂州市","","涂家垴镇","发展路","9号","鄂州市涂家垴派出所"]},
{"姓名": "夹谷抡枯","手机": "18795320124","地址": ["甘肃省","兰州市","城关区","皋兰路街道","皋兰路","210号","郑家台小区"]},
{"姓名": "孙旗乖","手机": "13366755810","地址": ["","","市","","","洮北区长庆南街65号.庆南街65号.",""]}]
附上评测工具评测结果
六、算模块部分异常处理说明
异常样例
1!卓斧,贵州省贵阳清镇市红枫街164号青龙街道办事处13949510110.
异常类型
第三级名称为清镇市,获取第三级地址时误把清镇当作第三级地址导致出错。
解决方法
在匹配第三级后缀的关键字中加入“市”这个关键字,测试后问题解决。
七、完整PSP表格:
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 120 | 120 |
Estimate | 估计这个任务需要多少时间 | 120 | 120 |
Development | 开发 | 1800 | 2150 |
Analysis | 需求分析 (包括学习新技术) | 780 | 900 |
Design Spec | 生成设计文档 | 0 | 0 |
Design Review | 设计复审 | 60 | 90 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 60 | 90 |
Design | 具体设计 | 60 | 120 |
Coding | 具体编码 | 750 | 800 |
Code Review | 代码复审 | 30 | 60 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 90 |
Reporting | 报告 | 180 | 190 |
Test Repor | 测试报告 | 60 | 60 |
Size Measurement | 计算工作量 | 60 | 70 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | 60 |
合计 | 2100 | 2460 |
总结
这次作业前期我花两到三天时间做准备,包括Json等的学习、搜索需要的数据和思考如何实现地址提取。在想明白所有理出来一条思路后开始编写代码,第一版写完后第一个问题暴露出来,那就是编码不同导致的乱码问题,在查了很久资料后发现了(三)中编码转换的函数,而后在课上和同学聊这道题时点醒我c++汉字用两个字符储存,顿时豁然开朗。