项目地址 | 仓库地址 |
结队伙伴 | [陈宇红] |
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 20 | 40 |
Estimate | 估计这个任务需要多少时间 | 480 | 600 |
Development | 开发 | 40 | 45 |
Analysis | 需求分析(包括学习新技术) | 20 | 15 |
Design Spec | 生成设计文档 | 60 | 60 |
Design Review | 设计复审(和同事审核设计文档) | 20 | 30 |
Coding Standerd | 代码规范(为目前的开发制定合适的规范) | 20 | 15 |
Design | 具体设计 | 80 | 100 |
Coding | 具体编码 | 240 | 300 |
Code Review | 代码复审 | 120 | 120 |
Test | 测试(自我测试,修改代码,提交修改) | 240 | 200 |
Reporting | 报告 | 30 | 30 |
Test Report | 测试报告 | 60 | 60 |
Size Measurement | 计算工作量 | 30 | 30 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | 50 |
合计 | 1040 | 1095 |
解题思路
思路描述:
1.细分题目,划分成一个个小任务如下图所示
2.因为c++还没有学到文件操作,所以我就先看了教材,大致学了下文件基本操作,再在网上查了文件操作的教程。
3.此次代码涉及到了排序,我就翻了数据结构关于排序方面的知识,以及如何写代码。
设计过程
1.规划出大致方法
2.归纳整理函数,类及之间的关系
我们经过协商大致把每一个功能都设计成一个函数,这样比较整洁且比较有归纳性,在调试过程也比较容易找到错处。然后是划分类,我们把最基础的统计字符方面划分为一个类,再把关于单词的划分为一个类,最后把行数统计划分为一个类。函数与类之间最重要的是类中包含函数,因为我们在设计的时候把每一个需要实现的功能都设计成了一个函数,所以在类里面可以很容易想到把函数划分进去。
代码规范
由于这是我俩第一次用c++完成一个项目,所以我们参考了网上的c++代码规范知否,知否
代码复审
审查模块名
coutword_1
1.主要问题
1.发现同伴在设计过程出现了一个功能上的遗漏,在限制单词条件时,遗漏了“以数字开头"不是单词这一条件
2.第二个问题是我在统计单词数所用的循环结构中,由于逻辑表达不当造成了死循环。
修改前:
void word_count2::read_str()
{
char ch;//收集每一个文件中字符
string str_1;//记录每一个规定的字符
long pos;//记录f_in的位置
int fir = 0;//判断第一个字符是否为字母
f_in.clear();
f_in.seekg(0, ios::beg);
while (!f_in.eof())
{
int read=0;
f_in.get(ch);
read++;
int k;
f_in.seekg(pos);
//f_in.get(ch);
for ( k = 1; k < 4; k++)
{
read++;
f_in.get(ch);
if ( ch<'A' || (ch > 'Z'&& ch < 'a') || ch>'z' ) break;
}
if (k == 4)
{
f_in.get(ch);
while (('a' <= ch && 'z' >= ch) || ('A' <= ch && 'Z' >= ch)|| ( '0' <= ch && ch <= '9'))
{
f_in.get(ch);
read++;
}
pos = f_in.tellg();
f_in.seekg(pos - read);
getline(f_in, str_1, ch);
store_str(str_1);
f_in.seekg(pos);
}
}
}
}
修改后:
void word_count2::read_str()
{
char ch;//收集每一个文件中字符
string str_1;//记录每一个规定的字符
long pos;//记录f_in的位置
int fir = 0;//判断第一个字符是否为字母
f_in.clear();
f_in.seekg(0, ios::beg);
while (!f_in.eof())
{
f_in.get(ch);
fir++;
if (('a' <= ch && 'z' >= ch) || ('A' <= ch && 'Z' >= ch))
{
int read=1;//记录规定字符创的长度。
//-------------------------------------------------->增加代码
if (fir == 1)
{
pos = f_in.tellg();
}
else
{
pos = f_in.tellg();
f_in.seekg(pos-1);//得到上一个字符
f_in.get(ch);
}
if (('0' <= ch && ch <= '9') || ch== '" ')
{
f_in.seekg(pos);
f_in.get(ch);
while (('a' <= ch && 'z' >= ch) || ('A' <= ch && 'Z' >= ch) || ('0' <= ch && ch <= '9'))
{
f_in.get(ch);
}
}//-------------------------------------------------------------------------------------------------------------------
else
{
read++;
int k;
f_in.seekg(pos);
//f_in.get(ch);
for ( k = 1; k < 4; k++)
{
read++;
f_in.get(ch);
if ( ch<'A' || (ch > 'Z'&& ch < 'a') || ch>'z' ) break;
}
if (k == 4)
{
f_in.get(ch);
while (('a' <= ch && 'z' >= ch) || ('A' <= ch && 'Z' >= ch)|| ( '0' <= ch && ch <= '9'))
{
f_in.get(ch);
read++;
}
pos = f_in.tellg();
f_in.seekg(pos - read);
getline(f_in, str_1, ch);
store_str(str_1);
f_in.seekg(pos);
}
}
}
}
}
2.复审感悟
在写代码时,对于重要部分我们一定要注释,不然会对代码复审造成很大的影响。甚至要重新想代码的思路.
性能改进
性能改进时间花费
大致是120分钟
改进思路
性能分析图