软件工程之个人项目--词频统计

      不得不说对于菜鸟级的我,这是一次心酸的经历啊。。。自打接到王老师布置的这个任务(个人项目)之后,我心里一直在想着自己要用哪种语言来完成我的任务。以前多多少少写过一些程序的,这又想起了数据库小学期与永哥和小强哥一起奋斗的日子来了,和大牛一起合作就是长见识,哈哈!

     好吧,介绍一下题目,对一个英文文本进行词频统计,并把出现频率最高的10个词打印出来。

     发愁是肯定的,努力也是肯定的,既然对一个英文文本进行词频统计,那么肯定会用到文件的读写函数,所以先找到了c语言课本,对这一部分的知识做了一下系统地复习。并且对该部分的知识做了一个小小的总结,虽然不是很全面吧,但是是自己对知识的深入理解。当然这对我们班的神人来说就是小case了,所以还是很惭愧滴!

     对文件的读写操作搞懂了之后呢,就要设计自己的思路了。首先,定义一个结构体,(想必,我的同学们也有好多用结构体的...)

1 struct wordcount//定义一个结构体Wordcount
2 {
3     char *word;
4     int count;
5     struct wordcount *next;
6 };

然后定义了一些指向结构体变量的指针,和缓冲区用来存放从文本文件中获取的内容。然后运用isalpha()来判断读到缓冲区的内容是否为字母。

     /* 函数:isalpha

  原型:int isalpha(int ch)

  用法:头文件加入#include <cctype>(旧版本的编译器使用<ctype.h>)

  功能:判断字符ch是否为英文字母,当ch为英文字母a-z或A-Z时,在标准c中相当于使用“isupper(ch)||islower(ch)”做测试,返回非零值,否则返回零。*/

     之后就是判断缓冲区中的单词有没有超过规定的最大限度,以及把大写字母转换为小写字母等等。部分代码如下

 

用strcpy()函数来判断是否和buff内的单词相同,若相同,则count+1

 1 while (wc)//如果有的话则计数加1
 2 {
 3        if (strcmp(wc->word,buff)==0)
 4       {
 5               wc->count=wc->count+1;
 6               isfinded=1;
 7               break;
 8       }
 9        else
10              wc=wc->next;
11 }

 

对出现次数最高的10个词进行排序则可能弱了一些,我选用的是交换排序,所以效率会慢了一些。自然所用的时间就会长好多了(和那些大牛级的任务了)。下面是全部的代码:

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>#define MAXLEN 30struct wordcount//定义一个结构体Wordcount
{char *word;int count;struct wordcount *next;
};struct wordcount *head,*wc,*sort,*headsort;
char buff[MAXLEN];
char *zs_c;//buf[]数组用来存放英文字母
int buff_count=0, isfinded;int main()
{FILE *fp;char ch;int i;int k;char filename[20];printf("请输入文件名:\n");scanf("%s",filename);if ((fp=fopen(filename,"r"))==NULL) {printf("不能打开该文件!\n");exit(0);}while ((ch=fgetc(fp))!=EOF)//读取英文文本中的内容if (isalpha(ch)){buff[buff_count++]=tolower(ch);//判断是否为字母若果是则把它放到数组Buff[]if (buff_count>=MAXLEN){printf("单词长度超过最大限度!\n");//判断单词的长度是否超过最长限度
                fclose(fp);return -1;}}else{//若果不是字母,且buff[]中没有单词的话则把其放到Wordcount link中if (buff_count!=0){buff[buff_count]='\0';wc=head;isfinded=0;while (wc)//如果有的话则计数加1
                {if (strcmp(wc->word,buff)==0){wc->count=wc->count+1;isfinded=1;break;}elsewc=wc->next;}if (isfinded==0) {zs_c=(char *)malloc(buff_count);if (zs_c==0){printf("错误!: zs_c !\n");fclose(fp);exit(0);}memcpy(buff,zs_c,buff_count);wc=(struct wordcount *)malloc(sizeof(struct wordcount));if (wc==0){printf("分配有误!\n");fclose(fp);exit(0);}wc->word=zs_c;wc->count=1;wc->next=head;head=wc;}buff_count=0;}}fclose(fp);if (head)//对单词进行排序
    {sort=head->next;head->next=0;while (sort){wc=sort;sort=sort->next;if ((wc->count) > (head->count)){wc->next=head->next;head=wc;}else{headsort=head;while ((headsort->next) && (headsort->next->count > wc->count ))//交换进行排序
                {headsort->count=headsort->next->count;wc->next->count=headsort->next->count;wc->next->count=headsort->count;headsort->word=headsort->next->word;wc->next->word=headsort->next->word;wc->next->word=headsort->word;}}}}while (head)//对结果进行输出
    {wc=head;head=head->next;printf("序号\t单词\t频率\n");for(i=1;i<11;i++)printf("NO%d\t%s\t %d\n",i,wc->word,wc->count);}return 0;
}

 运行结果:

 

 

