统计英文文章中各单词的频率,打印频率最高的十个单词(C语言实现)

 一、程序思路及相关代码

      首先打开文件,代码如下

 FILE *fp;
	  char fname[10];
	  printf("请输入要分析的文件名:
");
      scanf("%s",fname);
      if((fp=fopen(fname,"r"))==NULL){   //读取文件内容,并返回文件指针,该指针指向文件的第一个字符
           fprintf(stderr,"error opening.
");
           exit(1);
      }

  对于文件的扫描,以字符为单位

do{
          ch=fgetc(fp);
		  if(ch==' '||ch==','||ch=='.'||ch==';')     //如果是空格,自动跳到下个字符
                 scanner(fp);
           else{
                 fseek(fp,-1,1);        //如果不是空格,则回退一个字符并扫描
               scanner(fp);
           }
      }while (ch!=EOF);

  要统计单词频率,首先要将文章分为单个单词

int zimu(char ch){	
	if((ch >= 'A' && ch <= 'Z')
		|| (ch >= 'a' && ch <= 'z'))
		return ch;
	else
		return 0;
}
void scanner(FILE *fp)
{     
     char b[20];
	ch=fgetc(fp);
    if(zimu(ch))
	{               //判断该字符是否是字母
		b[0]=ch;
        ch=fgetc(fp);         //调用函数扫描字符
		i=1;
		while(zimu(ch))
		{     
			b[i] = ch;
			i++;
			ch = fgetc(fp);
		}
		fseek(fp,-1,1);
		b[i] = '';
		k++;
		strcpy(w[k].c,b);
	}
}

 对于单词,为单词创建结构体

struct word
{
    char c[20];//单词词组
    int n;//单词个数
}w[10000];

   统计各个单词的个数

for(i=1;i<k+1;i++)
		  w[i].n=1;
	for(i=1;i<k+1;i++)
	{
		for(j=i+1;j<k+1;j++)
		{
		    if(strcmp(w[i].c,w[j].c)==0)
			{
			  w[i].n++;
		          w[j].n=0;
			}
			if(w[i].n==0)//将已统计的单词跳过
				break;
		}
	}

   将单词按个数多少进行排序

for(i=1;i<k+1;i++)
    {
        for(j=1;j<k+1-i;j++)
        {
            if(w[i].n>w[j].n)//交换结构体内数据
            {
                t=w[i].n;
                strcpy(a,w[i].c);
                w[i].n=w[j].n;
                strcpy(w[i].c,w[j].c);
                w[j].n=t;
                strcpy(w[j].c,a);
            }
        }
    }
    printf("英文文章中频率最高10个单词及个数为:
");
    for(i=1;i<11;i++)
        printf("%d:  %s   %d
",i,w[i].c,w[i].n);
    }

二、遇到问题

(1)对于单词的扫描,后来查看编译中的词法分析解决了

(2)对于词组的复制,使用strcpy(w[k].c,b);解决将词组c复制到结构体数组中

(3)对于单词个数统计,

if(w[i].n==0)//将已统计的单词跳过
 break;

将与后面单词相同的跳过,避免出现重复

三、程序过程统计

     二月26号下午,2个小时思考程序思路,并书写大体框架

    二月27号上机时间,将扫描和单词分解完成

    二月27号完成程序

四、程序运行截图

原文地址:https://www.cnblogs.com/lan-meng/p/3576838.html