看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《xm3vul3h06 (蠶哥)》之銘言: : http://codepad.org/a8hUjOKQ 恕刪,先補上原問題圖檔 http://0rz.tw/F4Dww 這裡大概敘述一下,如果我不知道那本是通訊之類的書 我會以為那是本較特別 C 語言的書,我看到敘述的想法是:FSM (可能我走火入魔了) -------- 一開始先定義 enum state, typedef enum tagState{a, b, c, d}State; 會用 enum 是用到,其實裡面的 a, b, c, d,到時候全都當 0, 1, 2, 3 去運算。 再來是編解碼方式,輸出部份我用的比較特別,給一個 table char out_table[][3] = {"00", "11", "10", "01", "11", "00", "01", "10"}; out_table[0] 代表狀態 a(a=0), 輸入 0 之輸出 out_table[1] 代表狀態 a(a=0), 輸入 1 之輸出 out_table[2] 代表狀態 b(b=1), 輸入 0 之輸出 out_table[3] 代表狀態 b(b=1), 輸入 1 之輸出 依此類推 於是根據狀態與輸入,可得到輸出: printf("%s ", out_table[state*2 + (*ptr-'0')]); --------- 再來是狀態轉移,這裡分輸入是 0 與輸入是 1 時做轉移 State Zero_Trans[] = {a, c, a, c}; State One_Trans[] = {b, d, b, d}; 這部份事實上也可以用一個轉移表就完成,程式碼也會較精簡 --------- 出來的碼參考如下 #include <stdio.h> typedef enum tagState{a, b, c, d}State; int main() { char input[] = "110111001000"; char *ptr=input; char out_table[][3] = {"00", "11", "10", "01", "11", "00", "01", "10"}; State Trans[] = {a, b, c, d, a, b, c, d}; State state=a; while(*ptr){ printf("%s ", out_table[state*2 + (*ptr-'0')]); state = Trans[state*2 + (*ptr - '0')]; ++ptr; } return 0; } ------ 好的 FSM 當然不如上所述,會用到一些 function pointer array, 但這裡的 action 只是簡單的字串輸出, 故直接用 char array of array 取代。 好奇 bleed 大所用之三維陣列意指如何。 以上淺見, 歡迎賜教。 -- YouLoveMe() ? LetItBe() : LetMeFree(); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.73.222 ※ 編輯: tropical72 來自: 180.177.73.222 (07/02 06:04)
bleed1979:http://pastie.org/2152893 輸出沒問題,但不保證對。 07/02 10:39
bleed1979:http://codepad.org/F9GNy22f 再加一連結備份。 07/02 10:41
tropical72:謝謝 :) 07/02 13:39
leeyinf:BTW.迴旋碼是不是就是一般指的Gary code格雷碼??? 07/02 14:55
xm3vul3h06:都好厲害阿~"~ 請問我這種寫程式的方法縱使結果對到外 07/02 21:56
xm3vul3h06:面會不會無法被接受:(?? 07/02 21:57
tropical72:我想問,除了你有版友可以接受嗎 XD 07/03 00:56
james732:只要不管多少時間,你還是看得懂這段程式,就不算太糟XDD 07/03 00:57
xm3vul3h06:所以在外界 寫程式不只要結果 還要別人看得懂@@? 07/03 01:22
james732:除非這段程式碼永遠不需要修改與維護,那沒人看懂也沒差 07/03 01:26
loveme00835:寫程式跟寫文章一樣 07/03 01:53
tropical72:別人看不懂有三種:演算法不會,變數亂命名,莫名一段code 07/03 01:55
tropical72:文件說明,註解,變數命名應是最基礎的,你應只少了說明. 07/03 01:56