C++有限状态机实现计算器小程序

发布时间 - 2026-01-11 01:50:44    点击率:

本文介绍利用有限状态机原理开发计算器小程序的过程。

实现的功能

  • 支持整数、小数输入
  • 支持+ - * / 四则运算
  • 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);
}

运行效果展示

源码查看

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# C++  # 计算器  # c++编写简单的计算器程序  # 简单实现C++复数计算器  # C/C++实现日期计算器的示例代码  # C/C++经典实例之模拟计算器示例代码  # C++实现简单计算器  # C++实现四则混合运算计算器  # C++实现简单计算器功能  # C++实现分数计算器  # 基于C++实现简单日期计算器  # C++制作简单的计算器功能  # 的是  # 才可以  # 只需要  # 分了  # 七种  # 大家多多  # 可以分为  # 数为  # 过程中  # 在实际  # CalculatorDlg  # Point  # style  # align  # center  # text  # CE  # br  # HSM  # strong 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  如何登录建站主机?访问步骤全解析  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  javascript中闭包概念与用法深入理解  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  Laravel如何保护应用免受CSRF攻击?(原理和示例)  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  php485函数参数是什么意思_php485各参数详细说明【介绍】  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  微信小程序制作网站有哪些,微信小程序需要做网站吗?  EditPlus中的正则表达式实战(5)  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  佛山企业网站制作公司有哪些,沟通100网上服务官网?  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  如何在不使用负向后查找的情况下匹配特定条件前的换行符  Laravel如何实现一对一模型关联?(Eloquent示例)  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  javascript读取文本节点方法小结  iOS验证手机号的正则表达式  Laravel中的withCount方法怎么高效统计关联模型数量  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  如何用AI帮你把自己的生活经历写成一个有趣的故事?  网站图片在线制作软件,怎么在图片上做链接?  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  如何选择PHP开源工具快速搭建网站?  如何获取上海专业网站定制建站电话?  MySQL查询结果复制到新表的方法(更新、插入)  如何在建站之星绑定自定义域名?  JavaScript常见的五种数组去重的方式  济南网站建设制作公司,室内设计网站一般都有哪些功能?  利用JavaScript实现拖拽改变元素大小  Laravel如何处理CORS跨域请求?(配置示例)  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  装修招标网站设计制作流程,装修招标流程?  英语简历制作免费网站推荐,如何将简历翻译成英文?  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  如何在VPS电脑上快速搭建网站?  Laravel如何实现多对多模型关联?(Eloquent教程)  Python制作简易注册登录系统  如何在香港免费服务器上快速搭建网站?  JS去除重复并统计数量的实现方法  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  Laravel如何配置和使用缓存?(Redis代码示例)