读取一个文本文档,统计单词数最多的十个,并输出对应的次数。

在看到这个题目后,首先确定编写语言,用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语言的运用也有了进步,平时动手编程的时候太少,作为一个工科学生,就应该多练习,多实践,去体会编程的乐趣。

posted on 2014-02-26 19:05  奋斗的小程序员  阅读(1932)  评论(0编辑  收藏  举报