第一次个人编程作业
**一、Github地址 **
二、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
· Planning | · 计划 | 15 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 900 | 1297 |
· Development | · 开发 | 20 | 125 |
· Analysis | · 需求分析 (包括学习新技术) | 400 | 860 |
· Design Spec | · 生成设计文档 | 30 | 20 |
· Design Review | · 设计复审 | 20 | 15 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 23 |
· Design | · 具体设计 | 20 | 13 |
· Coding | · 具体编码 | 240 | 375 |
· Code Review | · 代码复审 | 45 | 33 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 300 |
· Reporting | · 报告 | 30 | 90 |
· Test Repor | · 测试报告 | 20 | 30 |
· Size Measurement | · 计算工作量 | 10 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 10 |
· 合计 | 950 | 1944 |
三、解题思路
刚开始拿到这个题目的时候很懵,因为一直以来对字符串的问题都不是很擅长,所以并没想到什么好的办法,所以就拖延了,再加上班导工作和部门等等,所以在14号才开始正式打算写。最开始想查有没有相似的题目看看思路,但是没有。于是开始询问大佬,大佬表示用正则表达式,我:“......",那是个啥,好吧,度娘在线为你解答,了解以后大概有了方向,用正则表达式匹配出电话啊省市县街道等等。然后开始学习正则,发现:可能python和java用正则会更简单,但我只会一点点C++,为了能少打几行代码,我试图入门python,找了视频,看了第一课时“愉快的开始”,就没有然后了,我意识到这是不现实的且冒险的,最后还是老老实实的用C++了。
思路:
- 先判断级别,然后把级别删除
- 用正则把电话提取出来,然后把电话从字符串里删除
- 再查找‘,’所在位置,然后可以得到姓名
- 删除姓名的到一串只有地址的字符串
- 然后用依次分离省市等,每分离一个就将它从原字符串中删去,最后剩下的就是最好一部分的详细地址
四、设计实现
各函数
序号 | 函数名 | 说明 |
---|---|---|
1 | int level(string dz) | 判断并返回难度级别 |
2 | string dz1(string dz) | 删掉前缀和句末'.'后的地址 |
3 | string number(string dz) | 匹配电话并返回 |
4 | string dz2(string dz) | 删掉11位电话后的地址 |
5 | string name(string dz) | 匹配姓名 |
6 | string dz3(string dz) | 删掉姓名,此后的字符串是纯地址串 |
7 | void cut5(string dz) | 匹配分割5级地址 |
8 | void cut7(string dz) | 匹配分割7级地址 |
流程图
关键算法说明
关键算法为匹配的正则表达式:除了省市的匹配,例如:^.+((街道)|镇|乡)。省市的匹配,省市由于会出现没有后缀的情况,我不是用正则。
五、性能改进
性能分析图
六、单元测试
测试代码
//匹配区|县
smatch result;
regex r("^.+(区|县)");
regex_search(dz, result, r);
string qx = result.str();
//提取区|县后的地址
dz = regex_replace(dz, r, "");
//匹配街道|镇|乡
smatch result1;
regex r1("^.+((街道)|镇|乡)");
regex_search(dz, result1, r1);
string jzx = result1.str();
//提取街道|镇|乡后的地址
dz = regex_replace(dz, r1, "");
//匹配路
smatch result2;
regex r2("^.+路");
regex_search(dz, result2, r2);
string lu = result2.str();
//提取路后的地址
dz = regex_replace(dz, r2, "");
//匹配门牌号
smatch result3;
regex r3("^.+号");
regex_search(dz, result3, r3);
string door = result3.str();
//提取门牌号后的地址
dz = regex_replace(dz, r3, "");
测试数据
2!李四,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层.
测试输出
(仅测试答案,并不是json格式输出)
七、心路历程和收获
我高估了我自己,这次的代码真的让我意识到,我可能不仅不会java、python,C++也只是入门级别的,很多函数的调用以及一些基本的东西都不是很熟练。这次个人编程我真的是了解到了百度是多么好用的东西,查资料能力分分钟锻炼出来了。也强迫自己从一开始的慌乱到镇定,刚开始很想抱大腿但出于很多顾虑和觉得不妥还是自己硬着头皮打了,虽然最终还是没有打出十分准确的结果,但学到了很多东西,也觉得这种努力的过程很充实(咳咳!我打代码的能力要被唤醒了),这个过程中我最快乐的时候就是解决全部error以后成功运行出结果的那一刻了(令人感动)。