软件工程第1次作业
要求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  | 
 估计这个任务需要多少时间,并规划大致工作步骤  | 
 2000  | 
 2240  | 
| 
 Development  | 
 开发  | 
 1580  | 
 2330  | 
| 
 Analysis  | 
 需求分析 (包括学习新技术)  | 
 120  | 
 150  | 
| 
 Design Spec  | 
 生成设计文档  | 
 90  | 
 120  | 
| 
 Design Review  | 
 设计复审 (和同事审核设计文档)  | 
 0  | 
 0  | 
| 
 Coding Standard  | 
 代码规范 (为目前的开发制定合适的规范)  | 
 60  | 
 100  | 
| 
 Design  | 
 具体设计  | 
 240  | 
 500  | 
| 
 Coding  | 
 具体编码  | 
 920  | 
 1220  | 
| 
 Code Review  | 
 代码复审  | 
 60  | 
 90  | 
| 
 Test  | 
 测试(自我测试,修改代码,提交修改)  | 
 90  | 
 150  | 
| 
 Reporting  | 
 报告  | 
 410  | 
 500  | 
| 
 Test Report  | 
 测试报告  | 
 200  | 
 230  | 
| 
 Size Measurement  | 
 计算工作量  | 
 90  | 
 120  | 
| 
 Postmortem & Process Improvement Plan  | 
 事后总结, 提出过程改进计划  | 
 120  | 
 150  | 
| 
 功能模块  | 
 具体阶段  | 
 预计时间(min)  | 
 实际时间(min)  | 
| 
 功能1  | 
 具体设计 具体编码 测试完善  | 
 20 130 20  | 
 30 200 25  | 
| 
 功能2  | 
 具体设计 具体编码 测试完善  | 
 30 140 20  | 
 15 150 25  | 
| 
 功能3  | 
 具体设计 具体编码 测试完善  | 
 
 40 210 30 
  | 
 未完成 未完成 未完成  | 
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)外国短篇小说《小王子》

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