软工实践寒假作业(2/2)
软件工程实践第一次寒假作业
这个作业属于哪个课程 | 2021春软件工程实践|S班 |
---|---|
这个作业的要求在哪里 | 寒假作业2/2 |
这个作业的目标 | 1、阅读《构建之法》并提出问题 2、学习使用git以及github 3、制定自己的代码规范 4、实现WordCount命令行程序 |
其他参考文献 | 《构建之法》、《廖雪峰的Git教程》 |
任务一.对《构建之法》的思考
1:结对编程
两人进行角色互换,阅读对方的代码、理解对方思路时是否会浪费大量时间?
2:团队中的鹦鹉
这段文字包含对鹦鹉类型角色的鄙视,但我认为一个好的想法,好的构思对一个软件的开发是非常关键的,特别是考虑到软件日后在市场中的表现,一个鹦鹉类型的角色在团队之中是至关重要的。
3:大部分成功的创新者不是先行者
引发我的思考:成功不一定需要创新,更需要有好的眼光和坚持。
4:好的想法不一定会赢
人的习惯实在是一个可怕的东西,如同例子中关于键盘布局的例子,即使另一种布局要比现在的键盘布局提升大量效率,可在习惯的驱使下,大部分人还是不愿意更换键盘布局。
5:创新的方法
不是标新立异就是创新,要掌握正确的创新方法,否则只会沦为笑柄。
任务二.WordCount编程
2.1项目github链接
2.2codestyle链接
2.3PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
• Estimate | • 估计这个任务需要多少时间 | 30 | 40 |
Development | 开发 | ||
• Analysis | • 需求分析 (包括学习新技术) | 90 | 90 |
• Design Spec | • 生成设计文档 | 20 | 25 |
• Design Review | • 设计复审 | 20 | 15 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 5 | 5 |
• Design | • 具体设计 | 60 | 70 |
• Coding | • 具体编码 | 480 | 450 |
• Code Review | • 代码复审 | 90 | 90 |
• Test | • 测试(自我测试,修改代码,提交修改) | 120 | 100 |
Reporting | 报告 | ||
• Test Repor | • 测试报告 | 60 | 40 |
• Size Measurement | • 计算工作量 | 30 | 30 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 90 | 90 |
合计 | 1095 | 1015 |
2.4解题思路
- 分析需求:
- 要实现文件的读写功能;
- 统计文件字符数并输出;
- 统计文件的单词总数并输出;
- 统计文件的有效行数并输出;
- 统计文件中各单词的出现次数并按序输出频率前十的单词及出现次数。
- 逐步实现需求。
2.5设计与实现过程
- 实现了几个函数
- int isChar(char c);//判断是否是字母
- int isCharOrDig(char c);//判断是否是数字或字母
- int countChar(string input);//计算字符数
- int countWord(string input);//计算单词数
- void output(ofstream& out,string input);//输出到文件
- 关键代码
for(;j<i+4;j++){
if(!isChar(input[j])){
temp=0;//只有前四个字符都为字母是才被认为是单词
break;
}
}
multimap<int,string,greater<int> > sortMap;//利用map类自动排序的特性,对词频排序
for(map<string,int>::iterator it=stringMap.begin();it!=stringMap.end();it++){
sortMap.insert(pair<int,string>(it->second,it->first));
// cout<<it->first<<endl;
}
int cnt=0;
for(map<int,string>::iterator it=sortMap.begin();it!=sortMap.end()&&cnt<10;it++){
// cout<<it->second<<": "<<it->first<<endl;
out<<it->second<<": "<<it->first<<endl;//按词频输出
cnt++;
}
2.6单元测试与性能分析
单元测试
性能分析
2.7异常处理
in.open(argv[1]);
if(!in.is_open())
cout<<"文件打开失败!"<<endl;
只做了打开文件时的异常处理
2.8心路历程与收获
- 因为选课的问题,加入班级群后只剩几天的时间,所以代码写的很急,也没有使用面向对象的方式编程,之后还需要进行改进,同时尝试用java也实现本次作业的功能。
- 虽然之前也有使用过github,但是只是将完成后的代码提交到服务器。在这次作业中,更深入的对github的功能进行了了解,体会到了用github仓库管理代码的好处,今后的编程都要尽量使用github帮助进行代码管理。
- 之前编程时,特别是大一使用dev-C++编程时,由于编译器没有自动纠正代码格式,自己也一直没有注意代码的规范,程序杂乱无章,可读性很差。这次由于作业有了要求,也在这方面多注意了一点,写出的代码确实更好读懂,并且也更加美观。