zoukankan      html  css  js  c++  java
  • 统计英文文章中各单词的频率,打印频率最高的十个单词(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号完成程序

    四、程序运行截图

  • 相关阅读:
    c#中out与ref的用法与区别
    一次不该出现的bug
    js弹出蒙版
    foreach中不能修改元素的值
    C#中使用正则表达式来过滤html字符
    细微之处才能显示水平
    js画直线 拓荒者
    XSLT模板转换XML文档 拓荒者
    怪异的JavaScript Date对象 拓荒者
    [转]C++ 笔记点滴 拓荒者
  • 原文地址:https://www.cnblogs.com/lan-meng/p/3576838.html
Copyright © 2011-2022 走看看