首页 > 代码库 > 新 词频统计
新 词频统计
#include <stdio.h>#include <string.h>#include <dirent.h> #include <string>#include <vector>#include <iostream>#include <sys/stat.h>#include <unistd.h>using namespace std;#define maxn 5000000void f2(char *p,int flag);//处理文件函数 void f2_dir(char *P);//处理目录函数 struct TREE{ int next[26]; int flag;}tree[maxn];//单词的存储结构,这里使用字典树 struct S{ string str; int flag;}ss[maxn];//存放最后的单词 vector<string> ve;//目录下文件名 char str[maxn];int cnt = -1;//字典树下标 int f = 0;int tot_word = 0;//总单词 int new_tree(){ ++cnt; memset(tree[cnt].next,0,sizeof(tree[cnt].next)); tree[cnt].flag = 0; return cnt;//申请一个字典树节点 }void readdir(char *s)//读取目录函数 { //printf("%s\n",s); DIR *directory_pointer; directory_pointer = opendir(s);//打开一个目录 struct dirent *entry; int i; while((entry = readdir(directory_pointer))!=NULL)//循环目录下文件 { string s1 = s; s1+=‘\\‘; if((*entry).d_name[0]==‘.‘) continue; s1+=(*entry).d_name; ve.push_back(s1); } closedir(directory_pointer);//关闭目录流 }void insert_tree(char str[])//插入单词到字典树 { int len = strlen(str), p =0; for(int i = 0;i<len;i++) { int a = str[i]-‘a‘; if(tree[p].next[a]) p = tree[p].next[a]; else p = tree[p].next[a] = new_tree(); } tree[p].flag++;}int cam(const void *x,const void *y)//对单词排序 { S p = *(S*)x; S q = *(S*)y; if(p.flag==q.flag) return p.str>q.str; else return q.flag-p.flag;}void dfs(int index,int deep)//搜素字典树中的单词以及个数 { if(tree[index].flag) { str[deep] = 0; ss[f].str = str; ss[f].flag = tree[index].flag; f++; tot_word+=tree[index].flag; //printf("%s %d\n",str,tree[index].flag); } for(int i = 0;i<26;i++) { if(tree[index].next[i]) { str[deep] = ‘a‘+i; dfs(tree[index].next[i],deep+1); } }}void pri()//打印单词 { tot_word = 0; dfs(0,0); printf("total %d words\n",tot_word); qsort(ss,f,sizeof(ss[0]),cam); for(int i = 0;i<f;i++) { cout<<ss[i].str; for(int j = 1;j<=25-ss[i].str.length();j++) printf(" "); cout<<ss[i].flag<<endl; }}void pri(int len)//打印前len个单词 { tot_word = 0; dfs(0,0); printf("total %d words\n",tot_word); qsort(ss,f,sizeof(ss[0]),cam);//对单词排序 for(int i = 0;i<min(len,f);i++) { cout<<ss[i].str; for(int j = 1;j<=25-ss[i].str.length();j++) printf(" "); cout<<ss[i].flag<<endl; }}void f1()//完成自己输入文章统计功能 { int sum = 0; gets(str); // printf("%s\n",str); int len = strlen(str);//文章长度 for(int i = 0;i<len;i++) { if(str[i]>=‘A‘&&str[i]<=‘Z‘) str[i]+=32;//大写变小写 } for(int i = 0;i<len;i++) { if(str[i]>=‘a‘&&str[i]<=‘z‘) { sum++; char s[200],flag = 0; for(;i<len;i++) { if(str[i]<‘a‘||str[i]>‘z‘) break; s[flag++] = str[i]; } s[flag] = 0; insert_tree(s);//插入字典树中 } } pri();}void f2_dir(char *p){ readdir(p);//读取目录 for(int i= 0;i<ve.size();i++) { f = 0; cnt = -1; new_tree();//建立一个新的字典树节点 // cout<<ve[i]<<endl; char se[150]; for(int j = 0;j<ve[i].length();j++)//循环目录长度 { se[j] = ve[i][j]; } se[ve[i].length()] = 0; //printf("%s\n",se); f2(se,10); printf("____________________"); }}void f2(char *p,int flag){// printf("%s\n",p); //printf("1111\n"); struct stat st; stat(p,&st); if (S_ISDIR(st.st_mode)) { // printf("1111\n"); f2_dir(p); return; } int sum = 0; freopen(p, "r", stdin);//打开文件 while(scanf("%s",str)!=EOF) { sum++; int len = strlen(str); for(int i = 0;i<len;i++) { if(str[i]>=‘A‘&&str[i]<=‘Z‘) str[i]+=32;//大写转小写 } insert_tree(str);//插入字典树中 } if(flag==0) pri(); else pri(flag);//打印前flag个单词 return;}void gao()//完成了重定向功能 {// printf("1111\n"); char str[50]; while(scanf("%s",str)!=EOF)//循环读取知道文件末尾 { //printf("%s\n",str); int len = strlen(str); for(int i = 0;i<len;i++) { if(str[i]>=‘A‘&&str[i]<=‘Z‘) str[i]+=32; } insert_tree(str);//插入字典树中 } pri();//打印单词以及个数 }int main(int argc, char *argv[]){ new_tree(); if(argc==1) f1();//完成手动输入功能 if(argc==2) { if(argv[1][0]==‘-‘&&argv[1][1]==‘s‘) gao();//重定向功能 else f2(argv[1],0);//读取文件功能 } if(argc==3) f2(argv[2],0);//读取目录 if(argc==4) f2(argv[3],0);//读取小文件 return 0;}
新 词频统计
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。