#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 100000
struct //单词结构体
{
int num;//单词频数
char ch[20];//每一个单词
}
word[MAX];
void read(char *essay,int *total,char *ch)//获取文章信息
{
int i;
FILE*fp;
{char filename[20];
printf("请输入文件名:例如//123.txt");
scanf("%s",filename);
fp=fopen(filename,"r");
if(!fp)
{
printf("\n打开文件失败!");
exit(0);
}
}
//获取文章及总字符数
(*ch)=fgetc(fp);//判断文章文件是否为空。
if(*ch!=EOF)
{
essay[0]=(*ch);
for(i=1;!feof(fp);i++)
essay[i]=fgetc(fp);
essay[i]='\0';
(*total)=strlen(essay);
}
fclose(fp);
}
void show_e(char *essay,int *total,char *ch)//显示文章
{
printf("%s",essay);
printf("\n");
}
void sort(int *total)//按照字典排序
{
int n,j,t;
char tempt[MAX];
for(n=0;n<(*total)-1;n++)
for(j=0;j<(*total)-n-1;j++)
{
if(strcmp(word[j].ch,word[j+1].ch)==1)
{
strcpy(tempt,word[j].ch);//交换单词
strcpy(word[j].ch,word[j+1].ch);
strcpy(word[j+1].ch,tempt);
t=word[j].num;//交换单词频数
word[j].num=word[j+1].num;
word[j+1].num=t;
}
}
}
void dep_show(char *essay,char *b)
{
int j,i=0;//i记录有多少不同的单词,n记录相同单词出现的次数
char *tok;
bool judge=false;
int sum=0;
FILE *fp;
for(tok=strtok(essay,b);tok!=NULL;tok=strtok(NULL,b))
{
//利用strtok函数将文章中的单词分离开。
sum++;//单词总数
strcpy(word[i].ch,tok);
(word[i].num)=1;
for(j=0;j<i;j++)
if(strcmp(word[i].ch,word[j].ch)==0)
{
(word[j].num)++;
judge=true;
}
if(judge)
i--;
i++;
judge=false;
}
// i=i-1;
sort(&i);
printf("单词总数为:%d\n",sum);
fp=fopen("count.txt","w");
if(!fp)
{
printf("\n打开文件count.txt失败!");
exit(0);
}
fprintf(fp,"单词总数为:%d\n",sum);将单词总数读到文件中
for(j=0;j<i;j++)
{
fprintf(fp,"%-16s\t%d\t\n",word[j].ch,word[j].num);//将单词、单词频数读到文件中
printf("%-16s\t%d\t\n",word[j].ch,word[j].num);//将单词、单词频数打印到屏幕上
}
fclose(fp);
}
void menu(int *ss)
{
int item,total=0;//total记录文章中的总字符数
char b[]={',','.','?',':','-',' '},essay[2*MAX],ch;
printf("\n");
printf("*************************************************\n");
printf(" 词频统计 \n");
printf(" 1.显示英文文本 \n");
printf(" 2.显示单词总数、全部单词及频数 \n");
printf(" 3.退出 \n");
printf("*************************************************\n");
printf("请选择您需要的操作序号(1-5)按回车确认:");
scanf("%d",&item);
printf("\n");
read(essay,&total,&ch);
switch(item)
{
case 1:show_e(essay,&total,&ch);break;
case 2:dep_show(essay,b);break;
case 3:ss=0;break;
default:printf("请在0-6之间选择\n");break;
}
}
int main()
{
int ss=1;
while(ss)
{
menu(&ss);
}
return 0;
}
#include <string.h>
#include <stdlib.h>
#define MAX 100000
struct //单词结构体
{
int num;//单词频数
char ch[20];//每一个单词
}
word[MAX];
void read(char *essay,int *total,char *ch)//获取文章信息
{
int i;
FILE*fp;
{char filename[20];
printf("请输入文件名:例如//123.txt");
scanf("%s",filename);
fp=fopen(filename,"r");
if(!fp)
{
printf("\n打开文件失败!");
exit(0);
}
}
//获取文章及总字符数
(*ch)=fgetc(fp);//判断文章文件是否为空。
if(*ch!=EOF)
{
essay[0]=(*ch);
for(i=1;!feof(fp);i++)
essay[i]=fgetc(fp);
essay[i]='\0';
(*total)=strlen(essay);
}
fclose(fp);
}
void show_e(char *essay,int *total,char *ch)//显示文章
{
printf("%s",essay);
printf("\n");
}
void sort(int *total)//按照字典排序
{
int n,j,t;
char tempt[MAX];
for(n=0;n<(*total)-1;n++)
for(j=0;j<(*total)-n-1;j++)
{
if(strcmp(word[j].ch,word[j+1].ch)==1)
{
strcpy(tempt,word[j].ch);//交换单词
strcpy(word[j].ch,word[j+1].ch);
strcpy(word[j+1].ch,tempt);
t=word[j].num;//交换单词频数
word[j].num=word[j+1].num;
word[j+1].num=t;
}
}
}
void dep_show(char *essay,char *b)
{
int j,i=0;//i记录有多少不同的单词,n记录相同单词出现的次数
char *tok;
bool judge=false;
int sum=0;
FILE *fp;
for(tok=strtok(essay,b);tok!=NULL;tok=strtok(NULL,b))
{
//利用strtok函数将文章中的单词分离开。
sum++;//单词总数
strcpy(word[i].ch,tok);
(word[i].num)=1;
for(j=0;j<i;j++)
if(strcmp(word[i].ch,word[j].ch)==0)
{
(word[j].num)++;
judge=true;
}
if(judge)
i--;
i++;
judge=false;
}
// i=i-1;
sort(&i);
printf("单词总数为:%d\n",sum);
fp=fopen("count.txt","w");
if(!fp)
{
printf("\n打开文件count.txt失败!");
exit(0);
}
fprintf(fp,"单词总数为:%d\n",sum);将单词总数读到文件中
for(j=0;j<i;j++)
{
fprintf(fp,"%-16s\t%d\t\n",word[j].ch,word[j].num);//将单词、单词频数读到文件中
printf("%-16s\t%d\t\n",word[j].ch,word[j].num);//将单词、单词频数打印到屏幕上
}
fclose(fp);
}
void menu(int *ss)
{
int item,total=0;//total记录文章中的总字符数
char b[]={',','.','?',':','-',' '},essay[2*MAX],ch;
printf("\n");
printf("*************************************************\n");
printf(" 词频统计 \n");
printf(" 1.显示英文文本 \n");
printf(" 2.显示单词总数、全部单词及频数 \n");
printf(" 3.退出 \n");
printf("*************************************************\n");
printf("请选择您需要的操作序号(1-5)按回车确认:");
scanf("%d",&item);
printf("\n");
read(essay,&total,&ch);
switch(item)
{
case 1:show_e(essay,&total,&ch);break;
case 2:dep_show(essay,b);break;
case 3:ss=0;break;
default:printf("请在0-6之间选择\n");break;
}
}
int main()
{
int ss=1;
while(ss)
{
menu(&ss);
}
return 0;
}