狀態機及其應用

2021-10-10 03:39:18 字數 3360 閱讀 3080

三、使用狀態機解決單詞解析問題

總結我們在看程式設計資料或者程式設計文件時,經常碰見的乙個詞就是狀態機,狀態機是什麼?包含什麼基本概念?在日常工作中,我們如何應用狀態機模型解決實際程式設計問題?本文將一一進行解答,並給出乙個使用狀態機解析單詞個數的c語言例子,該例子的目的是從輸入流中解析出英文單詞的個數。

狀態機一般指的是有限狀態機(finite-state machine, fsm),又稱有限狀態自動機,是表示有限個狀態以及在這些狀態之間的轉移和動作等行為的數學模型。它是一種用來進行物件行為建模的工具,通常使用狀態表或狀態圖來表示。相比於程式流程圖和時序圖,狀態圖表現更加直觀,非常通俗易懂,即使是非程式設計技術人員,也能一目了然。

指狀態機當前所處的狀態。 條件,又稱「事件」,當乙個條件被滿足,將會觸發乙個動作或執行一次狀態遷移。 條件滿足後執行的動作。動作執行完後,狀態可以遷移到下乙個狀態,也可以繼續保持當前狀態。動作並不是必須的,當條件滿足時,可以不執行動作,狀態也可以遷移到下乙個狀態。 當條件滿足後,遷移到的新狀態。當狀態遷移到新狀態後,新狀態即變成現態。「次態」是相對於「現態」而言的。

題目:給定乙個字元流,使用狀態機技術解析其中包含的單詞個數,劃分單詞的分隔符只考慮【逗號】【句號】【空格】,實現獲取單詞個數介面:int32_t get_word_count(const char* input)。

(1)init:單詞解析工作的初始化狀態。

(2)in_word:當前處理的字元不屬於分隔符,則進入單詞狀態,表示當前處於乙個單詞當中。

(3)out_word:當前處理的字元屬於分隔符,則進入非單詞狀態,表示在單詞之外.

(4)final:當處理達到字元流結束,則進入結束狀態,表示單詞解析工作結束。

1、not_separation:當讀取到的字元不是分隔符,如果當前狀態是【in_word】將保持在【in_word】;如果當前狀態是【init】或【out_word】則進入【in_word】狀態。

2、separation:當讀取到分隔字元時,如果當前狀態是【out_word】,將保持在【out_word】;如果當前狀態是【init】或【in_word】則進入【out_word】狀態。 3、stop:當到達字元流結束位置時,進入狀態【final】,解析工作結束。 1、狀態從【init】轉移到【in_word】,單詞個數加一;

2、狀態從【out_word】轉移到【in_word】,單詞個數加一;

3、狀態轉移到【final】,返回單詞個數,解析工作結束。 下面是自己畫的一張極醜的狀態圖,狀態圖中沒有畫從init 到final的線。

//動作前輸入單詞統計個數,動作後返回處理後的單詞個數

typedef int32_t (

*action_t)

(int32_t word_count)

;typedef

struct _state_transformation_t state_transformation_t;

typedef

struct _state_machine_t state_machine_t;

static state_transformation_t*

find_transformation

(const state_machine_t* state_machine,

const event_t event)

for(

int i =

0; i < state_machine->transformation_count; i++)}

return

null;}

static int32_t count_add_one

(int32_t currrent_word_count)

int32_t count_not_change

(int32_t currrent_word_count)

static event_t current_event

(const

char

* one_char)

;char final_char =

'\0';if

(one_char == final_char)

for(

int i =

0; i <

sizeof

(separate_char)

; i++)}

return not_separation;

}static int32_t get_word_count_ext

(state_machine_t* state_machine,

const

char

* words)

state_machine->state = state_transformation->next_state;

action_t action = state_transformation->action;

if(action !=

null

) one_char = one_char++;}

return word_count;

}int32_t get_word_count

(const

char

* input),,

,,,,

,,,}

;//初始化狀態機

state_machine_t word_statistic_state_machine;

word_statistic_state_machine.state = init;

word_statistic_state_machine.transformation_count =

sizeof

(state_transformation_array)

/sizeof

(state_transformation_t)

; word_statistic_state_machine.transformation_array = state_transformation_array;

return

get_word_count_ext

(&word_statistic_state_machine, input);}

intmain

(int argc,

char

* ar**)

執行輸出:

狀態機 狀態機0

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

python 狀態機 Python 狀態機

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

狀態機小記

工作上有個功能模組用到了類似狀態機的東東,於是上網科普了一番。狀態機是由一系列輸入驅動,然後系統由其中一種狀態轉換為另一種狀態並產生某種輸出,這樣子的乙個系統叫做狀態機。狀態機分為兩種,一種是輸出只和系統狀態有關,叫做摩爾狀態機,另一種是輸出和輸入以及系統狀態都相關,叫做公尺莉狀態機。有關輸入 狀態...