第一次个人编程作业
1.Github地址:
https://github.com/linxinqq/031702138
2.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 20 |
Estimate | 估计这个任务需要多少时间 | 20 | 20 |
Development | 开发 | 985 | 920 |
Analysis | 需求分析 (包括学习新技术) | 60 | 90 |
Design Spec | 生成设计文档 | 30 | 30 |
Design Review | 设计复审 | 20 | 20 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
Design | 具体设计 | 25 | 40 |
Coding | 具体编码 | 700 | 600 |
Code Review | 代码复审 | 60 | 60 |
Test | 测试(自我测试,修改代码,提交修改) | 80 | 70 |
Reporting | 报告 | 180 | 230 |
Test Report | 测试报告 | 60 | 80 |
Size Measurement | 计算工作量 | 40 | 50 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 80 | 100 |
合计 | 1185 | 1170 |
3.计算机模块的设计与实现过程
(1)先说说我的思考过程,刚拿到题目的时候是一脸懵逼的,看起来就是个截取字符串的问题,但好像之前都没有接触过切割中文字符的题目(之前好像也没做多少题目),所以在csdn上找了很多关于截取中文字符串的内容,暑假也看了一些关于Python的视频,对于Unicode和gbk以及utf-8编码有些了解,所以搜到了一些关于Python截取中文字符串的材料,迈出了第一小步。
(2)观察题目给出的样例,我总共定义了七个函数,如下图:
函数名 | 功能 |
---|---|
receivename | 获得姓名 |
receivenumber | 获得手机号码 |
receivesheng | 获得省份 |
receiveshi | 获得市 |
receivexian | 获得县/区/县级市 |
receivezhen | 获得街道/镇/乡 |
receivelu | 获得路名 |
receivehao | 获得门牌号 |
main | 输入输出以及调用上述函数 |
主函数从上往下依次调用上述函数,调用receivename截取姓名后将剩余的字符串返回,然后主函数调用receivenumber获得手机号码,直到分出姓名手机以及五/七级地址。
(3)算法的关键在于使用find函数查找省市县镇这些级别表示的关键字,然后用split函数截取关键字前的部分,如果找不到则直接截取两个字返回,姓名就利用spilt截取逗号前的字符串,手机则利用字符串的切片操作截取到。
(4)独到之处:首先方法十分朴素,没有用到花里胡哨的re库,单纯的使用find和split以及切片操作,代码易于理解,其次对于一些比较苛刻的测试点进行了额外处理,极大磨炼了人的耐力。
4.计算机模块接口部门的性能改进
在改进计算模块性能上所花费的时间差不多是两个小时,改进了两个方面,第一是对直辖市的处理,判断不到省关键字,做特殊的切片,第二是对街道做了优化处理,例子中第四级有些是街有些是街道,如果截到街取前面字符串,可能道字跟在后面一级导致错误,所以要做特殊处理区分。
性能分析图如下:
消耗最大函数:
5.计算模块部分单元测试展示
2!李四,福建省福州13756899511市湖滨路110号湖滨大厦一层.
1!张三,福建福州闽13599622362侯县上街镇福州大学10#111.
2!小美,北京市东15822153326城区交道口东大街1号.
1!韶划奸,上海市普陀区长风新村街15717060981道光复西路1995号中山北路6-17号海鑫公寓.
{'姓名': '李四', '手机': '13756899511', '地址': ['福建省', '福州市', '', '', '湖滨路', '110号', '湖滨大厦一层']}
{'姓名': '张三', '手机': '13599622362', '地址': ['福建省', '福州市', '闽侯县', '上街镇', '福州大学10#111']}
{'姓名': '小美', '手机': '15822153326', '地址': ['北京', '北京市', '东城区', '交道口东大街', '', '1号', '']}
{'姓名': '韶划奸', '手机': '15717060981', '地址': ['上海', '上海市', '普陀区', '长风新村街道', '光复西路1995号中山北路6-17号海鑫公寓']}
这四个例子都具有一定的代表性,样例1是对缺少级别补空位的测试,样例2是对缺少省市关键词补充的测试,样例3是对直辖市的测试,样例4就是对街道做特殊处理的测试。
测试覆盖率截图:
6.计算模块部分异常处理说明
缺少手机号码的异常处理:(会将手机号码置为空)
2!李四,福建省福州市湖滨路110号湖滨大厦一层.
{'姓名': '李四', '手机': '13756899511', '地址': ['福建省', '福州市', '', '', '湖滨路', '110号', '湖滨大厦一层']}
缺少姓名的异常处理:(会将姓名置为空)
2!李四,福建省福州市湖滨路110号湖滨大厦一层.
{'姓名': '', '手机': '', '地址': ['福建省', '福州市', '', '', '湖滨路', '110号', '湖滨大厦一层']}
缺少难度值的异常处理:(导致姓名被提前截取)
李四,福建省福州市湖滨路110号湖滨大厦一层.
{'姓名': '', '手机': '', '地址': ['福建省', '福州市', '', '', '湖滨路', '110号', '湖滨大厦一层']}
7.个人感想
从布置作业的那天就开始慌,万一做不出来得了零分那就凉了,这种慌张压迫得我喘不过气,也迫使着我不断去寻找材料,不断去想办法完成这个作业,催促着我不断成长,有时候有一丁点突破就会感觉倍有成就感,做到最后,虽然还是没有做到尽善尽美,有很多点还是没能考虑清楚,但真的是收获满满,希望能不断有所进步,不断突破自己。