第一次个人编程作业
github地址
psp表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 90 |
Estimate | 估计这个任务需要多少时间 | 10 | 10 |
Development | 开发 | 600 | 850 |
Analysis | 需求分析 (包括学习新技术) | 120 | 150 |
Design Spec | 生成设计文档 | 20 | 30 |
Design Review | 设计复审 | 30 | 45 |
Coding Standard | 代码规范(为开发制定合适的规范) | 15 | 25 |
Design | 具体设计 | 100 | 110 |
Coding | 具体编码 | 150 | 175 |
Code Review | 代码复审 | 30 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 150 | 200 |
Reporting | 报告 | 40 | 60 |
Test Repor | 测试报告 | 10 | 10 |
Size Measurement | 计算工作量 | 20 | 25 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 20 | 30 |
Total | 总计 | 1375 | 1840 |
代码实现和思路
代码语言
因为听说c++写这次作业会挺难的,java还没学完,就临时学习了python打了这次作业。(学了一天的结果,代码巨丑,求轻喷)
代码思路
开始的思路是用正则切除电话号码与姓名,因为输入比较稳定,用逗号就能找到姓名,正则匹配11位数字就行了,这里就不多赘述了。切除后的字符串与电话姓名传回主函数进行地址切割。
用到的函数
主函数 | 函数 | 作用 |
---|---|---|
get_Answer() | 输入待处理字符串,输出答案 | |
Cut_Name() | 切除姓名 | |
Cut_phone() | 切除名字 | |
find_Province() | 遍历字典找出省 | |
find_city() | 便利字典找出市 | |
solve_address() | 后面全是处理子级地址的函数 | |
这里放出最耗时的两个函数 |
def find_Province(s:str):
for sheng in table.keys():
if s[:2] in sheng:
return sheng
return -1
这是遍历省的函数,因为有缺省关键字的情况,所以匹配前两个字符来找目标省。
def find_city(s:str):
for sheng in table.keys():
if s[:2] in sheng:
for cheng in table[sheng]:
if cheng[:2] in s:
return cheng
return -1
这里也是同理,因为是字典,找到省就遍历其子级。
Tips
在做测试的时候,真是被整吐了,打了巨多的特判,这里就不放出来让大家嘲笑了,还有3级难度的太顶了,本肥仔做不了,投降(举白旗)。
计算模块接口部分的性能改进
用的是pycharm的profile,不说废话,上图。
因为代码测试工具精度不够,所以循环了1000次来测试
这是只测试一次的
这是1000次的
用时大多在输入,和遍历省,和遍历市的函数上。
输入本咸鱼不懂怎么改进。遍历是已经改过的,初版思路打了三张表,去网上复制粘贴。但发现比起字典实现,这会多出很多无用的遍历,浪费时间。
代码覆盖率
这东西说明没什么用,上图
单元测试
因为时间比较仓促,测试单个函数实在费时,容小弟摸鱼一会
只测试了一个主函数get_Answer()
测试样例
2!李四,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层.
1!张三,福建福州闽13599622362侯县上街镇福州大学10#111.
2!王五,福建省福州市鼓楼18960221533区五一北路123号福州鼓楼医院.
1!钭隆箍,山西省阳泉市矿区赛鱼街道麻地巷32号13100299356楼.
2!姚帮,广东省汕头潮南区峡山街道峡山义英义华路136号莎丹13184626238服饰.
控制台的结果
{"姓名": "李四", "手机": "13756899511", "地址": ["福建省", "福州市", "鼓楼区", "鼓西街道", "湖滨路", "110号", "湖滨大厦一层"]}
{"姓名": "张三", "手机": "13599622362", "地址": ["福建省", "福州市", "闽侯县", "上街镇", "福州大学10#111"]}
{"姓名": "王五", "手机": "18960221533", "地址": ["福建省", "福州市", "鼓楼区", "", "五一北路", "123号", "福州鼓楼医院"]}
{"姓名": "钭隆箍", "手机": "13100299356", "地址": ["山西省", "阳泉市", "矿区", "赛鱼街道", "麻地巷32号楼"]}
{"姓名": "姚帮", "手机": "13184626238", "地址": ["广东省", "汕头市", "潮南区", "峡山街道", "峡山义英义华路", "136号", "莎丹服饰"]}
中间那个矿区有点难顶,不懂是不是真的有这个区还是说它只是一个名词。
计算模块部分异常处理说明
我思考了许久(观摩其他人的异常处理)。
分了两类。
一是没有选择难度
这东西我通过输入后特判实现的
二是缺少姓名或地址或电话号码
这东西我也是通过输入后特判实现的
(别骂了,别骂了,我只会特判)
最后贴上测评成绩
心路历程
1.边学着python边打,打完其实还没学完,哭了,要学的东西挺多。
2.了解了国家博大精深的地理知识,县级市和市级县傻傻分不清楚。
3.学会了各种测试代码的工具吧