一、狀態機要素
可以把狀態機的要素分為4個要素,即:現態、條件、動作、次態,
“現態”和“條件”是因,“動作”和“次態”是果,
(1)現態:是指當前所處狀態;
(2)條件:又稱為“事件”,當條件被滿足時,將會觸發一個動作,或者執行一次狀態的遷移,
(3)動作:條件滿足后執行的動作,動作不是必須的,當條件滿足后,也可以不執行任何動作,直接遷移到新狀態,
(4)次態:條件滿足后要遷移往的新狀態,“次態”是相對于“現態”而言的,“次態”一旦被激活,就轉變成新的“現態”了,
二、狀態遷移圖(STD)

(1)狀態框:用方框表示狀態,包括所謂的“現態”和“次態”;
(2)條件及遷移箭頭:用箭頭表示狀態遷移的方向,并在該箭頭上標注觸發條件;
(3)節點圓圈:當多個箭頭指向一個狀態時,可以用節點符號(小圓圈)連接匯總;
(4)動作框:用橢圓框表示;
(5)附加條件判斷框:用六角菱形框表示;
三、狀態遷移表

四、用狀態機思路實作一個時鐘程式
首先我們畫出他的狀態遷移圖:

然后我們畫出狀態遷移表:

五、狀態機應用注意事項:
注意使用狀態機的時候不要出現兩種錯誤:1、“偽態”2、“漏態”
(1)“偽態”:把某個“程式動作”當成一種“狀態”來處理,
(2)“漏態”:在狀態劃分時漏掉一些狀態,
PS:
區分狀態和偽態:(看兩者的本質)
“動作”是不穩定的,即使沒有條件的觸發,“動作”一旦執行完畢就結束了;
“狀態”是相對穩定的,如果沒有外部條件的觸發,一個狀態會一直持續下去,
六、更復雜的狀態機
前面介紹的是一種簡單的狀態結構,它只有一級,并且只有一維,它的結構圖如下所示:

如果有必要,我們可以建立更復雜的狀態機模型,如:
1、多級狀態結構,
狀態機可以是多級的,在分層的多級狀態機系統里面,一個“父狀態”下可以劃分多個“子狀態”,這些子狀態共同擁有上級父狀態的某些共性,同時又各自擁有自己的一些個性,

2、多維狀態結構,
狀態機也可以是多維的,從不同的角度對系統進行狀態的劃分,這些狀態的某些特性是交叉的,比如,在按照按鍵和顯示劃分狀態的同時,又按照系統的作業行程做出另一種狀態劃分,這兩種狀態劃分同時存在,相互交叉,從而構成了二維的狀態結構空間,

說明一下,每一維的狀態都需要用一個狀態變數(暫存器)來表示,
最后我想說一下:不管是什么樣子的程式寫成狀態機,只有一個原則,那就是簡單的才是最有效的!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/527.html
標籤:其他
