1.第一次个人编程作业GitHub地址
https://github.com/dyssl/031702424
2.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 50 |
Estimate | 估计这个任务需要多少时间 | 75 | 75 |
Development | 开发 | 60 | 100 |
Analysis | 需求分析 (包括学习新技术) | 360 | 250 |
Design Spec | 生成设计文档 | 30 | 15 |
Design Review | 设计复审 | 30 | 15 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 10 |
Design | 具体设计 | 60 | 50 |
Coding | 具体编码 | 270 | 300 |
Code Review | 代码复审 | 30 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 120 | 80 |
Reporting | 报告 | 120 | 100 |
Test Repor | 测试报告 | 60 | 90 |
Size Measurement | 计算工作量 | 20 | 15 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | 15 |
合计 | 1355 | 1150 |
老实说,这张表格并不能完全反映我这次作业的实践分配情况。设计文档,代码规范,计算工作量,统统没有。我的时间主要花在拿到题目前发呆,学习自己不会的知识,代码实现,还有尝试使用评测系统(虽然花了很多时间在尝试使用评测系统但还是失败了)
3.解题思路
语言选择
拿到题目的时候我还蛮开心的,切分地址好像不是很难的事,柯老师没有骗我。可供选的的语言有c++,java还有python。我的好朋友陈金杰告诉我用c++是地狱难度,很难处理中文字符,所以我不要用c++做;我的好朋友余廷龙是用java做的,可是我连怎么用java打印helloword都不会,所以我也不要用java写;那我就只剩下python了,就决定是你了。
思考过程
首先题目有三个级别,我准备先从第一级入手,等我做出了第一级以后再继续深入下面的等级。但是现实比较残酷,在我写完第一级以后,本地运行的几个案例都ok,但是花了一个上午也没解决评测系统的问题,所以后面的两个级别和我也没什么缘分了,以下我只说明第一级的思路。
不知道你有没有听说过俄罗斯套娃,就是把最外面的娃娃摘掉,里面还有好多娃娃,一直摘很久才能摘完。前段时间看【轮到你了】,里面有提到这个套娃,看到这次的题目我就想到了套娃。我把整个字符串想象成一个套娃,一层一层的剥开套娃,依次得到名字,电话,省,市,区县,镇道,具体地址。用python来说就是,解析出一个信息后,将它切片,留下未被解析的部分,拆着拆着就结束了。听起来不难,让我们一起看看程序架构吧。
4.程序架构与函数实现
程序架构
先附上程序框架以及核心函数的接口,在我的函数实现中,解析字符串就像拆分俄罗斯套娃,每个函数负责拆分出一部分信息,以及把未被解析的部分留给下一个函数。举个例子,一开始的信息是最大的俄罗斯套娃,通过getname函数拆出名字的部分,把最大的俄罗斯套娃的「壳」给解析出来,次大的俄罗斯套娃里面装的就是未被解析的部分。当拆到第七层的时候,它几乎就已经是第五级地址了,getdetail函数做的不过是把字符串最后的「.」给去掉
函数实现
由于我对正则表达式没有非常熟悉,所以并没有用的很勤快,只有迫不得已的时候才会加以使用:
getname函数
基本思路是寻找「,」,姓名在「,」前,找到它也就完成了切分
getnumber函数
基本思路是用正则表达式匹配字符串
number = re.findall(r'\d{9,12}', message1)[0]
不是很确定手机号有多少号,但大概在这个区间吧
getshen函数
这里要先判断是否是直辖市,提前把直辖市导入到一个列表里,把字符串的前两个字符和列表做比对,如果是直辖市,那么返回字符串前两个字符作为省级名字,并且字符串不切分。
如果不是直辖市,就分别查找字符串里面有没有「省」,「自治区」,「行政区」。如果有其中一个就可以提前结束战斗,切分一下就结束了。但是考虑到字符串中可能省略掉「省」字这类情况,还需要和中国的所有省份信息作比较。提前导入一个中国省市信息的json文件,把字符串的前两个字做比对,找到后再进行切分
其他函数
其他函数就不一一做出说明,大体思路已经在前三个函数中展示,不过由于导入的json文件只有省和市的信息,在找第三级和第四级地址的时候,如果找不到关键字,就会默认没有这一级的信息哦
5.单元测试
1!李四,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层.
1!张三,福建福州闽13599622362侯县上街镇福州大学10#111.
1!王五,福建省福州市鼓楼18960221533区五一北路123号福州鼓楼医院.
1!小美,北京市东15822153326城区交道口东大街1号北京市东城区人民法院.
1!小陈,广东省东莞市凤岗13965231525镇凤平路13号.
1!刘湖,吉林省白山市六道江镇西村药店18694520738.
1!咸陡隐,江苏省苏州市吴江13184142847区平望镇新业织造有限公司吴江区平望镇双浜村村民委员会.
1!王五,云南省昭通市水富18694520738县云川路1号.
1!王五,云南省迪庆藏族自治州18694520738香格里拉市.
1!王五,四川省眉山市仁寿18694520738县黑龙滩镇牌坊街.
{"姓名": "李四", "手机": "13756899511", "地址": ["福建省", "福州市", "鼓楼区", "", "鼓西街道湖滨路110号湖滨大厦一层"]}
{"姓名": "张三", "手机": "13599622362", "地址": ["福建省", "福州市", "闽侯县", "上街镇", "福州大学10#111"]}
{"姓名": "王五", "手机": "18960221533", "地址": ["福建省", "福州市", "鼓楼区", "", "五一北路123号福州鼓楼医院"]}
{"姓名": "小美", "手机": "15822153326", "地址": ["北京", "北京市", "东城区", "", "交道口东大街1号北京市东城区人民法院"]}
{"姓名": "小陈", "手机": "13965231525", "地址": ["广东省", "东莞市", "", "凤岗镇", "凤平路13号"]}
{"姓名": "刘湖", "手机": "18694520738", "地址": ["吉林省", "白山市", "", "六道江镇", "西村药店"]}
{"姓名": "咸陡隐", "手机": "13184142847", "地址": ["江苏省", "苏州市", "吴江区", "平望镇", "新业织造有限公司吴江区平望镇双浜村村民委员会"]}
{"姓名": "王五", "手机": "18694520738", "地址": ["云南省", "昭通市", "水富县", "", "云川路1号"]}
{"姓名": "王五", "手机": "18694520738", "地址": ["云南省", "迪庆藏族自治州香格里拉市", "", "", ""]}
{"姓名": "王五", "手机": "18694520738", "地址": ["四川省", "眉山市", "仁寿县", "黑龙滩镇", "牌坊街"]}
6.异常处理
没有选择难度
王五,四川省眉山市仁寿18694520738县黑龙滩镇牌坊街.
没有电话号码
1!李四,福建省福州市鼓楼区鼓西街道湖滨路110号湖滨大厦一层.
没有名字
1!广东省东莞市凤岗13965231525镇凤平路13号.
7.总结
我觉得这道题看似简单,暗处藏着许多陷阱,稍有不慎就会万劫不复,我踩到了很多陷阱,后面就没什么感觉了,干脆多踩。
反思了一下自己的这次作业,还是自己的硬实力差太多了,写一步卡一步,最后也没有跑过评测系统,有点受打击,也算是给自己一个教训,平时多读读书。
python的评测系统我到现在还是没用明白,上面虽然写的很明白,但是自己运行的时候会有各种各样的报错,简直举步维艰。
加油加油加油!