博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
读取一个文本文档,统计单词数最多的十个,并输出对应的次数。
阅读量:6296 次
发布时间:2019-06-22

本文共 4480 字,大约阅读时间需要 14 分钟。

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

转载于:https://www.cnblogs.com/wangdan/p/3569923.html

你可能感兴趣的文章
Map获取键值,Map的几种遍历方法
查看>>
二、JavaWeb总结:Tomcat服务器的学习和使用
查看>>
JBoss关闭时报Failed to authenticate principal=null,...
查看>>
other than ,more than,less than,rather than到底有什么区别
查看>>
JVM调优总结
查看>>
LIB和DLL的区别与使用,非常详细
查看>>
Entity Component System
查看>>
Flask驱动的静态站点生成器(译)
查看>>
Activiti工作流内建数据库表分析
查看>>
MongoDB Modifiers(原子操作)
查看>>
巧用row_number和partition by分组取top数据
查看>>
CentOS6.5下Redis安装与配置
查看>>
PHP的CURL报错的排查记录:短连接的成本真的很高啊
查看>>
关于php抓取页面信息的简单代码
查看>>
安装Properties Editor插件,解决XXX.properties文件中文乱码的问题
查看>>
安装npm出现Profile not found.的问题
查看>>
解决 后台播放音乐时,设置手机铃声,后台音乐不会暂停
查看>>
Lock 与 InterruptedException
查看>>
python
查看>>
Android 关于Handler
查看>>