个人工作总结:
      实话说来对于好久没有碰过程序的我来说不得不说这是很困难的。

      2.22就开始构思如何实现这个问题,开始进行咨询,并开始复习文件的读取。

      2.27上机时间(2:00--4:00)开始写程序,事实表明情况是不乐观的,此时多么希望神可以拯救我啊!(抓狂)。后来了解到,用trie树,map实现起来效率比较高,所以对这两种方法进行了查询,但是能力有限,所以还是沿用了最先的想法,周五自打吃完晚饭,就开始继续调试程序,就因为文件无法读取这个问题困扰了一晚上,最终和娇哥交流后,(因为她也遇到了相同的问题,难姐难妹啊),才知道是文件默认的格式就是.txt,是自动隐藏的,还以为是自己安装的vc有问题呢或者和电脑本身有关系,看来写程序这个东西是要和同仁交流的!!!。

     周六晚8:00又出现了一个大大的问题那就是死循环,所以那更是一个痛苦,程序的调试是必须的了,终于,发现了!原来是在进行数据交换的时候丢了一个指针。本来想使用argv传递参数的,argv[0]是执行的该文件,argv[1]是传递的第二个参数,即在屏幕上输入的第一个内容,本来是想用这种方法来获取文件的名称的,但是失败了,所以又改用了原来c语言传统的文件读取方式。

      不得不承认我的这个工程效率是不高的,比如说排序用到的算法啊,(有时间一定要再研究一下)如果文本的大小再大些的话,速度是相当的慢了就。自己的能力还不是很高,自己都觉得着急了,因为对trie树也进行了一定的学习,我想自己接下来能否可以用这种数据结构来实现,最让我崇拜的就是辉哥的hashtable了,自己一定要对这些知识进行学习。多学习,多联系,这是我对写程序的深刻体会!

 

 

 

转载于:https://www.cnblogs.com/zsjy/p/3576384.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RC4加密解密java算法

有一个项目&#xff0c;需要解析一个用户提供的rc4加密后的文件&#xff0c;特意搜索整理了一个java 版本的RC4加解密算法。 public static String HloveyRC4(String aInput,String aKey) { int[] iS new int[256]; byte[] iK new byte[256]; for (int i0;i<256;i…

史上最被低估的神级学科,看完忍不住感慨“它”也太重要了!

▲ 点击查看著名物理学家、数学家曾说&#xff1a;几何学的简洁美&#xff0c;却又是几何学之所以完美的核心存在。几何始于数学&#xff0c;但它的意义和影响却远超数学。一个个枯燥的数字和一个个简单的图形&#xff0c;却可以帮助我们解决很多问题&#xff0c;了解自然的规律…

.NET6之MiniAPI(三):Response

MiniAPI中&#xff0c;Response的返回数据有三种格式&#xff0c;IResult&#xff0c;string&#xff0c;json&#xff1a;ValueTask<string> - 这包括 string 和 Task<string>T&#xff08;任何其他类型&#xff0c;返回前端时转成json&#xff09;- 这包括 Task&…

ffmpeg speex转换为mp3或者aac

2019独角兽企业重金招聘Python工程师标准>>> 输入&#xff1a; flv格式&#xff0c;视频264编码&#xff0c;音频speex编码 -8:[rootandrew ffmpeg-3.0./ffprobe test_speex1.flv 32:ffprobe version 3.0-static32: Copyright (c) 2007-2016 the FFmpeg developers3…

python 解析器的常用options

解释器options: 1.1 –d 提供调试输出 1.2 –O 生成优化的字节码(生成.pyo文件) 1.3 –S 不导入site模块以在启动时查找python路径 1.4 –v 冗余输出(导入语句详细追踪) 1.5 –m mod 将一个模块以脚本形式运行 1.6 –Q opt 除法选项(参阅文档) 1.7 –c cmd 运行以命令行…

c语言给bmp图片加滤镜,关于BMP位图透明通道的详解制作教程, 教你输出透明的BMP位图...

我是sjmhiex啊月谢谢大家的支持 百度贴吧&#xff1a;sjmhiex吧QQ群&#xff1a;243153684BMP支持透明比较常见的方法有两种&#xff1a; 一种是32位图&#xff0c;直接就可以是透明的&#xff0c;还可以是半透明效果&#xff0c;一般都是用PNG转成的&#xff0c;或者在保存图…

QM课程02-外部功能

质量计划 对质量计划和检验计划进行基本数据的管理 物料说明 检验计划 质量检验 触发检验 具有检验计划选择和样本计算的检验处理 打印采样和检验的车间文档 记录结果和缺陷 做出使用决策并触发后续行为 质量控制 在质量级别历史的基础上的动态样本确定 使用质量控制…

Android之Lollipop DevicePolicyManager学习(上)

