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


相关推荐: Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  如何正确下载安装西数主机建站助手?  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  如何在阿里云高效完成企业建站全流程?  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  如何快速选择适合个人网站的云服务器配置?  Laravel如何使用Blade组件和插槽?(Component代码示例)  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  EditPlus中的正则表达式实战(6)  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  独立制作一个网站多少钱,建立网站需要花多少钱?  如何快速生成高效建站系统源代码?  如何在Windows 2008云服务器安全搭建网站?  5种Android数据存储方式汇总  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  手机网站制作与建设方案,手机网站如何建设?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  nginx修改上传文件大小限制的方法  Laravel如何处理文件下载请求?(Response示例)  香港服务器WordPress建站指南:SEO优化与高效部署策略  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  如何选择可靠的免备案建站服务器?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  制作企业网站建设方案,怎样建设一个公司网站?  如何在阿里云香港服务器快速搭建网站?  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  如何正确选择百度移动适配建站域名?  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  如何实现javascript表单验证_正则表达式有哪些实用技巧  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  如何破解联通资金短缺导致的基站建设难题?  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  如何挑选最适合建站的高性能VPS主机?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  如何在建站之星网店版论坛获取技术支持?  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  canvas 画布在主流浏览器中的尺寸限制详细介绍  Linux系统命令中screen命令详解