Linux C 程式設計技巧 利用有限狀態機模型程式設計

2021-07-08 18:01:24 字數 3529 閱讀 8825

我們知道,一般編寫程式時都要畫出流程圖,按照流程圖結構來程式設計,如果編寫乙個比較繁瑣,容易思維混亂的程式時,我們可以利用有限狀態機模型畫出乙個狀態轉移圖,這樣便可以利用畫出的邏輯圖來編寫程式,簡潔且不易出錯。

有限狀態機,(英語:finite-state machine, fsm),又稱有限狀態自動機,簡稱狀態機,是表示有限個狀態以及在這些狀態之間的轉移和動作等行為的數學模型。

常見的計算機就是使用有限狀態機作為計算模型的:對於記憶體的不同狀態,cpu通過讀取記憶體值進行計算,更新記憶體中的狀態。cpu還通過訊息匯流排接受外部輸入裝置(如鍵盤、滑鼠)的指令,計算後更改記憶體中的狀態,計算結果輸出到外部顯示裝置(如顯示器),以及持久化儲存在硬碟。

電腦遊戲設計中也經常使用有限狀態機模型。以水果忍者遊戲為例,遊戲中水果的狀態是有限狀態,其執行軌跡是由模擬物理運動規律的計算公式運算而成的,乙個香蕉拋起來後會按照拋物線執行,其每一幀位置變化都是乙個狀態的改變,狀態改變通過計算公式來決定。當然作為遊戲不會僅僅這麼簡單,如果這麼簡單就是動畫了,遊戲還有複雜的人機互動事件,比如用手在螢幕上「切」了水果,水果感知到這個事件後,會按照程式邏輯進入**狀態。

簡單知道其定義是沒有用的,在c程式設計中我們改如何應用呢?

例題1:去除乙個字串中連續的空格,即 h__el___lo 變成 h_el_lo;

我們拿到這道題時,可能會想到用getchar()依次取字元,當遇到空格時,繼續下乙個字元是否為空格,如果是則刪除,如果不是則繼續;那麼問題來了,如果空格後面還有空格呢?如果還有很多空格呢?如果還有其他要求呢?這樣很容易造成思維混亂,所以這時我們可以用到有限狀態機模型,好像這樣說很模糊啊,該怎麼使用呢?利用這種方式,最後的就是利用好flag,即識別符號;這樣吧,我們來畫一下這個模型:

這樣看好像有點抽象,我來解釋一下:

狀態0  (flag = 1)若當前字元是空格,輸出並跳轉到狀態1(flag = 1),如果是非空格,則列印字元;

狀態1  (flag = 1) 若當前字元為非空格,則輸出並跳轉到狀態0,若是空格,則不列印;

下面幾個例題我盡量寫得清楚;

我們按照這種邏輯來寫程式,看看是不是比較方便,**如下:

#include int main(int argc, char *argv)

} return 0;

}

程式執行結果如下:

fs@ubuntu:~/qiang/char1$ gcc -o test test.c 

fs@ubuntu:~/qiang/char1$ ./test

h el lo

h el lo

效果很明顯;

上面的例題還算簡單吧,好像不用這個模型也可以是吧,那好,我們再來一題

例題2:除連續的空格但字串中的連續空格不變,比如h_ _el__"wor___ld"___lo;

}執行結果如下:

fs@ubuntu:~/qiang/char1$ ./char3

h el "wor ld" lo

h el "wor ld" lo

來個實際點的問題:

例題3::除單行注釋

示例程式:

/*****this is a program!*****/

#include int main()

將這段程式中的單行注釋去掉,繼續畫圖:

編寫程式如下:

#include int main(void)

else

break;

case 2:

if(ch == '\n')

break;

default:

break;

} }}

執行命令:

fs@ubuntu:~/qiang/char1$ ./quzhushi1 < test.c >result.c
注意命令中用到的重定向,將test.c檔案重定向到quzhushi1 中,輸出結果重定向到 result.c中

可檢視result.c中:

/*****this is a program!*****/

#include int main()

單行注釋被刪除。

例題4:去除單行注釋和多行注釋

還是這個測試程式:

/*****this is a program!*****/

#include int main()

好吧,繼續畫圖,圖上比較抽象,大家可以自己思考一下

這次比較複雜,要有5個識別符號

測試**如下:

#include int main()

break;

case 2:

if(ch == '\n')

break;

case 3:

if(ch == '*')

flag = 4;

break;

case 4:

if(ch == '/')

flag = 0;

else

flag = 3;

break;

} }}

執行命令:

fs@ubuntu:~/qiang/char1$ ./quzhushi < test.c >result.c
執行結果:

result.c

#include int main()

大家可以比較畫的圖與所寫程式,這種方法可以使我們編寫程式時有個很好的思路!

有限狀態機

有限狀態機 finite state machine,fsm 又稱有限狀態自動機,簡稱狀態機,是表示有限個狀態以及在這些狀態之間的轉移和動作等行為的數學模型。狀態儲存關於過去的資訊,就是說 它反映從系統開始到現在時刻的輸入變化。轉移指示狀態變更,並且用必須滿足來確使轉移發生的條件來描述它。動作是在給...

有限狀態機

以前,只碰到過 陣列中所有數字只出現2次,只有乙個出現1次,找這個數的問題 每次迴圈異或陣列中元素,最後的結果就是single one。這次換作出現3次就懵逼了,主要原因,沒有使用過有限狀態機,應該說是連概念都沒有,所以這次一定要好好記錄一下 關於這道題的解釋discussion中woshidais...

有限狀態機

需要掌握的名詞 數字系統有兩大類有限狀態機 finite state machine,fsm moore狀態機和mealy狀態機。狀態機名 次態輸出 moore摩爾 f 現狀,輸入 g 現狀 mealy公尺粒 f 現狀,輸入 g 現狀,輸入 mealy型狀態機 下一狀態不但與當前狀態有關,還與當前輸...