第一次编程作业
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,其他内容基本都是最近学的。学的过于匆忙,导致学的很浅,操作都是按照教程一步步来的,但也算是混了个脸熟吧,希望以后见面它们还认识我。。