首页 > 代码库 > 新 词频统计

新 词频统计

#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;}

  技术分享技术分享技术分享技术分享技术分享技术分享

新 词频统计