第一次编程作业

github

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划:明确需求和其他因素,估计以下任务需要多少时间 30 30
Estimate 估计这个任务需要多少时间 30 30
Development 开发(包含下面8个子任务) 625 1035
Analysis 需求分析(包括学习新技术) 120 500
Design Spec 生成设计文档 10 10
Design Review 设计复审 5 5
Coding Standard 代码规范(为开发制定合适的规范) 10 10
Design 具体设计(用伪代码,流程图等方法来设计具体模块) 60 30
Coding 具体编码 300 360
Code Review 代码复审 60 30
Test 测试(自我测试,修改,提交修改) 60 90
Reporting 报告 50 330
Test Report 测试报告 10 20
Size Measurement 计算工作量 10 10
Postmortem & Process Improvement Plan 事后总结并提出过程改进计划 30 300
合计 715 1115

解题思路

  1.首先根据“!”来将该条输入的难度提取出来,再删去“num!”。
  2.再根据“,”来将姓名提取出来,再删去“name,”。
  3.接下来根据连续11个字符皆为数字,从而提取出电话号码,再将字符串中的电话号码删去。
  4.此时我们已经得到只含有地址信息的字符串了,再依据“省”,“市”,“县”等关键字再将其一一提取(愚蠢的我并没有用正则表达式)。
  以上为第一个版本。

设计实现过程

      对于上述的第一个版本,总体代码我只用了一个类和几个函数实现了(不包含类的成员函数),结果的每部分内容我都设置成了成员变量,再利用成员函数进行封装。以下是我用visual studio生成的类图。

类:info

表头 表头
is_shenhui() 判断是不是省会城市
setName() 提取名字
setPhoneNum() 提取电话
setProvince() 提取省信息
setCity() 提取市信息
setCounty() 提取县信息
setTown() 提取镇信息
setRoad() 提取街道信息
setDetail() 提取具体信息

部分实现

方法:helper
判断当前地址信息中是否有关键字,根据关键字从而将地址慢慢划分出来。
string helper(string key)
{
	//string key = "省";
	string address;
	for (int i = 0; i < str.length(); i++) {
		if (str[i] == key[0] && str[i + 1] == key[1]) {//说明此时地址包括“省/市/县”这个字
			int index = i + 1;
			for (int i = 0; i <= index; i++) {
				address += str[i];
			}
			//this->province = province;
			str.erase(0, index + 1);
			return address;
		}
	}
	return "";
}

性能分析图


      从性能分析图来看,大概90%的时间都花在了文件输入和输出上,其中文件输入占比77%(有点大。。。),好像没什么办法可以改进。其中有个dispose()函数是我用来处理字符串的核心代码:

Info dispose(Info info)
{
	int Level;//提取题目难度
	Level = SetLevel();
	str.erase(0, 2);//去除题目难度的字符串
	str = info.SetName(str);//提取name
	str = info.SetPhoneNum(str);//提取电话
	info.isShenhui();
	info.SetProvince();
	info.SetCity();
	info.SetCounty();
	info.SetTown();
	//cout << str << endl;
	if (Level == 1) {
		info=disposeLevel1(info);
		//cout << info.detail<< endl;
	}
	else if (Level == 2) {
		info = disposeLevel2(info);
		//cout << info.detail << endl;
	}
	return info;
}

单元测试

这是我单元测试的代码,测试在正常输入下能否得到正确的省份

namespace UnitTest1
{
	TEST_CLASS(UnitTest1)
	{
	public:
		
		TEST_METHOD(TestMethod1)
		{
			string province = "福建省";
			ifstream in("1.txt");
			/*while (!in.eof())
			{*/
				getline(in, str);
				int level = SetLevel();
				Info info;
				iszhixiashi = false;
				info = dispose(info);
				Assert::AreEqual(info.GetProvince(), province);
				/*cout << info.GetName() << endl;
				cout << info.GetPhoneNum() << endl;
				cout << Level << " " << str << endl;*/
			/*}*/

		}
	};
}

关于测试覆盖率,不知道为啥我的visual stdio 在测试完样例后,找不到显示覆盖率的控件。。。。

异常处理

对于异常处理我只想从输入上不符合格式规范来处理了。。。。
例如

  • 2!,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层.(没告诉名字)
  • 1!李四,13756899511湖滨大厦一层.(地址符合需求)
  • 2!李四,福建省福州899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层.(手机号不符合长度)
  • !,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层.(没有表明难度)

总结

      诶,把作业放在最后两天完成简直太难了,出去以上的内容,编写博客一样十分麻烦事。。这次作业出现的很多词汇我都不理解(就是没见过),该编程作业我只写最简单的实现方法,符合大部分地区的需求。大部分的时间主要还是花在了学习新知识上,单元测试部分还没弄好,等待更新。。怪我基础太弱,啥也不会,除了编程和GitHub,其他内容基本都是最近学的。学的过于匆忙,导致学的很浅,操作都是按照教程一步步来的,但也算是混了个脸熟吧,希望以后见面它们还认识我。。

posted @ 2019-09-17 20:54  阮君曦  阅读(212)  评论(4编辑  收藏  举报