第一次个人编程作业
-
Github链接
-
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(min) | 实际耗时(min)
:-: | :-: | :-: | :-: | :-:
Planning | 计划 | 60 | 50
Estimate | 估计这个任务需要多少时间| 60 | 50
Development | 开发 | 730 | 870
Analysis | 需求分析(包括学习新技术)| 70 | 80
Design Spec | 生成设计文档 | 50 | 60
Design Review | 设计复审| 60 | 60
Coding Standard | 代码规范(为开发制定合适的规范) | 30 | 30
Design | 具体设计| 80 | 90
Coding | 具体编码 | 360 | 300
Code Review | 代码复审| 60 | 50
Test | 测试(自我测试,修改,提交修改) | 20 | 20
Reporting | 报告| 60 | 60
Test Report | 测试报告 | 30 | 20
Size Measurement | 计算工作量| 10 | 10
Postmortem & Process Improvement Plan | 事后总结并提出过程改进计划 | 30 | 30
total| 合计| 850 | 980
计算模块接口的设计与实现过程
解题步骤
- 先提取出输入中的数字和!记录数字后并将其删除
- 根据逗号提取出姓名
- 代码中引用jieba(用python就是为了这个库,真的不会正则)提取出手机号
- 由于能力不足,不能完成2!和3!的内容只能根据情况写出1!的代码
- 根据文字匹配出省,市,县,镇级
- 根据姓名,手机,地址存入字典中,将结果保存为json格式输出
代码实现过程
if add_imfo[0] == '北京' or add_imfo[0] == '上海' or add_imfo[0] == '天津' or add_imfo[0] == '重庆': #省市
address.append(add_imfo[0])
address.append(add_imfo[0] + '市')
#print(add_imfo[0])
add_imfo.remove(add_imfo[0])
elif add_imfo[0] == '北京市' or add_imfo[0] == '上海市' or add_imfo[0] == '天津市' or add_imfo[0] == '重庆市':
address.append(add_imfo[0][0:2])
address.append(add_imfo[0])
add_imfo.remove(add_imfo[0])
else:
address.append(add_imfo[0][0:2] + '省')
add_imfo.remove(add_imfo[0])
address.append(add_imfo[0][0:2] + '市')
add_imfo.remove(add_imfo[0])
l = len(add_imfo[0])
if add_imfo[0][l-1:l] == '县' or add_imfo[0][l-1:l] == '区' or add_imfo[0][l-1:l] == '州':
address.append(add_imfo[0])
add_imfo.remove(add_imfo[0])
else:
address.append('')
···
#分镇,街,道,乡///////错误
l = len (add_imfo[0])
l1 = len(add_imfo[1])
if add_imfo[1][l1-1:l1] == '镇' or add_imfo[1][l1-1:l1] == '道' or add_imfo[1][l1-1:l1] == '乡':
address.append(add_imfo[0] + add_imfo[1])
add_imfo.remove(add_imfo[0])
add_imfo.remove(add_imfo[0])
elif add_imfo[0][l-1:l] == '镇' or add_imfo[0][l-1:l] == '道' or add_imfo[0][l-1:l] == '乡':
address.append(add_imfo[0])
add_imfo.remove(add_imfo[0])
else:
address.append('')
#增加最后地址
Address = ''
for item in add_imfo:
Address += item
address.append(Address)
mydict["地址"] = address
#1!李四,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层print(mydict)
pjson = json.dumps(mydict, ensure_ascii=False)
print(pjson)
#已经得出一个完整的列表
···
-
这是部分代码展示,很简单很暴力的方法,但也算自己对这题的理解以及这几天的辛苦汗水以及掉落的头发的结晶吧。
-
由于对C++不熟悉和根本不会JAVA,所以选择了用python来编写这个程序。不过由于python可使用的第三方库比较多,为我节省了挺多时间。以下流程图写出了我大概的思路
部分代码内容解释
- ret = re.match(r"1[35678]\d{9}", item) 唯一用到正则表达式去判断手机号(然鹅也是百度来的,为了图方便),之后就是比较常规的处理字符串,然后再合成列表,然后再合成字典的过程。其中较为特别的是用jieba库去分词后四个直辖市会完成的区分出来,所以在代码中我单独处理了这4个直辖市,能够较为准确的完成任务。
不足之处
- 由于不会正则表达式,也尝试去学了,目前还未掌握,自己还是会坚持学下去,从这题中我发现了其非常重要。然后在区分省份时没有考虑到自治区的情况,可能会有重大错误。最最最不好的是使用了jieba库吧,这非常投机取巧,而且还很容易分错,希望学了正则后能再尝试一下这题。
计算模块接口部分的性能改进
性能分析
由于不会使用所要求工具,只能按照自己理解来分析了,分析了也看不懂。也可能是错的分析。
计算模块部分单元测试展示(只有一级难度)
- 1!李四,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层
{"姓名": "李四", "手机": "13756899511", "地址": ["福建省", "福州市", "鼓楼区", "鼓西街道", "湖滨路110号湖滨大厦一层"]}
- 1!张三,福建福州闽13599622362侯县上街镇福州大学10#111
{"姓名": "张三", "手机": "13599622362", "地址": ["福建省", "福州市", "闽侯县", "上街镇", "福州大学10#111"]}
- 1!王五,福建省福州市鼓楼18960221533区五一北路123号福州鼓楼医院
{"姓名": "王五", "手机": "18960221533", "地址": ["福建省", "福州市", "鼓楼区", "", "五一北路123号福州鼓楼医院"]}
- 1!小美,北京市东15822153326城区交道口东大街1号北京市东城区人民法院
{"姓名": "小美", "手机": "15822153326", "地址": ["北京", "北京市", "东城区", "", "交道口东大街1号北京市东城区人民法院"]}
- 1!小陈,广东省东莞市凤岗13965231525镇凤平路13号
{"姓名": "小陈", "手机": "13965231525", "地址": ["广东省", "东莞市", "", "凤岗镇", "凤平路13号"]}
代码覆盖率
计算模块部分异常处理说明
- 之前没有注意到这个,等到要写博客才发现,基本上也已经把BUG排除掉了,所以也没有图。
- 文件的打开和读取一直通过不了,只能一遍一遍的百度寻求解决方法。
- 没有考虑到各个自治区的区分,但是时间不够也没更改过来了。
实验总结
- 第一次个人编程作业还是远远超出我的能力范围了,之前说的每天拿两个小时来学习软件工程,在做这个作业的时候已经严重透支。
- 作为python只会一点点的人,用来做这道题,还是很有难度的。
- 这大概是我今年第一次打python的代码,手很生,看来还是要熟能生巧。
- 基本上不会用正则表达式,很依赖第三方库。
- 对软件工程这门课以及我的发量表示担忧。