`
flytreeleft
  • 浏览: 92032 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

用状态机进行文件字符分析的程序设计

阅读更多

 

1、 问题描述

设计C++ 类,使其能够统计文本文件中字符个数,在终端中显示结果,并将结果保存到指定的文件中。需要统计的字符有: a 、英文字母总数 b 、英文单词总数从 c 、中文字符总数(包括标点符号) d 、行总数e 、其他字符总数(包括英文标点、空白符等)。

2、 问题分析

从问题描述中可以看到,我们所要做的就是将一篇文章(txt 格式,字符格式为 ANSI )中出现的中英文字符出现的次数进行统计。而一篇文本文件中出现的字符种类和顺序没有规律,如何对当前读取的字符的种类进行判断并转入到相应的统计状态成为了问题的关键。

但是,我们知道对于英文字母其ASCII 码范围在 65 ~ 90 和 97 ~ 122 两个区间,而英文单词的判断就是在相邻两个非英文字母之间夹着一串英文字母,所以我们可以在读取了第一个非英文字母后判断下一个读取的是否为英文字母,如果是便转入英文字符的处理状态,其中可同时对字母个数进行统计,在读到非英文字符时退出该状态,并将英文单词数加 1 ,然后转入“状态转换中心”进行状态转换的判断。

同理,对于中文字符的处理,也同上所述。但是由于中文字符占两个字节,而且各个编码格式中中文字符的编码范围不一致,所以处理起来比较麻烦,但是原理是一致的。在本例中仅对ANSI 格式的编码进行处理,所以中文字符每个字节的范围为 0x80 ~ 0xff ,不过在实际操作中发现有些中文字符还是被漏掉了,应该是中文字符的编码范围并没有全部包括进去的原因。

其他的字符处理没有什么难处,所以在此就不多述了。具体的见状态转换图吧。

3、 程序设计

首先,为类定义一个状态,如: 

typedef enum{CHN,WORD,LIN,BOUND,PREPRO}SticState;

其中,CHN 表示“中文字符处理”状态, WORD 表示“英文字符处理”状态, LIN 表示“行符处理”状态, BOUND 表示“分界符处理”状态, PREPRO (预处理)就是“状态转换中心”。

字符统计程序如下:

file.get(ch);
SticState state=PREPRO;
while(1) {
  switch(state) {
    case CHN:
        do {
          if(ch!=中文字符 ) break;
            chnum++;
        } while(file.get(ch));
        state=PREPRO;
        break;
    case WORD:
        do {
          if(ch!=英文字符 ) break;
          engnum++;
        } while(file.get(ch));
        wordnum++;
        state=PREPRO;
        break;
    case LIN:
        do {
          if(ch!=行符 ) break;
          linenum++;
        } while(file.get(ch));
        state=PREPRO;
        break;
    case BOUND:
        do {
          if( ch!=分界符)   break;
          boundnum++;
        } while(file.get(ch));
        state=PREPRO;
        break;
    case PREPRO:
        if(到文件尾) {
          if(当前非行符) linenum++;// 对文件结尾的处理,可能会有最后一行没有回车的情况
            return;
        }
        else if(ch=分界符) state=BOUND;
        else if(ch=英文字符) state=WORD;
        else if(ch=中文字符) state=CHN;
        else if(ch=行符) state=LIN;
    break;
        default:
        cout<<"未知状态错误 !"<<endl;
    break;
  }
} 

  4、 总结

本程序采用状态机的思想完成了设计要求,虽然不尽完美,但是我们也能从中学到如何用状态机的思想来比较轻松的完成程序设计。从本例可以看出,通过状态机的思想可以使程序变得简单、清晰、明了。所以,我们应该充分利用好这一有利的工具为我们的程序设计增添光彩!

源码下载地址:http://download.csdn.net/source/1797902

另附状态机学习的文章一篇:

系统程序员成长计划-文本处理(INI解析器)

http://blog.csdn.net/absurd/archive/2009/06/10/4255701.aspx

 

  • 大小: 40.3 KB
分享到:
评论

相关推荐

    用状态机进行文件字符分析的程序设计(附设计文档)

    而一篇文本文件中出现的字符种类和顺序没有规律,如何对当前读取的字符的种类进行判断并转入到相应的统计状态成为了问题的关键。 但是,我们知道对于英文字母其ASCII码范围在65~90和97~122两个区间,而英文单词的...

    Linux程序设计 第4版.haozip01

    Linux程序设计 分卷文件共有以下2个: Linux程序设计 第4版.haozip01.zip Linux程序设计 第4版.haozip02.zip 基本信息 原书名: Beginning Linux Programming 原出版社: Wrox 作者: (英)Neil Matthew Richard ...

    C语言程序设计标准教程

    ASCII码文件可在屏幕上按字符显示, 例如源程序文件就是ASCII文件,用DOS命令TYPE可显示文件的内容。 由于是按字符显示,因此能读懂文件内容。  二进制文件是按二进制的编码方式来存放文件的。 例如, 数5678的...

    Linux程序设计 第4版.haozip02

    Linux程序设计 分卷文件共有以下2个: Linux程序设计 第4版.haozip01.zip Linux程序设计 第4版.haozip02.zip 基本信息 原书名: Beginning Linux Programming 原出版社: Wrox 作者: (英)Neil Matthew Richard ...

    8086/8088汇编语言程序设计教程

    第一部分是基础部分,以8086/8088为背景,以DOS和PC兼容机为软硬件平台,以MASM和TASM为汇编器,介绍汇编语言的有关概念,讲解汇编语言程序设计技术。第二部分是提高部分,以80386为背景,以新一代微处理器Pentium为...

    80x86汇编语言程序设计教程

    第一部分是基础部分,以8086/8088为背景,以DOS和PC兼容机为软硬件平台,以MASM和TASM为汇编器,介绍汇编语言的有关概念,讲解汇编语言程序设计技术。第二部分是提高部分,以80386为背景,以新一代微处理器Pentium为...

    2020年计算机二级《Web程序设计》练习题及答案.doc

    去掉字符串前后的空格 9、 Len 功能:返回字符串内字符的数目,或是存储一变量所需的 字节数 10、 msgbox() :基本输出信息框 11、 CStr 函数:将数据转换成一个字符串 12、 事件:是对网页中各种控件状态改变的一种...

    C++程序设计代码

    实验一 C++简单程序设计(2学时) 1.编程计算图形的面积。程序可以计算圆形、长方形、正方形的面积、运行时先提示用户选择图形类型,然后,对圆形要求用户输入半径、对长方形要求用户输入长和宽的值,对正方形要求...

    Java高级程序设计测试含答案.docx

    新建状态、可运行状态、运行状态、恢复状态和终止状态 Java高级程序设计测试含答案全文共40页,当前为第3页。Thead类中能运行线程任务代码的方法是() [单选题] * Java高级程序设计测试含答案全文共40页,当前为第...

    80X86汇编语言程序设计

    第一部分是基础部分,以8086/8088为背景,以DOS和PC兼容机为软硬件平台,以MASM和TASM为汇编器,介绍汇编语言的有关概念,讲解汇编语言程序设计技术。第二部分是提高部分,以80386为背景,以新一代微处理器Pentium为...

    数据结构课程设计-图书管理-用B树对书号进行索引-评分获得优秀

    题目采自 《数据结构题集》(c语言版)(严蔚敏`吴伟民)6.3 图书管理,最大的难度在于要求用B树对书号进行索引。 设计语言:C语言 编译环境: VC++6.0 里面包含完整的源程序和报告文档,程序为dos界面,有彩色菜单...

    完整版《HTML5高级程序设计》2

    由于上传文件大小限制,只能分为5部分上传,其余部分请在我的资源中找到,下载后共同解压 内容简介  今天,大多数现代浏览器都已经支持HTML5。学习体验HTML5带给Web开发的便捷、快速和强大功能,是每一位Web设计和...

    《计算机基础与程序设计》.doc

    《计算机基础与程序设计》 1. 微型计算机的性能主要取决于( 中央处理器 )。 2. 有一个数值152,它与十六进制数6A相等,那么该数值是( 八进制数 )。 3. 使用超大规模集成电路制造的计算机应该归属于( 第四代 )。 ...

    rar压缩软件.rar

    在 e:\text 目录下的 rar 压缩文件中搜索十六进制字符串 f0 e0 ae ae ab 2d 83 e3 a9。 k 锁定压缩文件。任何试图改变压缩文件的命令都会被忽略。 例子: rar k final.rar l[t[a],b] 压缩文件的内容列表...

    2005-2009软件设计师历年真题

     4.3 掌握C程序设计语言,以及C++、Java、Visual、Basic、Visual C++中任一种程序设计语言,以便能指导程序员进行编程和测试,并进行必要的优化  4.4 系统测试  • 指导程序员进行模块测试,并进行验收  • 准备...

    HTML5程序设计(第2版).[荷]Peter Lubbers(带详细书签).pdf

    本书在上一版的基础上新增了SVG和拖放API相关内容,并对部分内容进行了更新。从第 2章起,分别围绕构建令人神往的富Web 应用,逐一讨论了HTML5的Canvas、Geolocation、Communication、WebSocket、Forms、WebWorkers...

    第一部分 界面设计

    第一部分 界面设计 实例001 如何实现程序闪屏效果 实例002 如何实现程序窗口闪烁 实例003 如何制作吸附窗口程序 实例004 如何制作透明程序窗口 实例005 如何制作半透明程序窗口 实例006 如何制作不规则程序...

    入门学习Linux常用必会60个命令实例详解doc/txt

    -n:一般而言,mount挂上后会在/etc/mtab中写入一笔资料,在系统中没有可写入文件系统的情况下,可以用这个选项取消这个动作。 4.应用技巧 在Linux 和Unix系统上,所有文件都是作为一个大型树(以/为根)的一部分...

    完整版《HTML5高级程序设计》4

    由于上传文件大小限制,只能分为5部分上传,其余部分请在我的资源中找到,下载后共同解压 内容简介  今天,大多数现代浏览器都已经支持HTML5。学习体验HTML5带给Web开发的便捷、快速和强大功能,是每一位Web设计和...

    java源码包---java 源码 大量 实例

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

Global site tag (gtag.js) - Google Analytics