1.Github 地址
项目地址
2.psp表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 120 |
·Estimate | 估计这个任务需要多少时间 | 30 | 30 |
·Development | 开发 | 1200 | 900 |
· Analysis | 需求分析 (包括学习新技术) | 90 | 180 |
·Design Spec | 生成设计文档 | 20 | 20 |
·Design Review | 设计复审 | 20 | 30 |
· Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 60 | 120 |
Design | 具体设计 | 60 | 60 |
·Coding | 具体编码 | 600 | 720 |
· Code Review | 代码复审 | 60 | 120 |
·Test | 测试(自我测试,修改代码,提交修改) | 30 | 30 |
·Reporting | 报告 | 240 | 200 |
·Test Report | 测试报告 | 60 | 60 |
·Size Measurement | 计算工作量 | 40 | 50 |
·Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 30 |
合计 | 2600 | 2670 |
3.计算模块接口设计与实现过程
I)主要思想:
a.从民政局(http://www.mca.gov.cn/article/sj/xzqh/2019/201908/201908271607.html)获取地址前三级地址("直辖市/省(省级)","直辖市/市(地级)","区/县/县级市(县级)")、划分码(数字码有一定规律)打表存储于代码中。
b.由于utf-8下vs存在乱码的问题,将中文string转换成wstring型,存int型表。通过UnicodeToUTF8(),UTF8ToUnicode(); 两个函数进行string、wstring转码。
c.前三级通过打表的数据进行字符串匹配找到答案,后面逐级匹配关键词"区/县/县级市","街道/镇/乡"截取字符串。每次处理生成新的子串,在子串基础上进行下一级处理。
d.因为存在缺省,将前三级地址地址名和行政区划分拆分成前缀和后缀进行匹配,先匹配前缀,前缀匹配成功再考虑后缀是否也需要。
e.附加题缺省补充想法(不会调用地图api,只能解决前三级缺省部分的补全):
i)通过前缀匹配,补全后缀;
ii)当前一级缺省而后一级存在时,通过行政区划分码规律可以求得其上一级地址的行政区划分码,通过码查询上一级的地址。(第一级行政区划代码是1000倍数,第二级是100的倍数,直辖市需要特判)
f.代码实现:一个类,通过类内函数分块实现不同功能,逐级处理。
II)类、类内函数
类结构:
class set_data{
public:
string to_be_solve;//输入的每行
string name;
string phone_num;
string address[10];//address[0]存储未划分的地址初始状态;
int demend_kind; //需求种类:五级、七级、七级缺省补充
set_data(string string_input) :to_be_solve(""), name(""), phone_num("") {
to_be_solve = string_input;
}
~set_data() {};
void preprossing(){}
void choose_demend(){}
void demend_1(){}
void demend_2(){}
void demend_3(){}
void PRINT(){}
}
函数对应功能:
函数 | 功能 |
---|---|
preprossing(){} | 预处理操作,先处理名字、电话号码、需求,将地址存于address[0] |
choose_demend(){} | 根据需求选择demend_x() |
demend_1() | 1!的需求的字符串处理 |
demend_2() | 2!的需求的字符串处理 |
demend_3() | 3!的需求的字符串处理 |
void PRINT(){} | 输出 |
4.计算模块接口部分的性能改进
时间开销主要在转码,字符串处理的stl函数上。
改进思路:手打stl,自己手写,常数优化??? (我太难了),查找可以考虑用二分查找优化下,多级地址之间匹配查找的枚举方式把从头找到尾改成按照行政区划码的规律查,字符串匹配用kmp,emmmm
5.计算模块部分单元测试展示
Input file:
2!李四,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层.
1!张三,福建福州闽13599622362侯县上街镇福州大学10#111.
2!王五,福建省福州市鼓楼18960221533区五一北路123号福州鼓楼医院.
3!小美,北京市东15822153326城区交道口东大街1号北京市东城区人民法院.
1!小陈,广东省东莞市凤岗13965231525镇凤平路13号.
Output file:
0 | |
姓名 | "李四" |
手机 | "13756899511" |
地址 | |
0 | "福建省" |
1 | "福州市" |
2 | "鼓楼区" |
3 | "鼓西街道" |
4 | "湖滨路" |
5 | "110号" |
6 | "湖滨大厦一层" |
1 | |
姓名 | "张三" |
手机 | "13599622362" |
地址 | |
0 | "福建" |
1 | "福州" |
2 | "闽侯县" |
3 | "上街镇" |
4 | "福州大学10#111" |
2 | |
姓名 | "王五" |
手机 | "18960221533" |
地址 | |
0 | "福建省" |
1 | "福州市" |
2 | "鼓楼区" |
3 | "" |
4 | "五一北路" |
5 | "123号" |
6 | "福州鼓楼医院" |
3 | |
姓名 | "小美" |
手机 | "15822153326" |
地址 | |
0 | "北京" |
1 | "北京市" |
2 | "东城区" |
3 | "" |
4 | "" |
5 | "交道口东大街1号" |
6 | "北京市东城区人民法院" |
4 | |
姓名 | "小陈" |
手机 | "13965231525" |
地址 | |
0 | "广东省" |
1 | "东莞市" |
2 | "" |
3 | "凤岗镇" |
4 | "凤平路13号" |
代码覆盖率:
未覆盖情况:样例对应需求无直辖市特判需求的情况、样例中不需要使用到demend_3()中一些补全操作的判断和操作;
6.计算模块部分异常处理说明
a.input:1!小陈,广东省东莞市凤岗13965231525镇凤平路13号.
异常情况:将凤字从凤岗镇截取出来作为第三级地址,岗镇为第四级别;
原因:因为是暴力访问每个地址先匹配前缀,再考虑后缀是否需要延伸,存在“凤县”第三级地址前缀为“凤”, 把凤岗镇拆封了;
改进:对地名前缀为单汉字不考虑前缀的匹配,考虑全名匹配。
b.input:3!小美,北京市东15822153326城区交道口东大街1号北京市东城区人民法院.
异常情况:无法补全、截取处街道这一级地址
原因:算法缺陷只能处理前三级存在后项才能补全前项;原地址缩写无法匹配到“街道”这一字串;
改进:等学会c++调用地图api再改变算法;
7.总结
a.吃了不会java、py的亏,只好头铁肝c++;
b.C++造轮子,基本找不到模版可以用的,全靠手敲;
c.utf-8编码,中文处理在macos端搞没啥问题,到vs就乱码了,同样的问题吃了好几次的亏,改了好几次,最后通通改wstring处理,再转码输出;
d.尽快学掉java基础的东西,学习api调用。