zoukankan      html  css  js  c++  java
  • 读取一个文本文档,统计单词数最多的十个,并输出对应的次数。

    在看到这个题目后,首先确定编写语言,用C语言编写。因为C语言中有很多关于字符串操作的函数可以利用。因为单词和次数是一一对应的,我采用了结构体。将其设为结构体的属性,再设置一个结构体指针。打开文件后,读入字符串,如果这个字符串没出现过,就新建一个结构体指针,对应的次数置1,如果出现过,则对应的次数+1.这样单词就存储在了链表中。排序是比较困难的,因为排序的过程中还要时刻和对应的单词保持相对应,我采用的先比较出最大的,标记其对应的单词,然后以此类推,在每次比较出最大的之后将其对应的次数属性置0,这样不会对下一次的比较产生影响。最后只要对应着输出就好了。以下是比较关键的代码以及源代码:

    while(!feof(fp))//读取文件中的单词,并统计每个单词的数量
            {
                 char *p=(char*)malloc(20*sizeof(char));
                 fscanf(fp,"%s",p);
                  if(Head==NULL)                       //单词没出现过,则把对应的单词数置1
                  {
                       struct word *temp=(struct word*)malloc(sizeof(struct word));
                       strcpy(temp->w,p);
                       temp->k=1;
                       temp->next=NULL;
                       Head=temp;
                  } 
                  else 
                  {
                       struct word *pp=Head;
                       while(pp!=NULL) 
                       {
                           if(strcmp(pp->w,p)==0)    //单词已出现过,则对应的单词数+1
                           {
                                int count = pp->k;
                                count++;
                                pp->k = count;
                                break;
                           }
                           pp=pp->next;
                       }
                       
                         if(pp==NULL)      
                           {
                            struct word *temp = (struct word*)malloc(sizeof(struct word));
                            strcpy(temp->w, p);
                            temp->k=1;
                            temp->next=Head;
                            Head=temp;
                           }
                  }
            }
    以上是统计文本文档中每个单词的数量,并存储在链表中。
    for(i=0;i<10;i++)
            {
                q=Head;
                while(q!=NULL)   //每次都选出剩下的次数中最大的
                {
                if(q->k>a[i])    
                a[i]=q->k;
                else 
                   q=q->next;
                }
               q=Head;
                while(q!=NULL)
                { 
                    if(a[i]==q->k) //每次选出最大的之后,将对应的次数置0,为了不影响下次的比较
                    {
                    q->k=0;
                    printf("次数:%d\t",a[i]);
                    puts(q->w);
                    break;
                    }
                    else q=q->next;
                }
            }
    以上是对每个单词的次数进行排序,选出出现次数最高的十个单词,并输出对应的次数。

    源代码:

    #include<stdio.h>
    #include<stdlib.h>
    #include<ctype.h>
    #include<string.h>
    struct word
    {
        char w[20];
        int k;
        struct word *next;
    };
    int main()
    {
        FILE *fp;
        int i;
        int a[10];
        struct word *Head=NULL;
        struct word *q;
        for(i=0;i<10;i++)
            a[i]=0;
        if((fp=fopen("wangdan.txt","r"))==NULL)
        {
            printf("无法打开此文件\n");
            exit(0);
        }
        while(!feof(fp))
            {
                 char *p=(char*)malloc(20*sizeof(char));
                 fscanf(fp,"%s",p);
                  if(Head==NULL)
                  {
                       struct word *temp=(struct word*)malloc(sizeof(struct word));
                       strcpy(temp->w,p);
                       temp->k=1;
                       temp->next=NULL;
                       Head=temp;
                  } 
                  else 
                  {
                       struct word *pp=Head;
                       while(pp!=NULL) 
                       {
                           if(strcmp(pp->w,p)==0)
                           {
                                int count = pp->k;
                                count++;
                                pp->k = count;
                                break;
                           }
                           pp=pp->next;
                       }
                       
                         if(pp==NULL)
                           {
                            struct word *temp = (struct word*)malloc(sizeof(struct word));
                            strcpy(temp->w, p);
                            temp->k=1;
                            temp->next=Head;
                            Head=temp;
                           }
                  }
            }
            for(i=0;i<10;i++)
            {
                q=Head;
                while(q!=NULL)
                {
                if(q->k>a[i])    
                a[i]=q->k;
                else 
                   q=q->next;
                }
               q=Head;
                while(q!=NULL)
                { 
                    if(a[i]==q->k)
                    {
                    q->k=0;
                    printf("次数:%d\t",a[i]);
                    puts(q->w);
                    break;
                    }
                    else q=q->next;
                }
            }
    
          return 0;        
    }

    以上就是解题的经过,总的来说程序的思路还是比较清晰,易懂,在排序的时候代码比较多,方法不够好,影响了程序运行速度,还有待改进。通过本次做题呢,感觉自己进步很大,开始的时候结构体和指针都没有学好,而这次通过复习,加深了我的理解,又多了一种编程的思路。同时对C语言的运用也有了进步,平时动手编程的时候太少,作为一个工科学生,就应该多练习,多实践,去体会编程的乐趣。

  • 相关阅读:
    XML相关知识点
    MLPlatform开发日志
    1.0 es6 箭头函数
    基本数学概念
    4.4 thymeleaf使用补充
    vim操作手册
    eclise创建后台项目
    正则表达式
    数据库隔离级别
    1. gradle的使用教程
  • 原文地址:https://www.cnblogs.com/wangdan/p/3569923.html
Copyright © 2011-2022 走看看