第一次个人编程作业
一、仓库地址
二、PSP表格
| PSP2.1 | Personal Software Process stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 45 | 60 |
| Estimate | 估计这个任务需要多少时间 | 45 | 60 |
| Developments | 开发 | 850 | 1150 |
| Analysis | 需求分析(包括学习新技术) | 200 | 250 |
| Design Review | 设计复审 | 30 | 45 |
| Coding Standard | 代码规范(为目前的开发制定或选择合适的规范) | 20 | 30 |
| Design | 具体设计 | 200 | 250 |
| Coding | 具体编码 | 550 | 500 |
| Code Review | 代码审查 | 100 | 80 |
| Test | 测试(自我测试、修改代码、提交修改) | 200 | 260 |
| Reporting | 报告 | 100 | 80 |
| Test Report | 测试报告 | 100 | 80 |
| Size Mesurement | 计算工作量 | 30 | 30 |
| Postmortem&Process Improvement Plan | 时候总结、并提出改进计划 | 20 | 40 |
| 合计 | 2345 | 2755 |
三、计算模块接口的设计与实现过程
(1)解题思路
刚看见题目时,面对着这么多要求感觉无从下手。经过仔细分析和网上寻找资料后终于想到了解题方法。但由于个人实力,难度三实在没办法,只能暂时先放弃。
首先,我先判断了难度的等级,利用等级分别写了两个差不多的函数。在这个函数中,我先将姓名提取出来,再将电话号码提取出来,并从字符串中删除,这样字符串中就只剩下地址了。再利用index0f、substring等一次对地址进行每一级的划分。
之后就是github和其他要求里面需要下载的软件的使用了,跟着教程和同学的帮助一步一步做下来。
(2)设计实现过程
我是用Java来写这个程序。我只用了两个类。一个类用于文件的输入输出,另一个用于字符串的分割。对于字符串的分割并不是特别难,注意特殊情况就行。
(3)算法的独到之处
1、分解出难度级别
String flag=lineTex.substring(0,1);
String address=lineTex.substring(2);
2、删除例子后面的.
int x=str.indexOf('.');
str=str.substring(0,x);
3、利用逗号分解出姓名
int index = str.indexOf(',');
String name = str.substring(0,index);
3、利用电话号码的特点分解出来,并从字符串中删除
Pattern pattern = Pattern.compile("((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\\d{8}");
Matcher matcher = pattern.matcher(str);
matcher.find();
String phone = matcher.group();
object.put("手机",phone);
str = str.replaceAll(phone, "");
5、依次分解出各级地址
String province="";
if(str.indexOf("自治区")!=-1)
{
province=str.substring(0, str.indexOf("自治区")+3);
str=str.substring(str.indexOf("自治区")+3);
}
else if(str.indexOf("行政区")!=-1)
{
province=str.substring(0, str.indexOf("行政区")+3);
str=str.substring(str.indexOf("行政区")+3);
}
else if(str.indexOf("省")!=-1)
{
province=str.substring(0, str.indexOf("省")+1);
str=str.substring(str.indexOf("省")+1);
}
else if(str.indexOf("北京")!=-1)
province="北京";
else if(str.indexOf("天津")!=-1)
province="天津";
else if(str.indexOf("上海")!=-1)
province="上海";
else if(str.indexOf("重庆")!=-1)
province="重庆";
else
{
String f="";
f=str.substring(0,3);
if(f.equals(h)) //h代表黑龙江
{
province=str.substring(0,3)+"省";
str=str.substring(3);
}
else
{
province=str.substring(0,2)+"省";
str=str.substring(2);
}
}
其他各级与省类似。
四、计算模块接口部分的性能改进
(1)改进时间
花了挺多时间的,因为这个题目要求较多,开始的时候考虑不够详细,漏掉了许多情况。
(2)改进思路
1、一开始没有想到黑龙江这个三个字的省,分级的时候只分割了前两个字,照成错误。于是,增加了一个判断语句,根据情况适当分割字符。
2、一开始没有看见有分五级地址和七级地址照成错误,于是增加判断语句,选择合适的函数进行后续操作。
3、一开始没有考虑到省道的情况,于是将省的判断放在了后面。
4、一开始没有注意到每个例子后面有个.,于是后面增加了去除.的代码。
(3)性能分析图


