第一次个人编程作业

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的评测系统我到现在还是没用明白,上面虽然写的很明白,但是自己运行的时候会有各种各样的报错,简直举步维艰。

加油加油加油!

你可能感兴趣的:(第一次个人编程作业)