筛选英语文章出现频率最多的前几个单词

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

设计思路:

     对于本程序,我觉得应该先建立一个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;
}

 

原文地址:https://www.cnblogs.com/maguobin/p/3571659.html