状态机


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
原文地址:https://www.cnblogs.com/qxj511/p/4975185.html