第一次个人编程作业

一、仓库地址

二、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表格

已在(一)中展示。

posted @ 2019-09-29 16:12  jiang1436  阅读(210)  评论(1)    收藏  举报