分析一个文本文件(英文文章)中各个词出现的频率,并且把频率最高的10个词打印出来
分析一个文本文件(英文文章)中各个词出现的频率,并且把频率最高的10个词打印出来
在刚刚拿到题目的时候首先想到的要点有:
1.从文件读取数据
2.统计出来单词个数,并保存
3.排序,输出
我要用的编程语言是c,对文件的读取我看了一下书,明确了一些语法,使用格式并看了一些网上其他人对本题的实现。
对从文件中得到的数据开始是想用个2维数组表示,文件指针得到一个存到数组里,读取时分三种情况,字母,空格,
其他类型,字母读入,遇到空格算一个,其他类型无操作。
但是接下来,在排序时感到有些麻烦,先要统计次再排序,因此用到了链表,设置单词结构体,有单词名,出现次数,
在单词存储时判断是否出现过,出现过则num加1,接下来只要排序输出就好了。
完整代码如下:
#include<stdio.h>
#include<string.h>
#include<fstream.h>
#include<stdlib.h>
#include<ctype.h>
struct word{
    char name[30];
    int num;
    struct word *next;
};//每个单词最大30个字母,存放单词的链表
void readfile(struct word*&head)
{
    FILE *fp;
    if((fp=fopen("ab.txt","r"))==NULL)//只读方式打开文件
    { 
        printf("无法打开此文件!\n");
        exit(0);
    }
    char ch,temp[30];
    struct word *p;
    while(!feof(fp))                  //读取单词直到文件结束
    {
        int i=0;
        ch=fgetc(fp);                 //
        temp[0]=' '; 
        while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||temp[0]==' ')
        {
            if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')
            {
                temp[i]=ch;
                i++;
            }
            ch=fgetc(fp);
            if(feof(fp)) break;
        }
        temp[i]='\0';//下面判断是否为同一个单词
        p=head->next;
        while(p)
        {
            if(!_stricmp(temp,p->name)) 
            { 
                p->num++;break;
            } 
            p=p->next;
        }
        if(!p&&temp[0]!='\0')//新单词的进入链表,初始化
        {
                p=new word;
                strcpy(p->name,temp);
                p->num=1;
                p->next=head->next;
                head->next=p;
        }
    }
}
void sort(struct word*&head)   //已有单词出现次数,进行排序
{    
    struct word *q;            //单词指针
    int a[10],i;               //存储十个单词的出现次数初值为0
    for(i=0;i<10;i++)
        a[i]=0;                  
    printf("出现频率最高的十个单词如下:\n");
    for(i=0;i<10;i++)          
    { 
        q=head;
        while(q!=NULL)
        { 
            if(q->num>a[i])
                a[i]=q->num;
            else
                q=q->next;
        } 
        q=head;
        while(q!=NULL)
        { 
            if(a[i]==q->num)
            { 
                q->num=0;
                printf("出现频率:%d\t单词:",a[i]);
                puts(q->name);
                break;
            } 
            else 
                q=q->next;
        }
    }
}
void main()
{
    struct word *pdj;
    pdj=new word;
    pdj->next=NULL;
    readfile(pdj);
    sort(pdj);
}
在编程时总会遇到一些自己认为困难的地方,也许我们的解决方案不够好,但是一个个问题的解决就是我们的成长
                    
                
                
            
        
浙公网安备 33010602011771号