PSP阶段 |
所花时间百分比(440 / min) |
预计所花时间(420/min) |
|
计划 |
43 |
40 |
|
·明确需求和其他相关因素,估计每段时间成本 |
43 |
40 |
|
开发 |
372 |
360 |
|
·需求分析 |
35 |
40 |
|
·生成设计文档 |
26 |
30 |
|
·设计复审(和同学审核设计文档) |
20 |
20 |
|
·代码规范(为目前的开发制定合适的规范) |
28 |
30 |
|
·具体设计 |
功能一 |
8 |
10 |
功能二 |
8 |
10 |
|
功能三 |
6 |
10 |
|
·具体编码 |
功能一 |
58 |
40 |
功能二 |
70 |
50 |
|
功能三 |
60 |
60 |
|
·代码复审 |
15 |
20 |
|
·测试(自测、修改代码、提交修改) |
30 |
40 |
|
报告 |
25 |
20 |
|
·测试报告 |
8 |
5 |
|
·事后总结 |
17 |
15 |
分析原因:主要的差距在于具体编码技术、写代码的工程习惯和工程思想。
其一、这次写PSP阶段分析是我的第一次尝试,这次让我认识了在项目中,写代码只是众多核心部分之一,文档分析,测试数据都是不可或缺的一部分。
其二、在单元测试方面自己还没有养成良好的习惯,没有做到书中的全路径覆盖等等,这也让我意识到做好一个软件是一个庞大的项目。
改进方法:自己还需多多锻炼代码能力,养成写代码的工程思想。
这一段代码是我从网上找到的,虽然不是我自己写的,但我觉得这一段非常值得我学习,这里面有很多我觉得很重要的知识点都是我之前没掌握的
这一段的功能是:已知一个文件路径,读入该路径下的所有文件
void get_all_file(string path , vector<string>& files , string format)//DFS找到该文件下所有文件名并放入VECTOR中 { 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 )//若文件名不是当前文件夹或父文件夹 get_all_file( p.assign(path).append("\\").append(fileinfo.name), files , format );//继续迭代搜索所有文件夹名 } else files.push_back( p.assign( fileinfo.name ) ); }while( _findnext( hFile , &fileinfo ) == 0 );//找下一个符合条件的文件夹 _findclose(hFile); } }
这一段代码是计算单词频率的算法部分,是我认为最精华的一部分,我通过两个map容器,一个结构体,完成了对文件名和文件路径两种不同输入方式的排序。
若单词数目为n,本算法的时间复杂度为O(nlogn)。在时间上这么优化主要多亏了map容器,让我在插入一对pair的时候把时间复杂度缩减到log级别,并且因为最后的sort也是
O(nlogn)级别的,所以整体的时间复杂度为O(nlogn)
void solve( string input_str , string s , bool have_Path , bool have_File )//计算单词频数 { map<string , ll> mp,id; string str = "" , tmp = ""; read_txt( s , str ); int file_num , cnt = 1; bool limit = Get_num( input_str , file_num ); for( auto ch : str ){ if( ch >= ‘0‘ && ch <= ‘9‘ || ch >= ‘a‘ && ch <= ‘z‘ ){ tmp += ch; continue; } if( !tmp.empty() ){ if( tmp[0] >= ‘a‘ && tmp[0] <= ‘z‘ ){ mp[tmp]++;//mp存当前字符串出现的频数 if( !id.count(tmp) ) id[tmp] = cnt++;//id存当前字符串出现的顺序 } tmp = ""; } } if( !tmp.empty() ){ if( tmp[0] >= ‘a‘ && tmp[0] <= ‘z‘ ) mp[tmp]++; tmp = ""; } if( !limit ){ cout<<"total "<<mp.size()<<endl; puts(""); vector<node> v; if( have_File ){//若给出的是文件名,则按出现顺序排序 for( auto it : mp ) v.push_back( node{ it.first , it.second , id[it.first] } ); sort( v.begin() , v.end() ); for( auto it : v ){ cout<<left<<setw(30)<<it.word<<it.num<<endl; } } else{//若给出的是文件路径,则按字典序排序 for( auto it : mp ){ cout<<left<<setw(30)<<it.first<<it.second<<endl; } } } else{//否则按出现频数从大到小排序 cout<<"Total words is "<<mp.size()<<endl; puts("------------------"); vector<psl> vec( mp.begin() , mp.end() ); sort( vec.begin() , vec.end() , cmp() ); for( auto it : vec ){ cout<<left<<setw(30)<<it.first<<it.second<<endl; file_num--; if( !file_num ) break; } } }
这个代码其实是有BUG的,只不过我没解决:
第一:当文件路径中含有空格时,我读到一半就会跳出,因为我是利用空格作为文件名的分隔符,因此这里会有漏洞。
第二:当输入不规范时,我程序会报错,因为我是默认-f的-后第三个字符,为有效字符串的起始点,此时若多加几个空格我的读入就会出错,程序也会因此报错。
原文:https://www.cnblogs.com/pipifan/p/9683059.html