C++有限状态机实现计算器小程序
时间:2019-03-30
本文章向大家介绍C++有限状态机实现计算器小程序,主要包括C++有限状态机实现计算器小程序使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文介绍利用有限状态机原理开发计算器小程序的过程。
实现的功能
- 支持整数、小数输入
- 支持+ - * / 四则运算
- CE 清除当前操作数
- C 清除所有、回到初始状态
- 回显操作数和结果
HSM状态图
计算器可以分为七种状态:Start、Operand_1、Negate_1、Operator、Operand_2、Negate_2、Error。其中Start、Operand_1、Operand_1状态又分了几种子状态。 下面简要的介绍下状态状态转换的过程:
- 启动软件,进入Start状态
- 当用户点击1-9、0、Point按钮,软件进入Operand_1 状态。
- 当用户点击+、-、*、/按钮,软件进入Operator状态。
- 此时当用户再次点击1-9、0、Point按钮,软件进入Operand_2 状态。
- 如果用户点击=按钮,软件就进入了Start状态。
- 如果此时进行的是除法运算且除数为0,软件进入Error状态,用户只有点击C按钮才可以跳出。
在实际开发的过程中,我们只需要关心现在程序处在什么状态,可以进行什么样的操作。然后就是状态转换的条件要处理下。
代码片段
下面是CalculatorDlg.cpp中的一段代码,我们首先要获得当前的状态,然后进行相应的操作,操作完成之后设置好对应的状态。
void CalculatorDlg::enterOperation(Calculator::CalcOp oper) { if (m_calculator.getCurrentState() == Calculator::CalcState::Error) { return; } if (m_calculator.getCurrentState() == Calculator::CalcState::Start || m_calculator.getCurrentState() == Calculator::CalcState::Negate_1 || m_calculator.getCurrentState() == Calculator::CalcState::Operand_1) { m_calculator.setOperand_1(_wtof(m_output)); } else if (m_calculator.getCurrentState() == Calculator::CalcState::Operand_2 || m_calculator.getCurrentState() == Calculator::CalcState::Negate_2) { m_calculator.setOperand_2(_wtof(m_output)); UpdateData(TRUE); std::stringstream ss; ss << m_calculator.getResult(); m_output = ss.str().c_str(); UpdateData(FALSE); m_calculator.setCurrentState(Calculator::CalcState::Start); m_calculator.setOperand_1(m_calculator.getResult()); } m_calculator.setCurrentState(Calculator::CalcState::Operator); m_calculator.setOperator(oper); }
运行效果展示
源码查看
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- 你不知道的javaScript笔记(6)
- 创建支持多种屏幕尺寸的Android应用
- 封装多线程处理大量数据操作
- 你不知道的javaScript笔记(5)
- 无特性的 MEF 配置方法
- HTTP协议状态码详解(HTTP Status Code)
- android 中resources管理
- 你不知道的javaScript笔记(4)
- Android网格视图(GridView)
- http响应Last-Modified和ETag以及asp.net web api实现
- 列表视图(ListView和ListActivity)
- 你不知道的javaScript笔记(3)
- 你不知道的javaScript笔记(2)
- WinRT:WebAuthenticationBroker For OAuth认证
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- CentOS7.5从零安装Python3.6.6的教程详解
- 实现一台或者多台Linux实例解绑SSH密钥对
- centos7切换启动内核与切换启动模式的讲解
- Ubuntu下Sublime Text无法输入中文最简单的解决方案
- 详解linux系统输入输出管理和vim的常用功能
- 查看远程 Linux 系统中某个端口是否开启的三种方法
- Linux使用iptables限制多个IP访问你的服务器
- 在 Linux 中不使用 CD 命令进入目录/文件夹的方法
- 探索Linux内核:Kconfig的秘密
- Linux中使用命令more,less,cat查看文件内容
- SSH的ssh-keygen命令基本用法详解
- 图文详解Ubuntu搭建Ftp服务器的方法(包成功)
- Linux中chown与chmod两个命令的区别详解
- 解决navicat连接不上linux服务器上的mysql问题
- 增强Linux和Unix服务器安全性的方法详解