昨天在論壇看到了一關於狀態遷移的帖子,心血來潮,寫了乙個c語言的實現。
【題目】
乙個保險箱上裝了乙個復合鎖.鎖有3個位置,分別標記為1、2、3,轉盤可向左(l)或向右(r)轉動。這樣,在任意時刻轉盤都有6種可能的運動,即1l.1r.2l.2r,3l和3r.保險箱的組合密碼是il.3r、2l,轉盤的任何其他運動都將引起報警。圖4.1描繪了保險箱的狀態轉換情況。有乙個初始態.即保險箱鎖定狀態。若輸人為1l.則下乙個狀態為a,但是,若輸入不是1l而是轉盤的任何其他移動,則下乙個狀態為「報警」.報警是兩個終態之一(另乙個終態是「保險箱解鎖")。如果選擇了轉盤移動的正確組合,則保險箱狀態轉換的序列為從保險箱鎖定到a再到b,最後到保險箱解鎖,即另外乙個終態。
【實現】
c實現語言如下,在vs2019除錯通過。
#include #include typedef enum
ekey_act;
typedef enum
elock_status;
#define eget_act_str( idx ) scpkey_act_str[ ( idx ) ]
#define eget_lock_str( idx ) scplock_sts_str[ ( idx ) ]
#define eget_next_mode( currmode, act ) stmode_tbl[ act ][ currmode ]
#define ptr printf_s
static const char *scplock_sts_str [lock_sts_max] =
;static const char* scpkey_act_str[key_act_max] =
;static const elock_status stmode_tbl[6][3] =
, ,,,
,};int main( int argc, char* ar** )
ptr("\n" );
scanf_s("%d", &input_num );
if ( (input_num <= 0) || (input_num > key_act_max) )
else
} while ( e_act == key_act_max );
next_mode = eget_next_mode ( curr_mode, e_act );
ptr("\ncurr = [%s] act = [%s] nextmode= [%s] ",
eget_lock_str( curr_mode ),
eget_act_str( e_act ),
eget_lock_str( next_mode )
);if ( next_mode == lock_sts_alarm)
else if ( next_mode == lock_sts_unlock )
else if ( next_mode >= lock_sts_alarm )
else
curr_mode = next_mode;
};return 0;
}
HTTP協議的C語言程式設計實現例項
客戶程式發起連線請求 if connect sockfd,struct sockaddr server addr sizeof struct sockaddr 1 連線 printf s request 準備request,將要傳送給主機 取得真實的檔名 if host file host file...
HTTP協議的C語言程式設計實現例項
http客戶端程式 httpclient.c include include include include include include include include include include include include 開始 功能 搜尋字串右邊起的第乙個匹配字元 char rstr...
C語言實現狀態機
狀態機有4個要素 舉例 state1是現態,state2是次態,event是條件,action是動作。當產生event時,觸發action,action執行完畢後從state1遷移到state2,此時,state2為現態。在這個例子中,action只是乙個瞬時執行的動作,它只在現態遷移到次態的過程中...