本文介绍利用有限状态机原理开发计算器小程序的过程。
实现的功能
- 支持整数、小数输入
- 支持+ – * / 四则运算
- 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中的一段代码,我们首先要获得当前的状态,然后进行相应的操作,操作完成之后设置好对应的状态。
?
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
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);
}
|
运行效果展示
源码查看
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。
相关文章
猜你喜欢
- ASP.NET自助建站系统的域名绑定与解析教程 2025-06-10
- 个人服务器网站搭建:如何选择合适的服务器提供商? 2025-06-10
- ASP.NET自助建站系统中如何实现多语言支持? 2025-06-10
- 64M VPS建站:如何选择最适合的网站建设平台? 2025-06-10
- ASP.NET本地开发时常见的配置错误及解决方法? 2025-06-10
TA的动态
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
您的支持,是我们最大的动力!
热门文章
-
2025-05-29 71
-
MediaAccK.exe是什么进程 有什么用 MediaAccK进程查询
2025-05-27 36 -
2025-05-29 50
-
2025-06-05 91
-
2025-05-29 77
热门评论



