zoukankan      html  css  js  c++  java
  • 分析一个文本文件各个词出现的频率,并把频率最高的十个词打印出来。

    我的程序思想:

        先把文件里的东西作为一个大的字符串存放到一个字符数组里,然后再把这个数组里边的一个个单词经过一个临时的数组,存放到一个结构体里,这个结构体的属性有单词记录,单词出现的次数记录,和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标记环节调了很多次才成功,虽然程序很短,但是还是用了两个下午才完成的,中途遇到的问题还请教了很多同学,感觉自得编程能力还是不够,需要进一步加强。

  • 相关阅读:
    Single Number II
    Pascal's Triangle
    Remove Duplicates from Sorted Array
    Populating Next Right Pointers in Each Node
    Minimum Depth of Binary Tree
    Unique Paths
    Sort Colors
    Swap Nodes in Pairs
    Merge Two Sorted Lists
    Climbing Stairs
  • 原文地址:https://www.cnblogs.com/ID-q-han/p/3576841.html
Copyright © 2011-2022 走看看