第一次个人编程作业

Github链接

https://github.com/zhanglingxin/031702105

PSP表

PSP2.1 | Personal Software Process Stages | 预估耗时(分钟)| 实际耗时(分钟)

  • | :-: | :-: | -:
    Planning |计划 | 90 | 100
    Estimate | 估计这个任务需要多少时间 | 12 | 18
    Development | 开发 | 700 | 850
    Analysis | 需求分析 (包括学习新技术) | 100 | 120
    Design Spec | 生成设计文档 | 60 | 75
    Design Review | 设计复审 | 30 | 45
    Coding Standard | 代码规范(为开发制定合适的规范) | 25 | 30
    ·Design | 具体设计 | 100 | 130
    · Coding | 具体编码 | 200 | 240
    Code Review | · 代码复审 | 30 | 40
    · Test | · 测试(自我测试,修改代码,提交修改)| 120 | 220
    Reporting | 报告 | 40 | 50
    · Test Repor | · 测试报告 | 10 | 15
    Size Measurement | 计算工作量 | 20 | 25
    Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 30
    . | · 合计 | 1537 | 1986

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

代码语言

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

函数的实现思路图就是:


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

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


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

计算模块接口的性能改进

性能分析图

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

函数调用时间分析

内存分析

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

内存逐行分析

单元测试

测试用例

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

测试覆盖率

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

1、没有选择难度

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

2、输入中没有电话

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

3、输入中没有名字

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

4、输入中没有地址

比如
1!张三,13599622362
出现的结果就是

心路历程

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

posted @ 2019-09-15 18:53  zhanglingxin  阅读(460)  评论(4)    收藏  举报