五、计算模块部分单元测试展示
(1)单元测试代码
JSONObject object = new JSONObject();
//获取姓名
int x=str.indexOf('.');
str=str.substring(0,x);
int index = str.indexOf(',');
String name = str.substring(0,index);
object.put("姓名",name);
str = str.substring(index+1);
//获取电话号码
// 将给定的正则表达式编译到模式中
Pattern pattern = Pattern.compile("((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\\d{8}");
// 创建匹配给定输入与此模式的匹配器。
Matcher matcher = pattern.matcher(str);
//查找字符串中是否有符合的子字符串
while(matcher.find()){
//得到电话号码
String phone = matcher.group();
object.put("手机",phone);
//将电话号码从地址中切除
str = str.substring(0,matcher.start(0))+str.substring(matcher.end(0));
break;
}
String s="";
//获取省份
String province="";
if(str.indexOf("自治区")!=-1)
{
province=str.substring(0, str.indexOf("自治区")+3);
str=str.substring(str.indexOf("自治区")+3);
}
else if(str.indexOf("行政区")!=-1)
{
province=str.substring(0, str.indexOf("行政区")+3);
str=str.substring(str.indexOf("行政区")+3);
}
else if(str.indexOf("省")!=-1)
{
province=str.substring(0, str.indexOf("省")+1);
str=str.substring(str.indexOf("省")+1);
}
else if(str.indexOf("北京")!=-1)
province="北京";
else if(str.indexOf("天津")!=-1)
province="天津";
else if(str.indexOf("上海")!=-1)
province="上海";
else if(str.indexOf("重庆")!=-1)
province="重庆";
else
{
String ff="";
ff=str.substring(0,3);
if(ff.equals(h))
{
province=str.substring(0,3)+"省";
str=str.substring(3);
}
else
{
province=str.substring(0,2)+"省";
str=str.substring(2);
}
}
s+="[\""+province+"\",";
//提取市
String city="";
if(str.indexOf("市")!=-1)
{
city=str.substring(0, str.indexOf("市")+1);
str=str.substring(str.indexOf("市")+1);
}else
{
if(str.indexOf("县")!=-1)
{
String tt="";
tt=str.substring(0, str.indexOf("县")+1);
int ll=tt.length();
if(ll>4)
{
city=str.substring(0,2)+"市";
str=str.substring(2);
}
}
else if(str.indexOf("区")!=-1)
{
city=str.substring(0,2)+"市";
str=str.substring(2);
}
}
s+="\""+city+"\",";
//提取区县
String region="";
if(str.indexOf("区")!=-1)
{
region=str.substring(0, str.indexOf("区")+1);
str=str.substring(str.indexOf("区")+1);
}else if(str.indexOf("县")!=-1)
{
region=str.substring(0, str.indexOf("县")+1);
str=str.substring(str.indexOf("县")+1);
}else if(str.indexOf("市")!=-1)
{
region=str.substring(0, str.indexOf("市")+1);
str=str.substring(str.indexOf("市")+1);
}
s+="\""+region+"\",";
//提取街道/镇
String town="";
if(str.indexOf("街道")!=-1)
{
town=str.substring(0, str.indexOf("街道")+2);
str=str.substring(str.indexOf("街道")+2);
}else if(str.indexOf("镇")!=-1)
{
town=str.substring(0, str.indexOf("镇")+1);
str=str.substring(str.indexOf("镇")+1);
}
else if(str.indexOf("乡")!=-1)
{
town=str.substring(0, str.indexOf("乡")+1);
str=str.substring(str.indexOf("乡")+1);
}
s+="\""+town+"\",";
//提取路
String way="";
if(str.indexOf("路")!=-1)
{
way=str.substring(0, str.indexOf("路")+1);
str=str.substring(str.indexOf("路")+1);
}else if(str.indexOf("街")!=-1)
{
way=str.substring(0, str.indexOf("街")+1);
str=str.substring(str.indexOf("街")+1);
}else if(str.indexOf("巷")!=-1)
{
way=str.substring(0, str.indexOf("巷")+1);
str=str.substring(str.indexOf("巷")+1);
}
s+="\""+way+"\",";
//提取门牌号
String tablet="";
if(str.indexOf("号")!=-1)
{
tablet=str.substring(0, str.indexOf("号")+1);
str=str.substring(str.indexOf("号")+1);
}
s+="\""+tablet+"\",";
s+="\""+str+"\"]";
object.put("地址",s);
return object;
}
(2)测试答案


(3)测试数据来源
题目给出以及自己根据特殊情况所想出。
六、计算模块部分异常处理说明
(1)程序中不包含难度三的补全操作
输入:1!李四,福建省闽13599622362侯县上街镇福州大学10#111.
输出:{"姓名":"李四","手机":"13599622362","地址":["福建省","","闽侯县","上街镇","福州大学10#111"]}
(2)当后续地址含有“区”字时,会对前面判断产生影响
输入:1!湘江,福建省福13112345678州市闽侯县上街镇学园南路2号福州大学旗山校区.
输出:{"姓名":"湘江","手机":"13112345678","地址":["福建省","福州市","闽侯县上街镇学园南路2号福州大学旗山校区","",""]}
七、psp表格
已在(一)中展示。
浙公网安备 33010602011771号