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)函数部分流程
关键代码
- 匹配省份,将省地址放到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)
计算模块接口部分的性能改进
- 执行次数最多的是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)
- 测试覆盖率
计算模块部分异常处理
- 名字是在难度级别后的“!”和“,”之间。
- 正则提取后要记得删掉。
- 要记得非贪婪。
心路历程
看到这个题目时,我的内心是崩溃的。听说C++的正则不好写,而Python会好写一点,我就马上开始学。边学边打代码,疯狂百度,问同学。磕磕绊绊地终于写完了,结果发现这只是开始。代码要改错,要远程上传,要运行测试,要性能提升,要看覆盖率。这就要下一大堆的东西,不会用又要去百度,结果百度讲的有不清不楚,总之一句话:我太难了!这次实践我才发现一个好的程序员,写代码只是基础,还要懂很多东西,而我还都不懂,要继续努力学习。