• 分析一个文本文件各个词出现的频率,并把频率最高的十个词打印出来。


    我的程序思想:

        先把文件里的东西作为一个大的字符串存放到一个字符数组里,然后再把这个数组里边的一个个单词经过一个临时的数组,存放到一个结构体里,这个结构体的属性有单词记录,单词出现的次数记录,和flag。基本上没有用什么函数,大部分都是通过for循环实现的。

        源程序代码如下:

    #include "stdafx.h"
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<ctype.h>
    #define num 1000
    int i=0;
    void qingling(char a[])//临时字符数组清零
    {
        for(i=0;i<20;i++)
        a[i]=NULL;
    }
    void main()

    {
       struct Word

       {
         char word_str[20];
         int mount;
          int flag;
        }

    word[num];
    int j=0,k=0,m=0,n=0,temp;
    char temp1[20];
    char a[10000],b[20];
    int t[100];
    FILE *fp;
    char ch;

    for(i=0;i<num;i++)

      {
       word[i].mount=0;
      }

    if((fp=fopen("C:\a.txt","r"))==NULL)

      {
        printf("无法打开此文件 ");
        exit(0);
      }
    i=0;
    while(ch!=EOF)

      {
       ch=fgetc(fp);a[i++]=ch;j++;//把文件的内容存入到一个字符数组
      }

    for(n=0;n<j;n++)
      {
       if(isalpha(a[n])==0)
       {
         if(b!=NULL)
         {
           b[k]='';
           strcpy(word[m].word_str,b);
           m++;
           qingling(b);
           k=0;

          }
       }
       else

       {
        b[k]=a[n];
        k++;
       }
    }
    for(n=0;n<m-1;n++)//计算每个单词出现的次数,flag=1,表示它在出现不记录次数
       {
         for(j=n+1;j<m;j++)
         {
           if(strcmp(word[n].word_str,word[j].word_str)==0 )
            {
              if( word[n].flag!=1)
               {

                 word[n].mount++; word[j].flag=1;

               }
           else

           word[n].mount=0;
           }
         }
    }
    for(n=0;n<m;n++)
       {
         if(word[n].flag!=1)
          word[n].mount++;
        }

    for(j=0;j<m-1;j++)//每个单词按照出现次数的大小排序,冒泡法
       {
          for(n=0;n<m-j-1;n++)
          {
            if(word[n].mount>=word[n+1].mount)
            {
              temp=word[n].mount;
              word[n].mount=word[n+1].mount;
              word[n+1].mount=temp;
              strcpy(temp1,word[n].word_str);
              strcpy(word[n].word_str,word[n+1].word_str);
              strcpy(word[n+1].word_str,temp1);
              temp=word[n].flag;
              word[n].flag=word[n+1].flag;
              word[n+1].flag=temp;

             }

          }

    }
    printf("频率最高的十个单词依次为: ");//最后的结果输出
    for(n=m-2;n>m-12;n--)
        {
         printf("单词 %s 出现次数 %d ",word[n].word_str,word[n].mount);
        }

       fclose(fp);

    }

    运行结果如下:

    没能截图!

    心得体会:在把文件内容存放到数组时,我用fgets函数无法实现,不知道为什么,后来改用的fgetc。在flag标记环节调了很多次才成功,虽然程序很短,但是还是用了两个下午才完成的,中途遇到的问题还请教了很多同学,感觉自得编程能力还是不够,需要进一步加强。

  • 相关阅读:
    Eclipse怎么汉化
    eclipse的 project explore找不到了, 怎么把复制来的包放在project explore
    三 地图的绘制
    二 CheatEngine怎么提取地图数据
    一. 透明坦克跑起来
    第七章 继承与派生
    Quoit Design HDU
    C++学习_从C到C++
    C++学习_一道程序填空题重拾C++
    网络爬虫_BeautifulSoup库入门
  • 原文地址:https://www.cnblogs.com/ID-q-han/p/3576841.html
Copyright © 2020-2023  润新知