解答:
1、什么是状态机?
有限状态自动机,简称状态机,是表示有限个状态以及在这些状
态之间的转移和动作等行为的数学模型。
2、为什么要引入状态机?
大家在学习 C 语言编程的时候,通常会用流程图来描述程序的执行
过程,但是流程图是存在缺陷的。
举个例子,电子表只有两个按键,用这两个按键可以完成修改、查
看时间日期等功能。但是如果我们用流程图来描述程序的执行过程将会是这
样的:
这样程序的流程图将会无限地分支下去。
可是如果我们这些流程都看成是各种“状态”,按键表示从一种状
态转移到另一种状态,我们就能得到下面这种“状态转移图”:
于是我们就可以比较方便地描述程序中各种状态之间的关系,便可
以得到下面的程序思路:
/*************A 键中断***************/
跳转
swith(Status)
{
//根据当前状态处理 A 键所引发的状态
case DISP_TIME:Status=DISP_DATE;break;
键,显示日期
case DISP_DATE:Status=DISP_SEC; break;
case DISP_SEC: Status=DISP_TIME;break;
case SET_HOUR:if(++Hour>23) Hour=0;break;
//时间显示按键 A
//小时设置时按
A 键调整小时
case SET_MINUTE:if(++Month>12) Month=0;break;
case SET_DATE:if(++Date>31) Date=0;break;
}
/*************B 键中断***************/
swith(Status)
状态跳转
{
//根据当前状态处理 A 键所引发的
case DISP_TIME :Status=SET_HOUR;break;
键,显示小时
case DISP_DATE :Status=SET_HOUR;break;
键,显示小时
case DISP_SEC :Second=0;break;
//时间显示时按 B
//日期显示时按 B
//秒钟显示时按 B
键,秒归零
case SET_HOUR :Status=SET_MINUTE;break; //小时设置时按 B
键,分钟设置
case SET_MINUTE :Status=SET_MONTH;break;
键,月设置
case SET_MONTH :Status=SET_DATE;break;
B 键,日设置
case SET_DATE :Status=DISP_DATE;break;
//分钟设置时按 B
//月设置时按
//日设置时按 B 键,
显示时间
}
这样我们就把 A/B 两个按键的各种状态都描述了出来,这就是“状态机
编程”的一个例子。
状态机编程是工程上运用非常广泛的一种编程思想,希望大家在编程中
逐渐形成这种好的编程习惯。