软件工程第二周作业--词频统计
代码链接:https://git.coding.net/Rainbows/wc.git
发表博客,介绍上述“项目”中每个功能的重点/难点,展示重要代码片断,展示你感觉得意、突破、困难的地方。
1、基本操作:如何重定向
if(argc==3) { string arg=argv[2]; file_get_map(arg); }//从命令行参数读取文件名 void file_get_map(string Arg) { string filename; filename=Arg; // cin.get(); ifstream fin(filename.c_str()); //重定向 string temp; map<string,int> wmap; while(fin>>temp) { int len=temp.size(); char tmp[20]=""; int j=0; for(int i=0; i<len; i++) { if (isalpha(temp[i])) { tmp[j]=temp[i]; j++; } } string tmp2(tmp); wmap[tmp2]++; } display_map(wmap); fin.close(); cin.get(); }
2、如何判断单词(其实有错的),我是判断的连续的字母,没有考虑到连词符。连词符应该加上,每一个位置都判断是否连词符。(新的问题,hello和he-llo是否应该算同一个单词呢?)
while(fin>>temp) { int len=temp.size(); char tmp[20]=""; int j=0; for(int i=0; i<len; i++) { if (isalpha(temp[i]))//是字母 { tmp[j]=temp[i];//tmp保存它,不是字母就不保存了 j++; } } string tmp2(tmp);//转string wmap[tmp2]++;//插入map }
3、如何处理目录
void one_backslash_become_two_backslash(char* Path) { int len=strlen(Path); char Path2[100]; for(int i=0,j=0; i<len; i++) { if(Path[i]=='\\') { Path2[j++]='\\'; Path2[j++]='\\'; } else Path2[j++]=Path[i]; } strcpy(Path2,Path); } char a[200]="",b[20]="*.txt",c[20]="\\",d[20]="-s"; if(strcmp(d,argv[1])==0) { console_get_name();//控制台读 return 0; } char buf[80]; getcwd(buf,sizeof(buf)); strcat(a,buf); strcat(a,c); strcat(a,argv[1]); strcat(a,c); strcat(a,b);//构造地址 //printf("%s\n",argv[0]); one_backslash_become_two_backslash(a);//双斜杠 // strcat(a,b); //printf("%s\n",a); long Handle; struct _finddata_t FileInfo; if((Handle=_findfirst(a,&FileInfo))==-1L)//不是一个目录 { char aa[200]; strcpy(aa,argv[1]); file_txt_get_map(aa); } else//是一个目录,遍历它,从里边取txt { file_info_get_map(FileInfo.name); while(_findnext(Handle,&FileInfo)==0) file_info_get_map(FileInfo.name); _findclose(Handle); } void file_info_get_map(char* fileinfo) { string filename=fileinfo; // cin >> filename; // cin.get(); ifstream fin(filename.c_str()); // read in str[] string temp; map<string,int> wmap; while(fin>>temp) { int len=temp.size(); char tmp[20]=""; int j=0; for(int i=0; i<len; i++) { if (isalpha(temp[i])) { tmp[j]=temp[i]; j++; } } string tmp2(tmp); wmap[tmp2]++; } display_map(wmap); fin.close(); // cin.get(); }
难点大致就是这些。
任务 | 预计时间 | 实际时间 | 难点 |
重定向原型 | 10min | 15min | 在网上找的,没难点,差距并不大。 |
单词分割原型 | 10min | 75min | 在网上找那个处理一些数据是错的,尝试了处理标点,最后尝试了只处理字母(似乎是错的),高估了自己的第一判断的准确性。 |
输出模块原型 | 5min | 5min | 遍历map,用迭代器,没啥难点,而且在网上找的重定向原型自带输出模块,改一点就可以用。 |
命令行参数处理原型 | 15min | 15min | 在网上找的,没难点。 |
功能整合,做出成品 | 20min | 180min | 从程序入口进来,如何进入不同的子程序的条件判断算了一会,然后乱七八糟的小bug解决了之后都忘了它们是怎么发生的。还有一些是写子程序的时候懒得实现的细节在最后实现了。 |
实际写代码的时间并不是很多,而且很顺利,但是在路上和吃饭的时间也思考了,不知道怎么算进去。前后花了两天的时间吧。预计时间和实际时间是我根据印象编的,当时没记。
代码及版本控制:感谢郑蕊师姐!好人一生平安!其实老师也在提示中说了“建议使用tortoisegit”,我搜的全是命令行的教程,用这个客户端老快了。