一個保險箱上裝了一個復合鎖.鎖有3個位置,分別標記為1、2、3,轉盤可向左(L)或向右(R)轉動。這樣,在任意時刻轉盤都有6種可能的運動,即1L.1R.2L.2R,3L和3R.保險箱的組合密碼是IL.3R、2L,轉盤的任何其他運動都將引起報警。圖4.1描繪了保險箱的狀態轉換情況。有一個初始態.即保險箱鎖定狀態。若輸人為1L.則下一個狀態為A,但是,若輸入不是1L而是轉盤的任何其他移動,則下一個狀態為“報警”.報警是兩個終態之一(另一個終態是“保險箱解鎖")。如果選擇了轉盤移動的正確組合,則保險箱狀態轉換的序列為從保險箱鎖定到A再到B,最后到保險箱解鎖,即另外一個終態。圖4.1是一個有窮狀態機的狀態轉換圖。狀態轉換并不一定要用圖形方式描述,表4.1的表格形式也可以表達同樣的資訊。除了兩個終態之外,保險箱的其他狀態將根據轉盤的轉動方式轉換到下一個狀態。


uj5u.com熱心網友回復:
狀態轉換表都有了,用C語言做成表。然后,初始化初始狀態,
主回圈查表,
到終態回傳,就行了。
uj5u.com熱心網友回復:
沒怎么測驗,你看看吧,希望有幫助。
#include <stdio.h>
#include <stdlib.h>
typedef enum
{
KEY_ACT_1L = 0,
KEY_ACT_1R,
KEY_ACT_2L,
KEY_ACT_2R,
KEY_ACT_3L,
KEY_ACT_3R,
KEY_ACT_MAX
}eKEY_ACT;
typedef enum
{
LOCK_STS_LOCKED = 0,
LOCK_STS_KEY_A_IN,
LOCK_STS_KEY_B_IN,
LOCK_STS_ALARM,
LOCK_STS_UNLOCK,
LOCK_STS_MAX
}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] =
{
"LOCK_STS_LOCKED",
"LOCK_STS_KEY_A_IN",
"LOCK_STS_KEY_B_IN",
"LOCK_STS_ALARM",
"LOCK_STS_UNLOCK",
};
static const char* scpKEY_ACT_str[KEY_ACT_MAX] =
{
"KEY_ACT_1L",
"KEY_ACT_1R",
"KEY_ACT_2L",
"KEY_ACT_2R",
"KEY_ACT_3L",
"KEY_ACT_3R",
};
static const eLOCK_STATUS stMODE_TBL[6][3] =
{
{ LOCK_STS_KEY_A_IN, LOCK_STS_ALARM, LOCK_STS_ALARM },
{ LOCK_STS_ALARM, LOCK_STS_ALARM, LOCK_STS_ALARM },
{ LOCK_STS_ALARM, LOCK_STS_ALARM, LOCK_STS_UNLOCK },
{ LOCK_STS_ALARM, LOCK_STS_ALARM, LOCK_STS_ALARM },
{ LOCK_STS_ALARM, LOCK_STS_ALARM, LOCK_STS_ALARM },
{ LOCK_STS_ALARM, LOCK_STS_KEY_B_IN, LOCK_STS_ALARM }
};
int main( int argc, char* argv[] )
{
eLOCK_STATUS curr_mode = LOCK_STS_LOCKED;
eKEY_ACT e_act;
eLOCK_STATUS next_mode;
int cnt = 0, input_num;
while ( 1 )
{
do
{
PTR( "\nPlease input No. of the password as the following: " );
for ( cnt = 0; cnt < KEY_ACT_MAX; cnt++ )
{
PTR( "\n No.%01d %s ", cnt + 1, eGET_ACT_STR( cnt ) );
}
PTR("\n" );
scanf_s("%d", &input_num );
if ( (input_num <= 0) || (input_num > KEY_ACT_MAX) )
{
e_act = KEY_ACT_MAX;
PTR( "\n Your input is wrong!" );
}
else
{
e_act = (eKEY_ACT)(input_num - 1);
PTR( "\n Your input is right!" );
}
} 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)
{
PTR("\n Are you a pig?" );
break;
}
else if ( next_mode == LOCK_STS_UNLOCK )
{
PTR( "\n You are very clever." );
break;
}
else if ( next_mode >= LOCK_STS_ALARM )
{
PTR( "\n This is a bug." );
break;
}
else
{
/* Nothing to do */
}
curr_mode = next_mode;
};
return 0;
}
uj5u.com熱心網友回復:
感謝感謝,謝謝大佬
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/84695.html
標籤:C語言
下一篇:C++測驗題,求救,急急急!!!
