Github仓库

[个人仓库](https://github.com/Thunderblot16/031702616)

PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 20
Estimate 估计这个任务需要多少时间 20 10
Development 开发 120 80
Analysis 需求分析 (包括学习新技术) 300 600
Design Spec 生成设计文档 50 40
Design Review 设计复审 30 30
Coding Standard 代码规范 (为目前的开发制定合适的规范) 30 20
Design 具体设计 30 30
Coding 具体编码 300 270
Code Review 代码复审 30 30
Test 测试(自我测试,修改代码,提交修改) 30 40
Reporting 报告 60 60
Test Repor 测试报告 30 20
Size Measurement 计算工作量 20 10
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 20 20
合计 1110 1250

计算模块接口的设计与实现

解题思路

  • 第一步,利用正则表达式把难度级别、姓名、电话号码、地址(乱序)分别提取出来。
  • 第二步,根据难度系数将乱序的地址与省、市表匹配。
  • 第三步,将排好序的地址与提取的姓名,电话号码一起按顺序存入数组,便于输出。

函数

函数名称 作用
def GetPhoneNumber(str) 提取电话号码
def GetName(str) 提取姓名
def GetAddress(str) 提取地址(未排序)
def GetDifficulty(str) 提取难度级别
def Restore(address,d) 根据难度恢复地址顺序
def Merge(str) 把人名、电话号码、地址合并起来
def CreatProvince() 创建省份列表
def CreatCity() 创建市列表

流程图

  • def Restore(address,d)函数部分流程
    流程图.jpg

关键代码

  • 匹配省份,将省地址放到one,匹配到后把省份名字去掉
for i in range(len(pro)):#匹配省份
        a=re.match(pro[i],address)
        if(a):
            S=i
            one=a.group()
            address=re.sub(one,"",address,1) #匹配到后把省份名字去掉
  • 按照难度系数分离地址
    if d=='1':
        five=address
        sum=[]
        sum.append(one)
        sum.append(two)
        sum.append(three)
        sum.append(four)
        sum.append(five)

计算模块接口部分的性能改进

性能.jpg

  • 执行次数最多的是re.py。耗时最多的是builtins.input。

计算模块部分单元测试展示

  • 代码
def Restore(address,d):
    pro=CreatProvince()
    city=CreatCity()
    S=0
    #匹配省份
    for i in range(len(pro)):
        a=re.match(pro[i],address)
        if(a):
            S=i
            one=a.group()
            address=re.sub(one,"",address,1) #匹配到后把省份名字去掉
            if i<4:      #当匹配到的是直辖市的时候
                two=one+'市'
                if re.match(r'市',address):
                    address=re.sub(r'市',"",address,1)  #把“市”字去掉
            if 8<i<31:  #当匹配到的是普通省份的时候
                one+="省"
                if re.match(r'省',address):
                    address=re.sub(r'省',"",address,1) #把“省”字去掉                
            break

    #匹配市级   
    if S>3:
        if one!="": #即省份不缺失时
            for i in range(len(city[S])):
                a=re.match(city[S][i],address) 
                if a==None:#匹配不到时
                    two=""
                else:
                    two=a.group()
                    address=re.sub(two,"",address,1) #匹配到后把市级的名字去掉
                    two+="市"
                    if re.match(r'市',address):
                        address=re.sub(r'市',"",address)  #把“市”字去掉
                    break
    #匹配县级
    a=re.match(r'.*?(县|区|市)',address) #匹配县/区/县级市
    if a==None:
        three=""
    else:
        three=a.group()
        address=re.sub(three,"",address,1)
    #匹配乡镇级
    a=re.match(r'.*?(街道|镇|乡)',address)
    if a==None:
        four=""
    else:
        four=a.group()
        address=re.sub(four,"",address,1)

  • 测试覆盖率
    覆盖率.png

计算模块部分异常处理

  • 名字是在难度级别后的“!”和“,”之间。
  • 正则提取后要记得删掉。
  • 要记得非贪婪。

心路历程

看到这个题目时,我的内心是崩溃的。听说C++的正则不好写,而Python会好写一点,我就马上开始学。边学边打代码,疯狂百度,问同学。磕磕绊绊地终于写完了,结果发现这只是开始。代码要改错,要远程上传,要运行测试,要性能提升,要看覆盖率。这就要下一大堆的东西,不会用又要去百度,结果百度讲的有不清不楚,总之一句话:我太难了!这次实践我才发现一个好的程序员,写代码只是基础,还要懂很多东西,而我还都不懂,要继续努力学习。