zoukankan      html  css  js  c++  java
  • 分析一个文本文件(英文文章)中各个词出现的频率,并且把频率最高的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("无法打开此文件! ");
    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]='';//下面判断是否为同一个单词
    p=head->next;
    while(p)
    {
    if(!_stricmp(temp,p->name))
    {
    p->num++;break;
    }
    p=p->next;
    }
    if(!p&&temp[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("出现频率最高的十个单词如下: ");
    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 单词:",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);
    }

    在编程时总会遇到一些自己认为困难的地方,也许我们的解决方案不够好,但是一个个问题的解决就是我们的成长

  • 相关阅读:
    ListView之setEmptyView的问题
    AdapterView的相关知识。
    分享一个程序猿的真实的爱情故事
    C#中的explicit和implicit了解一下吧
    通俗易懂,什么是.NET Core以及.NET Core能做什么
    目前下载VS2017你可能会遇到这个坑
    .NET Core中使用Dapper操作Oracle存储过程最佳实践
    分享一个.NET平台开源免费跨平台的大数据分析框架.NET for Apache Spark
    从ASP.NET Core2.2到3.0你可能会遇到这些问题
    What?VS2019创建新项目居然没有.NET Core3.0的模板?Bug?
  • 原文地址:https://www.cnblogs.com/qzl123/p/3577074.html
Copyright © 2011-2022 走看看