状态机
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 您输入的密码是: 123456 1 2 3 4 5 6 open the lock OK