要求0
作业连接:【https://edu.cnblogs.com/campus/nenu/2016CS/homework/2110】
要求1
git仓库地址:【https://git.coding.net/Soloversion/wf.git】
要求2
1.PSP阶段表格
SP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
Planning | 计划 | 2000 | 2240 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | ||
Development | 开发 | 1580 | 2330 |
Analysis | 需求分析 (包括学习新技术) | 120 | 150 |
Design Spec | 生成设计文档 | 90 | |
Design Review | 设计复审 (和同事审核设计文档) | ||
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 60 | 100 |
Design | 具体设计 | 240 | 500 |
Coding | 具体编码 | 920 | 1220 |
Code Review | 代码复审 | ||
Test | 测试(自我测试,修改代码,提交修改) | ||
Reporting | 报告 | 410 | |
Test Report | 测试报告 | 200 | 230 |
Size Measurement | 计算工作量 | ||
Postmortem & Process Improvement Plan | 事后总结, 提出过程改进计划 |
功能模块 | 具体阶段 | 预计时间(min) | 实际时间(min) |
功能1 | 测试完善 | 20 130 | 30 25 |
功能2 | 140 | 15 | |
功能3 | 40 210 | 未完成 |
2.分析预估耗时和实际耗时的差距原因:
•自身能力薄弱。由于自己的编程能力比较弱,所以在拿到作业之后花了很长时间去尽力实现其中的部分功能,这个过程中还包含着我对于自己之前不熟悉的语言的重新学习;
•分析不到位。可能是基础比较差和缺少经验的原因,我虽然感觉自己学过这种频率统计,但是实际仔细分析的时候才发现有很大的不同,所以出于一种不断发现问题的循环中;
•细节处理不好。对于代码的规范和整体框架,我做的并不好,脑子中没有一个outline,这是我欠缺的一种能力。
要求3
1.解题思路
先将题目要求实现的功能大致分为以下三大块:(1)读取txt文本(2)统计其中单词个数(3)将单词(按照某种顺序)输出。
对功能一进行分析:要求统计文本中不重复的单词个数,同时将大写全部转化为小写输出。
多功能而进行分析:在功能一的基础上增加了在路径下寻找指定文本,在调用功能一即可。
然而,理想很丰满,现实很骨感。分析起来好像很简单,实际上真正做起来自己完成的部分少之又少,还是在借鉴了其他博主思路的情况下。
2.部分代码展示
1)首先利用函数判断该单词是否符合规定的单词格式,从而进行第一道筛选
bool islegal( char a[] ) /* 判断是否是一个合法单词 */
{
int i = 0;
for ( i = 0; a[i] != '\0'; i++ )
if ( (a[i] >= 'a' && a[i] <= 'z') || (a[i] >= '0' && a[i] <= '9') )
return(true);
else
return(false);
}
2)将找到的单词的字母进行大小写的转换,再将转换后所得结果result存入数组中
int j = 0; /* 大写转为小写 */
while ( result[j] != '/0' && result[j + 1] != '/0' )
{
if ( result[j] >= 'A' && result[j] <= 'Z' )
{
result[j] = result[j] +32;/*单个字母的大小写转换*/
j++;
}
}
cout << result;
char *sep = " ";
3)扫描要求路径下的所有txt文件,同时选定在字典顺序中最靠前的文件,从而实现功能2.
这一部分代码是借鉴于其他博主的,引用自:https://www.cnblogs.com/tgyf/p/3839894.html
/*-------获取特定格式的文件名-------*/
void GetAllFormatFiles( string path, vector<string>& files,string format)
{
long hFile = 0;//文件句柄
struct _finddata_t fileinfo; //文件信息
string p;
if((hFile = _findfirst(p.assign(path).append("\\*" + format).c_str(),&fileinfo)) != -1)
{
do
{
if((fileinfo.attrib & _A_SUBDIR))
{
if(strcmp(fileinfo.name,".") != 0 && strcmp(fileinfo.name,"..") != 0)
{
GetAllFormatFiles( p.assign(path).append("\\").append(fileinfo.name), files,format);
}
}
else
{
files.push_back(p.assign(fileinfo.name));
}
}while(_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
4)处理输入的文件名,即只有当控制台输入“”wf -c 文件名”时,才能够对相应的.txt文件进行读取
此处对字符串的处理我引用自:http://blog.sina.com.cn/s/blog_5cef35c50100dqy5.html
bool filename()/*处理输入的文件名*/
{
bool exist=false;
string::size_type index1 = inputstr.find("-c");/*确定输入的为-c*/
if(index1!=string::npos)
{
exist=true;
index1=index1+3;
while(inputstr[index1]!=' '&&inputstr[index1]!='\n')
{
file_name=file_name+inputstr[index1];
index1++;
}
}
return exist;
}
5)对单词的出现频率进行排序,采用的算法是冒泡排序算法,此处用到数据结构当中的相关排序知识
for(k=1;k<=j-1;k++)/*利用冒泡排序算法*/
for(i=k+1;i<=j;i++)
{
if(number[k]<number[i])
{
int temp=number[k];
number[k]=number[i];
number[i]=temp;
r[0]=(char *)malloc(sizeof(w[k]));/*将对应的单词也进行交换*/
r[0]=w[k];
w[k]=(char *)malloc(sizeof(w[i]));
w[k]=w[i];
w[i]=(char *)malloc(sizeof(r[0]));
w[i]=r[0];
}
return 0;
}
要求4
由于我自己没有将各个功能全部完成,所以最后的测试部分借用的是别人的代码
1)老师样例测试

2)外国名著《飘》
3)外国短篇小说《小王子》
总结
其实说句实话,在拿到这个作业之后,我感到无从下手,只能不断的查资料,从别的博主那里获得一些相关知识,不仅耗费了大量的时间也耗费了大量的精力,重点是最后还没有完全写出来,这也让我感到迷茫和伤心,我越来越觉得自己可能不适合干这行,越来越对自己产生怀疑。再看看《构建之法》中作者用诙谐的语言给我们讲着软件工程这门学科,我更加觉得自己的渺小和无知,因为只有真正懂得的人才能用通俗的语言讲给其他人听,而我没有也做不到。