Android 5.0(lollipop)发布之后&#xff0c;看特性文档增加了不少有趣的东西。 最近花了一些时间&#xff0c;研究了下其中Managed Profile的概念&#xff0c;简称MP&#xff0c;记录下来作为一些经验&#xff0c;有需要的同学请参考。 简介 Managed Profile&#xff0c;简称被…

c语言时间算法如何以毫秒显示,C语言时间的方法.doc

C语言时间的方法.docC语言获取系统时间的几种方式—源于网络C语言中如何获取时间&#xff1f;精度如何&#xff1f;1 使用time_t time( time_t * timer ) 精确到秒2 使用clock_t clock() 得到的是CPU时间精确到1/CLOCKS_PER_SEC秒3 计算时间差使用double difftime( time_t time…

简述JQuery,Extjs,YUI,Prototype,Dojo等JS框架的区别和应用场景

随着web2.0的彪悍发展&#xff0c;以及浏览器端所承载的工作越来越大&#xff08;在不是很影响性能的情况下&#xff0c;开发者都习惯把能用浏览器做的事儿都让浏览器做&#xff0c;以减轻服务器的压力和带宽费用等&#xff09;。所以Javascript已经成为了web开发最最基本的要求…

怎么向小学生解释欧拉公式 e^(πi)+1=0?

全世界只有3.14 % 的人关注了爆炸吧知识前几天&#xff0c;超模君空投了一个包裹给8岁表妹。不到三秒&#xff0c;表妹就从包裹里面拿出来一条毛毯&#xff1a;表哥&#xff0c;这个毛绒绒的毯子好舒服&#xff0c;我披着毯子写作业很暖和&#xff0c;但这个图案是啥&#xff0…

正式发布!Azure Functions OpenAPI Extension

微软中国MSDN 点击上方蓝字关注我们距离Azure Functions OpenAPI Extension的预览版发布已有一年的时间&#xff0c;今天&#xff0c;我们很开心地宣布它已经正式发布了&#xff01;该版本支持.NET Core 2.1 (LTS)、3.1 (LTS)、.NET 5 和 .NET 6 (LTS)的同时&#xff0c;它还支…

Java中数据是如何存储

2019独角兽企业重金招聘Python工程师标准>>> 一&#xff1a;JAVA中数据的存储方式 ①&#xff1a;寄存器&#xff1a;这是最快的存储区&#xff0c;因为它位于不同于其他存储区的地方———处理器内部。但是寄存器的数量极其有限&#xff0c;所以寄存器根据需求进行…

代码重构五

2014年3月3日 10:13:25 今天使用frameset时&#xff0c;发现。在框架的src页面里&#xff0c;如果引用 base_url() 载入的页面一片空白。转载于:https://www.cnblogs.com/jsRunner/p/3577832.html

Android之Lollipop DevicePolicyManager学习(下)

转载&#xff1a;http://blog.csdn.net/guiyu_1985/article/details/42968781 3. 如何在主账户与被管理者账户之间做数据通信。 a) 什么是userID 刚才提到&#xff0c;Lollipop用来区分主账户与被管理账户的其实是一个int型数值userID。 从UserHandler.class可…

oracle 时间转化函数及常见函数 .

摘自: http://blog.csdn.net/feifei666888/article/details/4835685 两种时间转换格式 plsql> select to_date(2005-01-01 13:14:20,yyyy-MM-dd HH24:mi:ss) from dual; select date‘2005-01-01’ from dual; 按规定格式 获得系统时间 如下&#xff1a; select to_char(sys…

详解:从Greenplum、Hadoop到现在的阿里大数据技术

对于企业来说&#xff0c;但是到底云计算是什么呢&#xff1f;相信很多企业都有这样的困惑&#xff0c;让我们一起回到这个原始的起点探讨究竟什么是云计算&#xff1f;云计算对于企业而言到底意味什么&#xff1f;云计算的三条发展路径及三种落地形态 当回到最初的起点再审视云…

技术分享 | 【构建服务端SDK】之连接中心统一调用SDK

源宝导读&#xff1a;微服务架构与传统的单体式方案的最大不同是微服务将应用的核心功能拆分成多项服务。每项服务可以单独构建和部署。服务之间需要互相通信。假设服务间每次通信都需要在调用方编码操作&#xff0c;那么必定会增加很大的工作量&#xff0c;并且造成代码冗余并…

android动态化ui框架,动态化高性能的 UI 框架 Virtualview-Android

软件介绍Virtualview-Android 是一个虚拟化组件&#xff0c;是 Tangram 模型在 2.0 版本补充的 UI 开源库。它开创了一种虚拟化开发基础控件的技术&#xff0c;使用方只要按照指定协议实现一个基础控件的尺寸计算、绘制逻辑、布局逻辑&#xff0c;即能实现在宿主容器的 canvas …