github地址
https://github.com/SunTingxin/031702619
psp表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟 ) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 45 | 80 |
Estimate | 估计这个任务需要多少时间 | 900 | 1500 |
Developm | 开发 | 400 | 500 |
Analysis | 需求分析(包括学习新技术) | 100 | 300 |
Design Spec | 生成设计文档 | 30 | 30 |
Design Review | 设计复审 | 10 | 10 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 10 | 10 |
Design | 具体设计 | 40 | 120 |
Coding | 具体编码 | 180 | 500 |
Code Review | 代码复审 | 10 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 120 |
Reporting | 报告 | 60 | 60 |
Test Report | 测试报告 | 10 | 10 |
Size Measurement | 计算工作量 | 30 | 30 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 30 | 30 |
合计 | 1915 | 3050 |
流程图
接口设计和实现
文件输入输出以utf8作为编码方式应该是用c++编写这次作业遇到的第一个接口问题了,为了使自己能基于常用编码方式编写程序,就需要对输入的数据进行编码转换。因此,我搜索到了以下的代码
wstring UToG(const char *src_str) {
int len = MultiByteToWideChar(CP_UTF8, 0, src_str, -1, NULL, 0);
wchar_t* wszGBK = new wchar_t[len + 1];
memset(wszGBK, 0, len * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, src_str, -1, wszGBK, len);
len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
char* szGBK = new char[len + 1];
memset(szGBK, 0, len + 1);
WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, szGBK, len, NULL, NULL);
string str(szGBK);
if (wszGBK) delete[] wszGBK;
if (szGBK) delete[] szGBK;
size_t cnt = 0;
setlocale(LC_ALL, "chs");
const char* pts = str.c_str();
size_t ns = str.size() + 1;
wchar_t *ptd = new wchar_t[ns];
wmemset(ptd, 0, ns);
mbstowcs_s(&cnt, ptd, ns, pts, ns);
wstring res = ptd;
delete[] ptd;
setlocale(LC_ALL, "C");
return res;
}
通过这个自定义函数,使得从文件读入的数据完成编码方式的转化,从而顺利对读入的字符串进行操作
当编码问题解决之后,接下来就是对字符串的处理了。我建立了一个类,包含了各种级别的地址和名字电话号码,对于每一行输入数据都建立一个此类的对象,在对数据处理的过程中逐渐填充完毕对象的内容。最后输出成json格式
具体分割的思想是,对于省份,由于省份必不可少且只有两个是三字,再加一个直辖市的特殊性,通过匹配很好解决,对于市,需要引用所有市的名字在其中匹配来确定是否有市,余下级别通过关键字来进行判断。
接口性能与改进
所有模块里耗时最大的就是处理市的那一级函数了,main函数花了主要内存,希望经过以后得学习能有所改进。
单元测试
样例输入
2!李四,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层.
1!张三,福建福州闽13599622362侯县上街镇福州大学10#111.
2!王五,福建省福州市鼓楼18960221533区五一北路123号福州鼓楼医院.
1!小陈,广东省东莞市凤岗13965231525镇凤平路13号.
1!鲁胞,上海市长宁区周家桥街道长宁18951233466路999号春天花园.
1!臧街经,北京市东城区北新桥街道东直门内大街民安小区8号楼15679601503.
1!双韵,安13575634949徽黄山市歙县雄村镇006县道与G56杭瑞高速歙县雄村乡防保站.
1!苗朽蕾,13884441418湖北省孝感市云梦县方庙村村委会.
1!诸葛宁盛,河南焦作市山阳区定和街15613629652道塔南路287号新兴日化.
1!冯昔唉,安徽省合肥庐江县郭河镇G3京台高速合肥市庐江18835354291县广寒桥街道.
输出结果
{"姓名":"李四","手机":"13756899511","地址":["福建省","福州市","鼓楼区","鼓西街道","湖滨路","110号","湖滨大厦一层"]},{"姓名":"张三","手机":"13599622362","地址":["福建省","福州市","闽侯县","上街镇","福州大学10#111"]},{"姓名":"王五","手机":"18960221533","地址":["福建省","福州市","鼓楼区","","五一北路","123号","福州鼓楼医院"]},{"姓名":"小陈","手机":"13965231525","地址":["广东省","东莞市","","凤岗镇","凤平路13号"]},{"姓名":"鲁胞","手机":"18951233466","地址":["上海","上海市","长宁区","周家桥街道","长宁路999号春天花园"]},{"姓名":"臧街经","手机":"15679601503","地址":["北京","北京市","东城区","北新桥街道","东直门内大街民安小区8号楼"]},{"姓名":"双韵","手机":"13575634949","地址":["安徽省","黄山市","歙县","雄村","镇006县道与G56杭瑞高速歙县雄村乡防保站"]},{"姓名":"苗朽蕾","手机":"13884441418","地址":["湖北省","孝感市","云梦县","方庙村","村委会"]},{"姓名":"诸葛宁盛","手机":"15613629652","地址":["河南省","焦作市","山阳区","定和街道","塔南路287号新兴日化"]},{"姓名":"冯昔唉","手机":"18835354291","地址":["安徽省","合肥市","庐江县","郭河镇","G3京台高速合肥市庐江县广寒桥街道"]}]