天天看點

狀态機設計原理及c語言實作一.簡介二.使用狀态機思路實作密碼輸入三.總結

文章目錄

  • 一.簡介
    • 1.什麼是狀态機?
    • 2.兩種狀态機模型:more型和mealy型
    • 3.狀态機解決了什麼問題?
    • 4.狀态機設計核心思路
  • 二.使用狀态機思路實作密碼輸入
    • 1.設計要求
    • 2.設計思路分析
    • 3.c語言代碼實作
    • 4.測試結果:
  • 三.總結

一.簡介

1.什麼是狀态機?

  有限狀态機:常說的狀态機就是有限狀态機FSM。FSM指的是有有限個狀态,這個機器能夠從外部接收信号和資訊輸入,機器在接收到外部輸入的信号後會綜合考慮目前自己的狀态和使用者輸入的資訊,然後機器做出動作并跳轉到另一個狀态。例如:水(目前狀态)------->加熱(輸入資訊)------->水蒸氣(跳轉的另一個狀态)

是以狀态改變需要考慮兩個因素:<1>目前狀态 <2>外部輸入

2.兩種狀态機模型:more型和mealy型

  more型狀态機的特點是:輸出狀态隻和目前狀态有關(與輸入信号無關)。就好比0和1互斥的關系,狀态隻能在0和1之間轉換,從0狀态隻能變到1狀态。

  mealy型狀态機的特點是:輸出狀态不僅和輸入狀态有關,還和輸入信号有關(不同的激勵有不同的結果)。狀态機會綜合考慮目前狀态和輸入信号兩個條件來決定接下來的輸出狀态。

3.狀态機解決了什麼問題?

  我們寫的程式大都是順序執行的,但是外部不一定會按照既定的流程來給程式輸入資訊,而程式還需要完全能夠接收并響應外部的這些輸入信号,還要做出準确的相應動作。

4.狀态機設計核心思路

  在正确的狀态下執行正确的操作,狀态會向前推進。

二.使用狀态機思路實作密碼輸入

1.設計要求

  密碼為123456,必須連續正确輸入123456六個數才會解鎖成功,中途出錯就會恢複到起始狀态。

2.設計思路分析

  這裡使用狀态機來實作,也就是一共有STATE0------->STATE6七個狀态,初始狀态為STATE0,在目前狀态下輸入正确則推動狀态跳轉到下一個狀态,目前狀态下輸入錯誤則恢複到STATE0狀态。狀态機設計核心要點:目前狀态+驅動條件。也就是必須在正确的狀态下有正确的輸入才會跳轉到下一個狀态。當狀态條狀到STATE6表示密碼輸入正确。

3.c語言代碼實作

#include<stdio.h>
/*
狀态機實作密碼輸入
要求:密碼為123456,必須連續輸入正确123456六個數才會解鎖成功,中途出錯就會恢複到起始狀态。
這裡使用狀态機來實作,也就是一共有STATE0------->STATE6七個狀态,初始狀态為STATE0,在目前狀态下輸入正确則推動狀态跳轉到下一個狀态,
目前狀态下輸入錯誤則恢複到STATE0狀态。
狀态機設計核心要點:目前狀态+驅動條件。也就是必須在正确的狀态下有正确的輸入才會跳轉到下一個狀态。
*/

//定義狀态枚舉
typedef enum
{
	STATE0,
	STATE1,
	STATE2,
	STATE3,
	STATE4,
	STATE5,
	STATE6
}state;

int main(int argc,char *argv[])
{
	int num = 0;
	state current_state = STATE0;       //定義目前狀态為初始狀态STATE0
	while(1)
	{
		switch(current_state)
		{
			case STATE0:     //設計核心1:目前狀态
				scanf("%d",&num);
				if(num == 1) //設計核心2:目前狀态下的驅動條件成立
				{
					current_state = STATE1;  //輸入條件成立,跳轉到下一狀态
				}
				else{
					current_state = STATE0;  //輸入條件不成立,恢複初始狀态
				}
			break;
			case STATE1:     //核心1:目前狀态
				scanf("%d",&num);
				if(num == 2) //核心2:目前狀态下的驅動條件成立
				{
					current_state = STATE2;  //輸入條件成立,跳轉到下一狀态
				}
				else{
					current_state = STATE0;  //輸入條件不成立,恢複初始狀态
				}
			break;
			case STATE2:     //核心1:目前狀态
				scanf("%d",&num);
				if(num == 3) //核心2:目前狀态下的驅動條件成立
				{
					current_state = STATE3;  //輸入條件成立,跳轉到下一狀态
				}
				else{
					current_state = STATE0;  //輸入條件不成立,恢複初始狀态
				}
			break;			
			case STATE3:     //核心1:目前狀态
				scanf("%d",&num);
				if(num == 4) //核心2:目前狀态下的驅動條件成立
				{
					current_state = STATE4;  //輸入條件成立,跳轉到下一狀态
				}
				else{
					current_state = STATE0;  //輸入條件不成立,恢複初始狀态
				}
			break;	
			case STATE4:     //核心1:目前狀态
				scanf("%d",&num);
				if(num == 5) //核心2:目前狀态下的驅動條件成立
				{
					current_state = STATE5;  //輸入條件成立,跳轉到下一狀态
				}
				else{
					current_state = STATE0;  //輸入條件不成立,恢複初始狀态
				}
			break;	
			case STATE5:     //核心1:目前狀态
				scanf("%d",&num);
				if(num == 6) //核心2:目前狀态下的驅動條件成立
				{
					current_state = STATE6;  //輸入條件成立,跳轉到下一狀态
				}
				else{
					current_state = STATE0;  //輸入條件不成立,恢複初始狀态
				}
			break;
			default:break;
		}
		//每次輸完判斷狀态是否跳轉到STATE6
		if(current_state == STATE6)
		{
			printf("密碼輸入正确,開鎖成功\r\n");
			break;
		}
	}
	return 0;
}
           

4.測試結果:

43
4
31
1
2
3
43
1
2
3
4
5
6
密碼輸入正确,開鎖成功
           

可以看出必須連續輸入123456正确才能開鎖成功。

三.總結

  狀态機設計記住兩個核心要點:目前狀态+輸入條件。隻有狀态和輸入條件比對才會推動狀态機跳轉到下一狀态。抓住這一設計思想狀态機就真正了解了。

繼續閱讀