zoukankan      html  css  js  c++  java
  • 筛选英语文章出现频率最多的前几个单词

    程序题目:筛选出文章中出现频率最高的前几个单词

    设计思路:

         对于本程序,我觉得应该先建立一个txt文档,将要筛选的文章放入文档中,然后在程序中读文件,这样比起临时输入更加快捷方便。然后该程序应分为三个部分,一部分是对文章每个单词进行录入,即将所有单词都放到一个长数组中。第二部分是将这些单词不重复的存入另一个数组中。第三部分是用第一个数组和第二个数组进行比较,第一个数组中每有一个与第二个数组中的单词相匹配,就给第二个数组中的数据加一,最后找出按大小找出单词出现频率最高的几个单词。这就是程序的整体思路。

        我这个程序比较灵活,能够自己选择要选的单词数量,而不是固定的数量,可以在程序打开之后人工输入要选择的数量。

    程序用时:

           2月21日晚上8点到8点20进行整体构思,8点20到10点实现了第一部分既将全部单词复制到first数组中。

           2月22日下午2点到5点实现了第二部分,即将first中的单词不重复的复制到second数组中。

           2月23日晚上7点到8点实现了第三部分,即将second中出现频率最高的前几个单词找出并输出。

           2月25日晚上7点到8点对程序做了一些修改,删除了一些冗余代码,修善了一下界面。


    程序代码分析:

    int main()
    {   printf("打开'源文件.txt'
    ");
        char first[10000][10]={''};
        print(first);
        return 0;
    }

    main 主函数,首先提示打开文件,建立一个存放所有单词的数组first,由于文章比较长,所以建立了个一10000个单元的数组。

    然后通过print函数,进入单词录入。

    
    

    void print(char first[1000][10])
    {
    FILE * fp;
    char ch;
    int i=0,j=0,flag=0;
    if((fp=fopen("英语文章.txt","r"))==NULL )
    {
    printf("找不到该文件");
    }
    while((ch=fgetc(fp))!=EOF)
    {
    printf("%c",ch);
    }
    printf(" ");
    if((fp=fopen("英语文章.txt","r"))==NULL )
    {
    printf("找不到该文件");
    }
    while((ch=fgetc(fp))!=EOF)
    {
    if((ch>=65&&ch<=90||ch>=97&&ch<=122||ch==92))
    {
    if(flag==1)
    i++;
    first[i][j]=ch;
    j++;
    flag=0;
    }
    else
    {
    j=0;
    flag=1;
    }
    }
    copy(first,i);
    }

     

    这是print函数,首先打开文件,先通过一个while循环,将文章中的所有单词输出一遍。

    然后再次打开文件,开始执行单词录入。通过while,比较每一个位置的字母。先设置一个标志位flag,如果是flag=0,则面临的是单词,如果标志位是1,则面临的是空格或标点。[首先比较该位置与a,z,A,Z的大小,看该位置是否为字母,如果是字母,就将该字母放入first[i][j]中,然后执行j++.然后假设下一位面临的是字母,将flag置0,因为如果不置0,就不会进入将字母放入first中的过程。然后继续执行,如果是字母,因为之前已经将flag置0,所以将会跳过if(flag==1)  i++,而继续将单词放入first中。如果不是字母,将直接进入

    else
    {
    j=0;
    flag=1;
    },

    这样就给flag置1,说明该位置不是单词,然后继续执行,如果面临字母,由于flag=1,所以执行

    if(flag==1)
    i++;

    通过i++,就实现了上衣个单词的结束,开始执行记录下一个单词,i就是单词的个数,而j是每个单词的字母个数。

    通过这几句代码,就实现了将所有单词录入的功能。

    然后执行copy函数,实现将first中的单词不重复的录入到second数组中。

    void copy(char first[1000][10],int i)
    {
        int m=0,n=0,word=0,k=1;
        char second[1000][10]={''};
     
        strcpy(second[0],first[0]); 
        for (m=1;m<=i;m++)  
        {  
            for(n=0;n<m;n++)  
            {
                if(strcmp(first[m],first[n])==0)  
                {
                    word=1;
                }
    
            } 
            if(word==0)
            {
                strcpy(second[k],first[m]);
                k++;
            }
            word=0;
        }
        bijiao(first,second,k,m,n,i);
    }

    首先创建一个second[1000][10]的数组用来存放不重复的单词,然后将first中的第一个单词复制到second中,为了之后的比较。然后进行比较,如果first第m单词与之前的前m-1个单词都不重复,说明这个单词没有出现过,如果相同,就说明之前已经出现过,不需要再复制它,那么就将标志位word置1,比较完m之前的但此后,如果word仍然为0,就说明之前没有重复的单词出现,那么这个单词就是第一次出现,所以将他复制到second中,如果word=1,则说明这个单词已经出现了,就不需要复制。然后m+1,继续比较,如果之前出现了,就不再执行复制,这样就实现了将first中的单词不重复的复制到second中。

    然后通过bijiao函数,选出单词出现频率最高的几个单词。

    void bijiao(char first[1000][10],char second[1000][10],int k,int m,int n,int i)
    {
          int t;
        printf("请输入您想选择单词数最多的前几个:");
        scanf("%d",&t);
        int max;
        int count[10000]={0};
        for(m=0;m<k;m++)
        {
            for(n=0;n<=i;n++)
            {
                if(strcmp(second[m],first[n])==0)
                    count[m]=count[m]+1;
            }
        }
    
        for(m=0;m<=k&&m<t;m++) 
        {
            max=0;
            for(n=1;n<=k;n++)
            {
               
                if(count[max]<count[n])
                    max=n;
                    
            }
            printf("%s %d
    ",second[max],count[max]);
            count[max]=0;
        }
    
    }

     首先手动输入你想选择的单词个数,通过scanf将单词个数保存在变量t中,创建一个存储单词出现个数的数组count[1000],然后通过两层循环分别对每一个second与所有的first中的单词比较,每有一个相同的单词,就给second对应的count+1,这样就能统计出每一个second中的单词出现的个数。然后就是比较简单的找最大值问题,先假设第一个是最大值,然后进行比较,如果下一个比他大,则将下一个设为max,这是通过两层for循环完成的,每完成一次内层for循环,就将最大值的单词和个数输出,同时将该最大值置0,然后从下一个单词继续比较,这样就能找出单词出现频率最高的几个单词了。

    以上就是对代码的分析,然后给出完整代码和程序截图:

    #include "stdafx.h"
    #include <stdio.h>
    #include <string.h>
    void bijiao(char first[1000][10],char second[1000][10],int k,int m,int n,int i)
    {
          int t;
        printf("请输入您想选择单词数最多的前几个:");
        scanf("%d",&t);
        int max;
        int count[10000]={0};
        for(m=0;m<k;m++)
        {
            for(n=0;n<=i;n++)
            {
                if(strcmp(second[m],first[n])==0)
                    count[m]=count[m]+1;
            }
        }
    
        for(m=0;m<=k&&m<t;m++) 
        {
            max=0;
            for(n=1;n<=k;n++)
            {
               
                if(count[max]<count[n])
                    max=n;
                    
            }
            printf("%s %d
    ",second[max],count[max]);
            count[max]=0;
        }
    
    }
    void copy(char first[1000][10],int i)
    {
        int m=0,n=0,word=0,k=1;
        char second[1000][10]={''};
     
        strcpy(second[0],first[0]); 
        for (m=1;m<=i;m++)  
        {  
            for(n=0;n<m;n++)  
            {
                if(strcmp(first[m],first[n])==0)  
                {
                    word=1;
                }
    
            } 
            if(word==0)
            {
                strcpy(second[k],first[m]);
                k++;
            }
            word=0;
        }
        bijiao(first,second,k,m,n,i);
    }
    
    void print(char first[1000][10])
    {
        FILE * fp;
        char ch;
        int i=0,j=0,flag=0; 
        if((fp=fopen("英语文章.txt","r"))==NULL )    
        {
            printf("找不到该文件");
        } 
        while((ch=fgetc(fp))!=EOF) 
        {
                printf("%c",ch);
        }
        printf("
    ");
        if((fp=fopen("英语文章.txt","r"))==NULL )    
        {
            printf("找不到该文件");
        } 
        while((ch=fgetc(fp))!=EOF)  
        {
            if((ch>=65&&ch<=90||ch>=97&&ch<=122||ch==92)) 
            { 
                if(flag==1) 
                    i++;
                first[i][j]=ch;
                j++;
                flag=0; 
            }
            else
            {
            j=0;
            flag=1; 
            }
        }
        copy(first,i);
    }
    
    int main()
    {   printf("打开'源文件.txt'
    ");
        char first[10000][10]={''};
        print(first);
        return 0;
    }

     

  • 相关阅读:
    JQUERY 判断选择器选择的对象 是否存在
    js的reduce方法,改变头等函数
    盒模型 bug 与触发 bfc
    CSS(四)float 定位
    CSS(三)背景 list-style display visibility opacity vertical cursor
    css 负边距
    CSS(二) 颜色 盒模型 文字相关 border
    CSS(一) 引入方式 选择器 权重
    html总结
    主流浏览器及内核
  • 原文地址:https://www.cnblogs.com/maguobin/p/3571659.html
Copyright © 2011-2022 走看看