狀態機之C 解析

2021-05-22 14:00:28 字數 1809 閱讀 2691

一、狀態機描述

狀態機理論最初的發展在數位電路設計領域。在數位電路方面,根據輸出是否與輸入訊號有關,狀態機可以劃分為mealy型和moore型狀態機;根據輸出是否與輸入訊號同步,狀態機可以劃分為非同步和同步狀態機。而在軟體設計領域,狀態機設計的理論儼然已經自成一體。moore型狀態機的輸出只和當前狀態有關,和輸入無關,如果在軟體設計領域設計出這種型別的狀態機,則該狀態機接受的事件都是無內蘊資訊的事件(輸入)。mealy型狀態機的輸入是由當前狀態和輸入共同決定,對應到軟體設計領域,則該狀態機接收的事件含有內蘊資訊,並且影響狀態機的輸出。顯然,這種劃分在軟體設計領域毫無意義。雖然軟體設計領域的狀態機也有同步和非同步的劃分,但和數位電路方面的同步非同步已經不同。

除了《數位電路》,涉及到狀態機的課程就是《編譯原理》了(本人屬計算機專業,其它專業是否涉及到狀態機就不清楚了)。下面簡單回顧一下《編譯原理》裡有關有限狀態機的描述。在編譯原理課程裡面,對有限狀態機的描述僅限在編譯領域,特定狀態,針對輸入字元,發生狀態改變,沒有額外的行為,另編譯原理裡有限狀態機的構成要素,還包含唯一的初始狀態和乙個終態集。數學語言描述如下:乙個有限狀態機m是乙個五元組,m=(k,e,t,s,z)。其中(1)k是乙個有窮集,其中的每個元素稱為狀態(2)e是乙個有窮字母表,它的每個元素稱為乙個輸入字元(3)t是轉換函式,是k×e->k上的對映(4)s是k中的元素,是唯一的乙個初態(5) z是k的乙個子集,是乙個終態集,或者叫結束集。很明顯,狀態機在編譯原理裡的講解已經特化,輸入被定位為字符集,狀態改變的時候沒有額外動作發生。

與編譯原理中的狀態機不同,軟體設計領域中通用狀態機的輸入不是字符集,而是被稱作事件的結構(可以是結構體,也可以是類物件),並且特定的狀態下,針對發生的事件,不僅發生狀態改變,而且產生動作。借鑑編譯原理中狀態機的初始狀態和終態,通用狀態機的數學語言描述如下:乙個通用有限狀態機m是乙個七元組,m=。其中(1)k是乙個有窮集,其中的每個元素稱為狀態(2)e是乙個有窮集,它的每個元素稱為乙個事件(3)t是轉換函式,是k×e->k上的對映(4)m是乙個有窮集,它的每個元素稱為動作(5)f是動作對映函式,是k×e->m上的對映(6)s是k中的元素,是唯一的乙個初態(7) z是k的乙個子集,是乙個終態集,或者叫結束集。實用的狀態機可以做進一步的優化,首先,可以把 (3)(5)整合在一起,做乙個k×e->的對映,其次從實用性的角度出發,禁止狀態接收空事件(無輸入的情況下,狀態發生改變),作為彌補,為每個狀態增加進入動作和離開動作,第三,鑑於定時器在系統中,尤其是在狀態機中的重要性,可以為每個狀態增加定時器以及超時後的狀態轉換。本文後面的講述以及實現暫不考慮把定時器特化,如果需要,可以在狀態的進入動作中初始化定時器(另:關於定時器,以後會寫文章《系統設計之 定時器》)。

二、狀態機分類(後文中如無特別說明,則狀態機指軟體設計領域的通用有限狀態機)

依據狀態之間是否有包含關係,分以下兩種

(1)常規狀態機。狀態機中的所有狀態是不相交的、互斥的。

(2)層次狀態機。狀態機中的狀態之間要麼是互斥的,要麼是真包含的,可以用樹性結構來描述這些狀態集,包含其它狀態的狀態稱為枝節點,不包含其它狀態的狀態稱為葉節點,為方便單樹描述,總是設計乙個狀態包含所有的狀態節點,稱為根節點。狀態機的狀態只能停留在葉節點,而不能停留在枝節點,每個枝節點需要指定乙個子節點為它的預設子節點,以便狀態機進入枝節點的時候能夠停留到葉節點。

三、狀態機實現

(1)switch/case if/else方式實現。用於少量狀態(3個及其以下)的時候,不需要引入專門的狀態機模組。這種方式不能編寫通用的狀態機模組,不再多說。

(2)面向過程方式:巨集是實現面向過程方式的通用方式。雖然在狀態機層面還是可以用物件導向的方式封裝,這裡還是把它稱為面向過程的方式。

1.常規狀態機模組實現。這個狀態機涉及到機構由上而下為:

狀態機的演算法是由狀態機的結構決定的。實現如下:

狀態機之C 解析

一 狀態機描述 狀態機理論最初的發展在數位電路設計領域。在數位電路方面,根據輸出是否與輸入訊號有關,狀態機可以劃分為mealy型和moore型狀態機 根據輸出是否與輸入訊號同步,狀態機可以劃分為非同步和同步狀態機。而在軟體設計領域,狀態機設計的理論儼然已經自成一體。moore型狀態機的輸出只和當前狀...

狀態機 狀態機0

近半年都忙於做專案,沒有太多的時間去整理和總結在專案中用過的技術 個人還是覺得技術需要總結提煉和沉澱的,忙到沒時間去總結提公升其實不 是什麼好事,這次講下狀態機,在戰鬥型別的遊戲中角色有多種不同的狀態,而狀態的切換錯綜複雜,23種設計模式中有一種模式叫做狀態模式,不過 這種模式是把狀態切換條件放到各...

python 狀態機 Python 狀態機

class statemachine def init self self.handlers 狀態轉移函式字典 self.startstate none 初始狀態 self.endstate 最終狀態集合 引數name為狀態名,handler為狀態轉移函式,end state表明是否為最終狀態 de...