博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
状态机
阅读量:4583 次
发布时间:2019-06-09

本文共 3124 字,大约阅读时间需要 10 分钟。

1、状态机

   简称为FSM(finite state machine),也就是有限个状态机,机器(程序)在接受到外部的信息输入之后,考虑到当前的状态和用户输入的信息从而去执行相应的动作(输出)。

状态机的分类:MOORE、MEALY:

MOORE:

    执行的动作(输出)之和当前状态有关和输入无关。

MEALY:

    执行的动作不仅和状态有关,也与输入有关。也就是说,当接受到外界输入(用户输入)只和,会根据当前的状态和接受到的输入结合考虑才会去执行相应的动作。

2、状态机在程序中的应用

    实现密码锁的功能:设置好了 6 位密码,当输入其中的某一位密码错误的时候,则会要求重新输入密码,使之重新开始输入密码。

 
typedef enum {  // 定义七个状态,前面六个是每个密码的状态    state1,    state2,    state3,    state4,    state5,    state6,    state7,}STATE;int main(int argc, char *argv[]){    int get_return;    int passwd[6];    STATE current_state = state1;    printf("输入6位设置的密码:\n");    for (size_t i = 0; i < 6; i++)    {        printf("输入第 %d 位设置的密码:\n", i+1);        scanf("%d",&passwd[i]);    }    printf("您输入的密码是:\n");    for (size_t i = 0; i < 6; i++)    {        printf("%d", passwd[i]);    }    printf("\n");    while (1)    {        scanf("%d", &get_return);        switch (current_state)        {        case state1:            // 密码正确,就进入下一个状态            if (get_return == passwd[0])            {                current_state = state2;            }            else            {                printf("您输入的密码错误,请重新输入:\n");                current_state = state1;            }            break;        case state2:            if (get_return == passwd[1])            {                current_state = state3;            }            else            {  // 密码出错了,就自动                printf("您输入的密码错误,请重新输入:\n");                current_state = state1;            }            break;        case state3:            if (get_return == passwd[2])            {                current_state = state4;            }            else            {  // 密码出错了,就自动                printf("您输入的密码错误,请重新输入:\n");                current_state = state1;            }            break;        case state4:            if (get_return == passwd[3])            {                current_state = state5;            }            else            {  // 密码出错了,就自动                printf("您输入的密码错误,请重新输入:\n");                current_state = state1;            }            break;        case state5:            if (get_return == passwd[4])            {                current_state = state6;            }            else            {  // 密码出错了,就自动                printf("您输入的密码错误,请重新输入:\n");                current_state = state1;            }            break;        case state6:            if (get_return == passwd[5])            {                current_state = state7;            }            else            {  // 密码出错了,就自动                printf("您输入的密码错误,请重新输入:\n");                current_state = state1;            }            break;        default:            printf("密码不对:请重新输入\n");            current_state = state1;            break;        }        if (current_state == state7)        {            printf("open the lock\n");            break;        }    }        printf("OK\n");    while (1);}

    结合使用了状态机的机制,当输入的一位密码是正确的时候,则状态转移为下一个状态,但是当出错的时候,则转会初试的状态。只有当全部正确的时候,状态转为 state7,这个时候就可以执行开锁的动作。

输入6位设置的密码:输入第 1 位设置的密码:1输入第 2 位设置的密码:2输入第 3 位设置的密码:3输入第 4 位设置的密码:4输入第 5 位设置的密码:5输入第 6 位设置的密码:6您输入的密码是:123456123456open the lockOK

转载于:https://www.cnblogs.com/qxj511/p/4975185.html

你可能感兴趣的文章
SSO 单点登录总结(PHP)
查看>>
Ubuntu16.04下将hadoop2.7.3源代码导入到eclipse neon中
查看>>
朝令夕改的企业不值得留恋
查看>>
springboot踩坑出坑记
查看>>
ovs源码阅读--netlink使用
查看>>
php中引用&的真正理解-变量引用、函数引用、对象引用
查看>>
cmake编译安装mysql 5.6.12
查看>>
第七章学习小结
查看>>
GS LiveMgr心跳管理类
查看>>
设计模式学习笔记(二)之观察者模式、装饰者模式
查看>>
mysql导出数据库和恢复数据库代码
查看>>
走出软件泥潭 第一回 雪上加霜
查看>>
小鸟哥哥博客 For SAE
查看>>
gui编程实践(3)--记事本界面 JMenuBar JMenu
查看>>
App测试方法总结
查看>>
51nod-1228: 序列求和
查看>>
BZOJ1303: [CQOI2009]中位数图
查看>>
2015上海马拉松线上跑感悟-人生如同一场马拉松
查看>>
北航软院2013级C#期末考试部分考题解答
查看>>
CentOS 系统中安装 ArcGIS Server10.1 一些问题及解决
查看>>