Github仓库
(个人仓库)https://github.com/237085795/031702517.git
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时 (分钟) |
实际耗时 (分钟) |
---|---|---|---|
Planning | 计划 | 30 | 24 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 24 |
Development | 开发 | 1510 | 1730 |
· Analysis | · 需求分析 (包括学习新技术) | 600 | 780 |
· Design Spec | · 生成设计文档 | 30 | 20 |
· Design Review | · 设计复审 | 30 | 10 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
· Design | · 具体设计 | 60 | 40 |
· Coding | · 具体编码 | 360 | 300 |
· Code Review | · 代码复审 | 60 | 90 |
· Test | · 测试(自我测试,修改代码,提交修改) | 360 | 480 |
Reporting | 报告 | 90 | 90 |
· Test Repor | · 测试报告 | 30 | 30 |
· Size Measurement | · 计算工作量 | 30 | 30 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 30 |
合计 | 1630 | 1844 |
解题思路
刚开始拿到题目时我毫无头绪,后来看到大佬使用正则表达式就去学习了一波,关于语言的选择,python和java只学了点皮毛,比较难顶,于是就选择了c++,打了一段时间发现更难顶,难顶也得顶,学习了c++的regex库,复习了一波文件读写然后发现c++好像没有json库,只能手动格式化
设计实现过程
我只设计了一个类Information用来存储和处理数据
Information类
属性 | 含义 |
---|---|
s | 保存待处理的字符串 |
name | 姓名 |
phone | 电话 |
province | 第一级 |
city | 第二级 |
county | 第三级 |
town | 第四级 |
detailedaddress | level 1的第五级 |
da1 | level 2的第五级 |
da2 | 第六级 |
da3 | 第七级 |
方法 | 作用 |
---|---|
void GetLevel() | 从s截取level |
void GetName() | 从s截取name |
void GetPhone() | 从s截取phone |
void FiveDivision() | 对剩余地址串s进行正则处理,将地址进行五级划分 |
void SevenDivision() | 对剩余地址串s进行正则处理,将地址进行七级划分 |
void Output() | json格式化输出 |
void Solution() | 顺序调用以上函数,根据level选择不同的分级处理函数 |
具体流程
- 从字符串中提取难度等级,姓名和手机号,去除后缀“.”只留下地址部分
- 根据等级采用不同的正则表达式对地址分组匹配,采用如下正则表达式进行处理
regex exp("([^省]+自治区|.*?省|.*?行政区)?([^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|.*?市|.*?县)?([^县]+县|.+?区|.+市|.+旗|.+海域|.+岛)?([^区]+?区|.+?镇|.+?街道|.+?乡)?(.+?街|.+?路|.+?巷)?([\d]+?号|[\d]+.?道)?(.*)")
- 类json手动格式化输出
性能分析
从图中看到scrt_common_main_seh()占了最多cpu时间,这个函数用来做一系列的初始化工作
单元测试
1!李四,福建鼓楼13756899511鼓西街道湖滨路110号湖滨大厦一层.
1!张三,福州市闽13599622362侯县上街镇福州大学10#111.
1!刘湖,吉林省白山市六道江镇西村药店18694520738.
1!王五,腾冲市满邑社区华园三小区47号18694520738.
1!咸陡隐,江苏省苏州市吴江13184142847区平望镇新业织造有限公司吴江区平望镇双浜村村民委员会.
2!王五,福建省福州市鼓楼18960221533区五一北路123号福州鼓楼医院.
2!小美,北京市东15822153326城区交道口东大街1号北京市东城区人民法院.
2!王五,云南省昭通市水富18694520738县云川路1号.
2!王五,云南省迪庆藏族自治州18694520738香格里拉市.
2!王五,四川省眉山市仁寿18694520738县黑龙滩镇牌坊街.
2!王五,陕西省渭南市韩18694520738城市108国道附近.
{"姓名":"李四","手机":"13756899511","地址":["","","","福建鼓楼鼓西街道","湖滨路110号湖滨大厦一层"]}
{"姓名":"张三","手机":"13599622362","地址":["","福州市","闽侯县","上街镇","福州大学10#111"]}
{"姓名":"刘湖","手机":"18694520738","地址":["吉林省","白山市","","六道江镇","西村药店"]}
{"姓名":"王五","手机":"18694520738","地址":["","腾冲市","满邑社区","华园三小区","47号"]}
{"姓名":"咸陡隐","手机":"13184142847","地址":["江苏省","苏州市","吴江区","平望镇新业织造有限公司吴江区","平望镇双浜村村民委员会"]}
{"姓名":"王五","手机":"18960221533","地址":["福建省","福州市","鼓楼区","","五一北路","123号","福州鼓楼医院"]}
{"姓名":"小美","手机":"15822153326","地址":["北京","北京市","东城区","","交道口东大街","1号","北京市东城区人民法院"]}
{"姓名":"王五","手机":"18694520738","地址":["云南省","昭通市","水富县","","云川路","1号",""]}
{"姓名":"王五","手机":"18694520738","地址":["云南省","迪庆藏族自治州","香格里拉市","","","",""]}
{"姓名":"王五","手机":"18694520738","地址":["四川省","眉山市","仁寿县","黑龙滩镇","牌坊街","",""]}
{"姓名":"王五","手机":"18694520738","地址":["陕西省","渭南市","韩城市","","","","108国道附近"]}
异常处理
- 未输入姓名
- 1!,福建鼓楼13756899511鼓西街道湖滨路110号湖滨大厦一层.
- 手机长度小于11
- 1!李四,福建鼓楼13756511鼓西街道湖滨路110号湖滨大厦一层.
- 未输入难度
- 李四,福建鼓楼13756899511鼓西街道湖滨路110号湖滨大厦一层.
- 李四,福建鼓楼13756899511鼓西街道湖滨路110号湖滨大厦一层.
收获总结
- 学习地理知识
- 认识专业名词
- 正则表达式
- 文件读写
- vs的使用
- vs的github使用