Github链接
https://github.com/zhanglingxin/031702105
PSP表
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 90 | 100 |
Estimate | 估计这个任务需要多少时间 | 12 | 18 |
Development | 开发 | 700 | 850 |
Analysis | 需求分析 (包括学习新技术) | 100 | 120 |
Design Spec | 生成设计文档 | 60 | 75 |
Design Review | 设计复审 | 30 | 45 |
Coding Standard | 代码规范(为开发制定合适的规范) | 25 | 30 |
·Design | 具体设计 | 100 | 130 |
· Coding | 具体编码 | 200 | 240 |
Code Review | · 代码复审 | 30 | 40 |
· Test | · 测试(自我测试,修改代码,提交修改) | 120 | 220 |
Reporting | 报告 | 40 | 50 |
· Test Repor | · 测试报告 | 10 | 15 |
Size Measurement | 计算工作量 | 20 | 25 |
Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 30 |
. | · 合计 | 1537 | 1986 |
模块接口的设计与实现过程
代码语言
我用了python来写这次代码,因为用python写可以方便很多
省、市,来源
http://www.maps7.com/china_province.php
我找了中国的省,市,然后建了一个字典,这对后面的查找很重要
主要函数
函数名 | 作用 | |
---|---|---|
def process_one_record(one_record:str) | 提供一级二级地址 | |
get_name_phone(s: str) | 分离出电话号码和名字 | |
get_info_from_dict | 初步提取出省的信息 | |
get_address(address: str, lev: int) | 省,市,区(县),镇(街道),其他的 |
get_address(address: str)
函数特变说明
get_address(address: str)
这个函数是用来提取出省,市,区,的信息的这个函数比较重要,具体思路如下,当找到一个人地址级别的时候,找出它的名字,并找一段,剪一段:
1,现在给的样例中找出 "省" ,如果没有省的话,就从最初的中国省,市表里去找。判断是不是属于直辖市
2,找"市"
pos_shi = address.find("市")
if(pos_shi != -1):
shi = address[:pos_shi+1]
else:
shi = get_shi(sheng, address[:2])
# print(shi)
j = 0
while(j < len(shi) and shi[j]==address[j]):
j += 1
address = address[j:]
3,找区,县,县级市这一级别的,因为区,区,县这一级别的有多种可能性,因此,也进行了特判
pos_qu = address.find("区")
pos_xianjishi = address.find("市")
pos_xian = address.find("县")
pos_quxian = -1
if pos_quxian == -1:
pos_quxian = pos_qu
if pos_quxian == -1:
pos_quxian = pos_xianjishi
if pos_quxian == -1:
pos_quxian = pos_xian
if pos_quxian != -1:
quxian = address[:pos_quxian+1]
else:
quxian = ""
# print(quxian)
address = address[len(quxian):]
# print(address)
4,找镇,街道这一级别的但是因为这一级别的关键字可能有很多,因此要进行很多特判,只要用一个来存就好了。
pos_zj = address.find("镇")
buchang = 0 #当为街道时,截取字符串需要加2
if pos_zj == -1:
pos_zj = address.find("街道")
if pos_zj != -1:
buchang = 1
if pos_zj == -1 and buchang == 0:
pos_zj = address.find("街")
if pos_zj == -1 and buchang == 0:
pos_zj = address.find("乡")
zhenjie = ""
if pos_zj != -1:
zhenjie = address[:pos_zj+ 1 + buchang]
# print(zhenjie)
other = address[len(zhenjie):]
# print(zhenjie, " ", other)
if sheng in zhixianshi:
sheng = sheng[:-1]
if lev == 1:
res = [sheng, shi, quxian, zhenjie, other]
elif lev >= 2:
#处理路,门牌号,其他
pos_lu = other.find("路")
if pos_lu == -1:
pos_lu = other.find("巷")
if pos_lu == -1:
pos_lu = other.find("村")
lu = ""
if pos_lu != -1:
lu = other[:pos_lu+1]
other = other[pos_lu+1:]
hao = ""
pos_menpaihao = other.find("号")
if pos_menpaihao != -1:
hao = other[:pos_menpaihao+1]
other = other[pos_menpaihao+1:]
以此类推,这个函数就是一层一层的往下找中间过程中有用到上面的get_info_from_dict(s: str):
函数和 get_shi(sheng:str, shi:str)
函数
函数的实现思路图就是:
这个函数可以在挺多种情况下,将地址信息找出来,这个函数原来只写了一部分,后来时不时想到一些情况,将它们补进去。
因为最开始没有看到测试样例的具体输入输出的格式,因此改了很多次,才到最后的这个样子
不断上改动代码,上交的过程图
可以说过程非常的艰辛。。。。。。。。
计算模块接口的性能改进
性能分析图
在改进模块上,我花了差不多半小时的时间,思路是争取少查几次一级二级地址的字典,将直辖市单列出来,节省时间,还方便,然后之后的为了提高正确率,我不断地把代码优化一下
函数调用时间分析
内存分析
程序中耗时最大的函数是get_address(address: str)
,但是耗时也不会太多。
内存逐行分析
单元测试
测试用例
2!李四,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层.
1!张三,福建福州闽13599622362侯县上街镇福州大学10#111.
2!王五,福建省福州市鼓楼18960221533区五一北路123号福州鼓楼医院.
3!小美,北京市东15822153326城区交道口东大街1号北京市东城区人民法院.
1!小陈,广东省东莞市凤岗13965231525镇凤平路13号.
1!宗衬缝,湖南省长沙市浏阳市古港镇024乡道古港镇梅田15590409121湖村村民委员会.
#控制台打印效果
{"姓名":"李四","手机":"13756899511","地址":["福建省","福州市","鼓楼区","鼓西街道","湖滨路","110号","湖滨大厦一层"]},
{"姓名":"张三","手机":"13599622362","地址":["福建省","福州市","闽侯县","上街镇","福州大学10#111"]},
{"姓名":"王五","手机":"18960221533","地址":["福建省","福州市","鼓楼区","","五一北路","123号","福州鼓楼医院"]},
{"姓名":"小美","手机":"15822153326","地址":["北京","北京市","东城区","","交道口东大街","1号","北京市东城区人民法院"]},
{"姓名":"小陈","手机":"13965231525","地址":["广东省","东莞市","","凤岗镇","凤平路13号"]}
{"姓名":"宗衬缝","手机":"15590409121","地址":["湖南省","长沙市","浏阳市","古港镇","024乡道古港镇梅田湖村村民委员会"]}
构造这组测试的思路
结合了一些所给的样例,以及一些所想的情况,比如出现县级市的时候是否有bug
测试覆盖率
计算模块部分异常处理说明
1、没有选择难度
比如
李四,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层
出现的结果就是:
2、输入中没有电话
比如
1!张三,福建福州闽侯县上街镇福州大学10#111.
出现的结果就会是
3、输入中没有名字
比如
1!福建福州闽侯县上街镇福州大学10#111.
出现的结果就是
4、输入中没有地址
比如
1!张三,13599622362
出现的结果就是
心路历程
这次编程作业过程非常艰辛,但是也学到了很多知识,感受到了中华文化的博大精深,学到了特别多的地理知识。