您的位置:首页 > 其它

补交作业 新 词频统计

2016-09-14 21:31 295 查看
HTTP:https:
https://git.coding.net/liqiao085/wf--week2.git ssh://git@git.coding.net:liqiao085/wf--week2.git
部分代码:
功能1:

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 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 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();//打印单词以及个数
}
功能4:

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();//打印单词以及个数
}

功能3:

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 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("____________________");
}
}
功能2:

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 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];

读取目录函数:

void readdir(char *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;
}
}

打印前len个单词:

void pri(int 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 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();//打印单词以及个数
}

全部代码:

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


  










内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: