码迷,mamicode.com
首页 > 其他好文 > 详细

新 词频统计

时间:2016-09-14 21:50:10      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:

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

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

新 词频统计

标签:

原文地址:http://www.cnblogs.com/liqiao085/p/5873584.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!