第一次个人编程作业

Github链接

https://github.com/zhanglingxin/031702105

PSP表

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划90100
Estimate估计这个任务需要多少时间1218
Development开发700850
Analysis需求分析 (包括学习新技术)100120
Design Spec生成设计文档6075
Design Review设计复审3045
Coding Standard代码规范(为开发制定合适的规范)2530
·Design具体设计100130
· Coding具体编码200240
Code Review· 代码复审3040
· Test· 测试(自我测试,修改代码,提交修改)120220
Reporting报告4050
· Test Repor· 测试报告1015
Size Measurement计算工作量2025
Postmortem & Process Improvement Plan· 事后总结, 并提出过程改进计划2030
.· 合计15371986

模块接口的设计与实现过程

代码语言

我用了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)函数

函数的实现思路图就是:

1330484-20190915231026514-714442701.png
这个函数可以在挺多种情况下,将地址信息找出来,这个函数原来只写了一部分,后来时不时想到一些情况,将它们补进去。
因为最开始没有看到测试样例的具体输入输出的格式,因此改了很多次,才到最后的这个样子

不断上改动代码,上交的过程图

1330484-20190917091521776-1202076051.png
1330484-20190917134044490-1882862895.png

可以说过程非常的艰辛。。。。。。。。

计算模块接口的性能改进

性能分析图

在改进模块上,我花了差不多半小时的时间,思路是争取少查几次一级二级地址的字典,将直辖市单列出来,节省时间,还方便,然后之后的为了提高正确率,我不断地把代码优化一下

函数调用时间分析

1330484-20190917131855620-1277341837.png

内存分析

1330484-20190917182806168-959795317.png

程序中耗时最大的函数是get_address(address: str),但是耗时也不会太多。

内存逐行分析

1330484-20190917180307178-1306899318.png

单元测试

测试用例

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

测试覆盖率

1330484-20190917131516038-283595320.png

1330484-20190917131528473-1341926851.png

计算模块部分异常处理说明

1、没有选择难度

比如
李四,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层
出现的结果就是:
1330484-20190917102714874-1602005292.png

2、输入中没有电话

比如
1!张三,福建福州闽侯县上街镇福州大学10#111.
出现的结果就会是
1330484-20190917103002790-292545341.png

3、输入中没有名字

比如
1!福建福州闽侯县上街镇福州大学10#111.
出现的结果就是
1330484-20190917103130204-1663823653.png

4、输入中没有地址

比如
1!张三,13599622362
出现的结果就是
1330484-20190917103424541-431384909.png

心路历程

这次编程作业过程非常艰辛,但是也学到了很多知识,感受到了中华文化的博大精深,学到了特别多的地理知识。

转载于:https://www.cnblogs.com/zhanglingxin/p/11523739.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值