字母频率最高的解码c语言代码,分析一个文本文件中各个词出现的频率,并且把频率最高的10个词打印出来...

源代码:

#include

#include

#include

struct word                  //结构体存放单词及其个数

{

int num;         //存放单词个数

char w[20];       //存放单词的数组

};

char c[20];

struct word words[500];             //记录这篇文章出现的单词数目

FILE * in;                             //文件的指针

void read()                  //程序的主体

{

char ch;

int k,flag=0,n=0,m=0,j=0;   //flag记录单词是否相同,i记录读入每个单词的字母,j记录在结构体中出现第几个的单词的

for(m=0;m<500;m++)

words[m].num=0;            //记录每一个单词出现的次数

char infile[50];

printf("输入文件路径:\n");           //打开所要分析的文本文件

scanf("%s",infile);

if((in=fopen(infile,"r"))==NULL)

{

printf("此文件无法打开");

exit(0);

}

while((ch=fgetc(in))!=EOF)

{

for(k=0;k<20;k++)              //读入每一个单词,因为每个单词所包含的字母数目少于20,所以k<20

c[k]='\0';        //初始化数组

int i=0;

while(((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')))           //判断是否是字母

{

if(ch>'A'&&ch

ch=ch+32;         //大写换小写

c[i++]=ch;           //将读入的字母放到存放单词的数组中

ch=fgetc(in);       //ch为读入的每一个字母

}

if(c[0]=='\0')

continue;

else

{

for(j=0;words[j].num!=0;j++)       //将每一个读入的单词与放到结构体中的单词进行比较,相同单词数目加1

{

if(strcmp(words[j].w,c)==0)

{

words[j].num=words[j].num+1;

flag=1;                       //flag=1,单词相同

break;

}

}

if(flag==0)                               //flag=0,单词不同,将它放到结构体数组中

{

words[j].num=1;

strcpy(words[j].w,c);

}

flag=0;

}

}

fclose(in);                 //关闭文件

}

void sort()         //采用冒泡法排序

{

int i,j,max;

char ch2[20];

for(i=0;i<10;i++)             //因为只需要输出前十个

{

max=words[i].num;

for(j=i+1;words[j].num!=0;j++)

if(words[j].num>max)

{

max=words[j].num;

words[j].num=words[i].num;

words[i].num=max;

strcpy(ch2,words[j].w);

strcpy(words[j].w,words[i].w);

strcpy(words[i].w,ch2);

}

printf("%d\t",words[i].num);

printf("%s\n",words[i].w);  }

}

int main()

{

read();

sort();

return 0;

}

程序性能分析:

c842ea1a1d08d6453e8fddecf7dbb3bf.png

31e8b7f9be2e8d43afd0156c0e39ba5e.png

62428c3d11ada2515346ded0b9847ccf.png

程序执行结果:

3a6ec6b7b82b10d212255f47de8d820a.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值