补充个人项目(词频统计的功能)
词频统计:
项目需求:
1.小文件输入. 为表明程序能跑
2.支持命令行输入英文作品的文件名
3. 支持命令行输入存储有英文作品文件的目录名,批量统计
4. 从控制台读入英文单篇作品,重定向输出
之前已经完成小文件输入的功能,接下来就是补充2、3、4的功能。
定义结构体:
//结构体定义:单词和对应频率 typedef struct tlist { char word[200]; int time; }
读单词函数:
void readWord(Word *p,int len) { int i; for(i=0;i<27;i++) { if(p->next[i]!=NULL) { if (i==26) { str[len+1]='\0';str[len]='\''; len++; } else { str[len]='a'+i; len++; } readWord((Word*)p->next[i],len); len--; } } if(p->num!=0) { str[len]='\0' strcpy(list[size].word,str); //如果遇到单词结束标志,将str存入list[size].word list[size].time=p->num; size++; } }
在指定目录下遍历所有txt文件:
BOOL FindFile(char *pFileName, char * FindFileType) { WIN32_FIND_DATA fd; HANDLE hFind; char Type[10]={0}; sprintf(Type,".%s",FindFileType); //HANDLE hFindType;//查找对应文件类型 char FileName[260]={0}; sprintf(FileName,"%s\\*.*",pFileName); ZeroMemory(&fd,sizeof(fd)); if(0 == strlen(FileName)) { MessageBox(0,"文件名不能为空",0,0); return FALSE; } else { hFind = FindFirstFile(FileName,&fd); if(INVALID_HANDLE_VALUE==hFind) { return FALSE; } else { do { //查找文件名字中有没与 .文件后缀 注意要加点 因为点在文件名字是特殊符号 //一般是不可以用的。但可以用特殊方法来添加。 //U 盘免疫就是用这中方法来 来建立一个不能用普通方法删除autorun.inf的文件夹 if(strstr(fd.cFileName,Type)) { Test(&fd); } else { //当该文档是文件时候进行下列操作 if(fd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) { //除掉 . 表示当前目录 和..上一个目录 这个在dos 中可以看到 if(strcmp(fd.cFileName,".")!=0&&strcmp(fd.cFileName,"..")!=0) { char Temp[256]={0}; sprintf(Temp,"%s\\%s",pFileName,fd.cFileName); FindFile(Temp,FindFileType); } } } //继续查找下一个文件
从txt文档中读入:
while((x=fgetc(fp))!=EOF) //从txt文档中读入 { if ((x>='A'&&x<='Z')||(x>='a'&&x<='z')||(x=='\''&&len!=0)) { tempword[len]=x; len++; } else { tempword[len]='\0'; createWord(tempword); len=0; } } tempword[len]='\0'; createWord(tempword); len=0; fclose(fp);
输出单词及其出现频率:
readWord(root,0); //比较频率大小冒泡排序 struct tlist temp; for(i=0;i<size-1;i++) for(j=i+1;j<size;j++) if(list[i].time>list[j].time||(list[i].time==list[j].time&&strcmp(list[i].word,list[j].word)>0)) { temp.time=list[i].time; list[i].time=list[j].time; list[j].time=temp.time; strcpy(temp.word,list[i].word); strcpy(list[i].word,list[j].word); strcpy(list[j].word,temp.word); } //将单词和对应频率输出到result.txt中 FILE *fpx; fpx=fopen("result.txt","w"); for (i=0;i<size;i++) fprintf(fpx,"%s %d\n",list[i].word,list[i].time); fclose(fpx); return 0; }
注:重定向还不太了解,实验结果还在完善中。
今天psp:
内容 | 开始时间 | 打断时间 | 结束时间 | 净时间 |
查资料 | 17:24 | 0 | 17:51 | 27分 |
写代码 | 20:43 | 15分 | 21:50 | 67分 |
读构建之法 | 18:04 | 0 | 18:38 | 34分 |
在网上看练习与讨论 | 18:40 | 0 | 19:17 | 37分 |
本周代码堆积图:
代码和博客会继续更新,实验结果正在调试