标志数在wordcount程序中的应用与拓展
wordcount程序要求测出文本中的单词数,字符数和行数。
设计思路:
将文件读入,逐字检测,检测到空格单词数加一,检测到回车行数单词数加一,如果既不是回车也不是空格则说明是字符,字符数加一
编程时发现的问题:
以上思路针对的是正常输入的文本,实际输入时还会出现种种特殊情况。
1.在一行结束时(换行符之前)出现空格,也就是文本后面加一个空格再按回车,这种情况会导致单词数多1。
2.文本结束时没有按下回车,会导致行数和单词数少1。
3.连续出现几个空格,也会导致单词数增多。
解决方案
设置标志数(int blank=0;),该标志数表示当前读取的文件中的字符的前一个字符是否为空格,0表示前一个字符不是空格,1表示是空格。
在读取当前字符时先查看blank的值,如果当前字符是空格时,如果blank==1,则单词数不作改动,如果blank==0,说明这个空格前之一
个单词,单词数加一,同时将blank赋值为1。如果当前字符是换行符,如果blank==1,则单词数不作改动,如果blank==0,说明换行符前
是一个单词,单词数加一。blank赋值为1。如果既不是空格也不是换行符,则说明这是一个真正的字符,字符数加一然后将blank置0。(读取
到下一个字符时,该字符的前一个是一个有意义的字符,blank!=0)。
if (c == ' ' || c == '\t')//blank
{
if (blank == )
{
count[]++;
blank = ;
}
}
else
if (c == '\n' || c == '\r')//enter
{
count[]++;
if (blank == )
count[]++;
blank = ;
}
else//char
{
count[]++;
blank = ;
}
为什么在遇到换行符时将blank置1?
在正常情况下,文本结束一行跳转下一行时,下一行的第一个字符应该是个有意义的字符,blank会被置0,如果下一行的第一个字符是空格,
blank会被赋值为1,也就是说遇到换行符将blank赋值为1这个操作是可有可无的。但是在文件结尾,这个blank的值起到了计数作用。当文件
读到结尾时,判断blank的值,如果在文件结束时,最后一个单词没有接换行符blank=0,单词数要加一。
while (c != EOF)
{ }
if (blank == )
count[]++;
fclose(fp);
如果在文件结尾单词后面有一个换行符,按照前面正常处理,blank赋值为1之后文件关闭,程序结束。
如果在程序的结尾有多个换行符(文件结尾有多个空行),因为检测到换行符blank置1,所以单词数不会增加,解决了文件特殊格式单词书出现异常的问题。
利用标志数blank进行功能拓展
可以将blank的值赋予更多的含义,如果要实现注释检测功能,当前一个字符为'/'时,用blank==2来判断,当前字符为'/'注释开始,检测到换行符注释结束。
当前字符为'*'时注释开始,用blank==3表示前一个字符为'*',当检测到blank==3当前字符为'/'时注释结束。
fgetc的返回值问题
格式:int fgetc(FILE *stream);
int c;
c = getc(fp);
while (c != EOF)
{ printf("%c", c);
c = fgetc(fp);
}
程序代码已上传至coding.net
标志数在wordcount程序中的应用与拓展的更多相关文章
- wordcount程序中的应用与拓展
设计思路: 关键是思路,首先知道 单词, 行,字符, 他们有什么特点: 1.单词,标准的是遇到空格后,单词数,自动加一. 2.行是以\n结束的, 也就是说, 遇到\n行数加一,当然也视你的操作系统而言 ...
- wordCount程序中MapReduce工作过程分析
Map处理的是一个纯文本.Mapper处理的数据是由InputFormat分解过的数据集,其中InputFormat的作用是将数据集切割成小数据集InputSplit,每一个InputSplit将由一 ...
- Hadoop学习笔记(1):WordCount程序的实现与总结
开篇语: 这几天开始学习Hadoop,花费了整整一天终于把伪分布式给搭好了,激动之情无法言表······ 搭好环境之后,按着书本的代码,实现了这个被誉为Hadoop中的HelloWorld的程序--W ...
- 021_在Eclipse Indigo中安装插件hadoop-eclipse-plugin-1.2.1.jar,直接运行wordcount程序
1.工具介绍 Eclipse Idigo.JDK1.7-32bit.hadoop1.2.1.hadoop-eclipse-plugin-1.2.1.jar(自己网上下载) 2.插件安装步骤 1)将ha ...
- 大话Spark(3)-一图深入理解WordCount程序在Spark中的执行过程
本文以WordCount为例, 画图说明spark程序的执行过程 WordCount就是统计一段数据中每个单词出现的次数, 例如hello spark hello you 这段文本中hello出现2次 ...
- Hadoop入门实践之从WordCount程序说起
这段时间需要学习Hadoop了,以前一直听说Hadoop,但是从来没有研究过,这几天粗略看完了<Hadoop实战>这本书,对Hadoop编程有了大致的了解.接下来就是多看多写了.以Hado ...
- Hadoop下WordCount程序
一.前言 在之前我们已经在 CenOS6.5 下搭建好了 Hadoop2.x 的开发环境.既然环境已经搭建好了,那么现在我们就应该来干点正事嘛!比如来一个Hadoop世界的HelloWorld,也就是 ...
- Yarn集群的搭建、Yarn的架构和WordCount程序在集群提交方式
一.Yarn集群概述及搭建 1.Mapreduce程序运行在多台机器的集群上,而且在运行是要使用很多maptask和reducertask,这个过程中需要一个自动化任务调度平台来调度任务,分配资源,这 ...
- Mapreduce概述和WordCount程序
一.Mapreduce概述 Mapreduce是分布式程序编程框架,也是分布式计算框架,它简化了开发! Mapreduce将用户编写的业务逻辑代码和自带默认组合整合成一个完整的分布式运算程序,并发的运 ...
随机推荐
- iOS开发拓展篇——如何把项目托管到GitHub
iOS开发拓展篇——如何把项目托管到GitHub 说明:本文主要介绍如何把一个OC项目托管到Github,重操作轻理论. 第一步:先注册一个Github的账号,这是必须的 注册地址:Github官网注 ...
- chrome诡异的Provisional headers are shown
昨天吐槽了cocos2d-js的问题,所以就准备调研几个其它HTML5引擎,发现PIXI性能极高,但是没有音频.而Phaser.js是在PIXI.js的基础之上进行的封装.而国内有一家公司,开发一个叫 ...
- 无锁编程以及CAS
无锁编程 / lock-free / 非阻塞同步 无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Sy ...
- maven eclipse miss required library解决
我是直接到C:\Users\admin\.m2\repository目录把所有的库包全删除,然后在项目里刷新一下,搞定!
- Android开发之蓝牙--扫描已经配对的蓝牙设备
一. 什么是蓝牙(Bluetooth)? 1.1 BuleTooth是目前使用最广泛的无线通信协议 1.2 主要针对短距离设备通讯(10m) 1.3 常用于连接耳机,鼠标和移动通讯设备等. 二. ...
- 【AI】蒙特卡洛搜索树
http://jeffbradberry.com/posts/2015/09/intro-to-monte-carlo-tree-search/ 蒙特卡洛方法与随机优化: http://iacs-co ...
- jdbc无法连接数据解析
1.网络原因 2.账户权限问题 账户是否赋予以下的权限: grant connect, resource to ADM_BI; grant read, write on directory BACKU ...
- jQuery Mobile Data 属性
按钮 带有 data-role="button" 的超链接.button 元素.工具栏中的链接以及 input 字段都会自动渲染成按钮样式,不需要添加 data-role=&quo ...
- Selenium自动化测试实践 公开班(广州)
Selenium自动化测试实践 公开班(广州) http://gdtesting.com/product.php?id=115
- android 开发环境
http://blog.csdn.net/shulianghan/article/details/38023959