zoukankan      html  css  js  c++  java
  • 状态机


    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位设置的密码:
    ");
        for (size_t i = 0; i < 6; i++)
        {
            printf("输入第 %d 位设置的密码:
    ", i+1);
            scanf("%d",&passwd[i]);
        }
        printf("您输入的密码是:
    ");
        for (size_t i = 0; i < 6; i++)
        {
            printf("%d", passwd[i]);
        }
        printf("
    ");
        while (1)
        {
            scanf("%d", &get_return);
            switch (current_state)
            {
            case state1:
                // 密码正确,就进入下一个状态
                if (get_return == passwd[0])
                {
                    current_state = state2;
                }
                else
                {
                    printf("您输入的密码错误,请重新输入:
    ");
                    current_state = state1;
                }
                break;
            case state2:
                if (get_return == passwd[1])
                {
                    current_state = state3;
                }
                else
                {  // 密码出错了,就自动
                    printf("您输入的密码错误,请重新输入:
    ");
                    current_state = state1;
                }
                break;
            case state3:
                if (get_return == passwd[2])
                {
                    current_state = state4;
                }
                else
                {  // 密码出错了,就自动
                    printf("您输入的密码错误,请重新输入:
    ");
                    current_state = state1;
                }
                break;
            case state4:
                if (get_return == passwd[3])
                {
                    current_state = state5;
                }
                else
                {  // 密码出错了,就自动
                    printf("您输入的密码错误,请重新输入:
    ");
                    current_state = state1;
                }
                break;
            case state5:
                if (get_return == passwd[4])
                {
                    current_state = state6;
                }
                else
                {  // 密码出错了,就自动
                    printf("您输入的密码错误,请重新输入:
    ");
                    current_state = state1;
                }
                break;
            case state6:
                if (get_return == passwd[5])
                {
                    current_state = state7;
                }
                else
                {  // 密码出错了,就自动
                    printf("您输入的密码错误,请重新输入:
    ");
                    current_state = state1;
                }
                break;
            default:
                printf("密码不对:请重新输入
    ");
                current_state = state1;
                break;
            }
            if (current_state == state7)
            {
                printf("open the lock
    ");
                break;
            }
        }
        
        printf("OK
    ");
        while (1);
    }

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


    输入6位设置的密码:
    输入第 1 位设置的密码:
    1
    输入第 2 位设置的密码:
    2
    输入第 3 位设置的密码:
    3
    输入第 4 位设置的密码:
    4
    输入第 5 位设置的密码:
    5
    输入第 6 位设置的密码:
    6
    您输入的密码是:
    123456
    1
    2
    3
    4
    5
    6
    open the lock
    OK
  • 相关阅读:
    Jenkins简明入门(三) -- Blue Ocean,让一切变得简单
    TeamForge使用指南
    Jenkins简明入门(二) -- 利用Jenkins完成Python程序的build、test、deployment
    谈谈Python中的decorator装饰器,如何更优雅的重用代码
    Jenkins简明入门(一) -- 安装
    Python CSV 超简明用法
    Intel CPU命名规则的简略解析
    ef core 2.1 利用Query Type查询视图
    asp.net core 开发环境自定义域名及端口
    ef core 使用include进行外键连接查询
  • 原文地址:https://www.cnblogs.com/qxj511/p/4975185.html
Copyright © 2011-2022 走看看