狀態機c語言編程
『壹』 c語言程序設計例如一個信息管理系統(同時保存輸入的信息),如何在完成子版塊後返回到菜單
同鞋,你的描述讓我有點懵逼,不過今天調bug比較郁悶,換換頭腦嘗試解答一下看的懂的部分……
關於return 和 exit 的區別:
exit是一個系統函數,功能是退出當前進程。return 是一個關鍵字,配合函數使用,代表返回,並不一定是退出。
你描述返回主菜單的意思,讓人無法理解,但是菜單之間的切換方法很多,最常見的方法是使用狀態機,具體可以網路搜索一下相關知識。
這里簡單的給個偽代碼:
enumMENU_ITEM
{
EXIT=0,
MAIN,
ITEM1,
ITEM2
};
MENU_ITEMmenu()
{
//一些邏輯
...
//跳轉到1
returnITEM2;
}
MENU_ITEMmenu1()
{
//一些邏輯
...
//跳轉到主菜單
returnMAIN;
}
MENU_ITEMmenu2()
{
//一些邏輯
...
//退出
returnEXIT;
}
voidmain()
{
MENU_ITEMchoose=EXIT;
scanf("%d",&choose);
while(choose)
{
caseMAIN:
//輸出主菜單
choose=menu();
break;
caseITEM1:
//輸出功能1
choose=menu1();
break;
caseITEM2:
//輸出功能2
choose=menu2();
break;
}
}
『貳』 如何用c語言實現:a,b,c三個事件,依次進行,每到a時就執行事件1,再到b,再執行事件1,再c,再事件1.
典型的狀態機結構,可以去網上找找有關的資料,大概的結構像這樣
enum { state_A, state_B, state_C } state = state_A;
while(1)
{
switch ( state )
{
case state_A:
if ( event_A ) // 這里也可以用switch
{
action_1(); // 在某狀態下發生某事件執行某個動作,並轉入下個狀態
state = state_B;
}
else if ( event_B )
{
}
else
{
}
break;
case state_B:
... ...
}
}
根據你的問題補充,可以這樣劃分狀態
准備輪詢1號機,等待1號機應答(已經輪詢1號機,但1號機未應答),准備輪詢2號機,等待2號機應答,准備輪詢3號機,等待3號機應答,
或者分成3個狀態加一個標志,
輪詢1號機,輪詢2號機,輪詢3號機,加一個有無應答標志,
其實這兩種分法沒有本質區別。
程序框架大概的樣子是這樣
switch ( state )
case 准備輪詢1號機:
發送輪詢1號機的命令
state = 等待1號機的應答;
break;
case 等待1號機的應答;
判斷1號機的應答狀態,可能是正確、錯誤、超時,分別處理,並設置狀態
正確:
state = 准備輪詢2號機
錯誤:
state = 准備輪詢1號機,重試
超時:
state = 准備輪詢1號機,重試,具體做什麼可以很靈活
『叄』 C語言作業C/C++數學詞法分析器。最好是用狀態機做的,沒有也沒關系,我給出狀態機的圖,和分析器的線路圖
我記得有個神奇的東西叫做bison&flex
嘛……只是這么一說你可以自己慢慢研究……
用來做作業好像不太道德啊=w=
『肆』 用單片機C語言怎麼寫用狀態機實現按鍵控制LED燈閃爍這個程序
#include<STC12C52.H>
#defineucharunsignedchar
#defineuintunsignedint
sbitkey=P1^2;
sbitp1_6=P1^6;
voiddelay(uchardelay_time)
{
ucharn;
uintm;
for(n=0;n<delay_time;n++)
{
for(m=0;m<10000;m++);
}
}
voidkeyscan()
{
if(key==0)
{
delay(5);
if(key==0)
while(!key)
{
p1_6=0;
delay(20);
p1_6=1;
delay(20);
}
}
}
voidmain()
{
WDT_CONTR=0x3C;
while(1)
{
keyscan();
WDT_CONTR=0x3C;
}
}
這個功能可以用中斷來實現,當然,現在我寫的這個也可以實現。由於你用的晶振頻率不知道,所以你自己修改一下延時時間,再把頭文件改一下,就可以了,我試驗了,可以實現改功能。
『伍』 C語言狀態機 swtich 按鍵切換問題。連鍵
如果想它停止繼續判斷,在要停止的語句後面加一個break就行了
『陸』 怎麼用c語言寫狀態機呀請舉例說明
c語言寫狀態機之前:
1、確定一共有多少種狀態,這里的狀態有開和關,細分還有say thankyou 和警告
2、確定狀態之間的遷移條件
如果按照四種狀態:開、關、說謝謝、警告,那麼這四種狀態之前的遷移條件很明顯了
分兩個函數:
1、檢查是否需要遷移狀態;
2、遷移狀態.
遍歷各種狀態檢查是否有狀態需要發生遷移.一般用一個switch將各種狀態列出,然後在各種狀態裡面用if檢查是否需要遷移狀態,如果需要遷移,做好標記.
再次遍歷各種狀態,檢查哪些狀態做了標記,遷移到新狀態,並做相應的操作,比如進入關的時候,做關門動作。
典型的狀態機結構:
enum { state_A, state_B, state_C } state = state_A;
while(1)
{
switch ( state )
{
case state_A:
if ( event_A ) // 這里也可以用switch
{
action_1(); // 在某狀態下發生某事件執行某個動作,並轉入下個狀態
state = state_B;
}
else if ( event_B )
{
}
else
{
}
break;
case state_B:
... ...
}
}
『柒』 如何提高單片機,
單片機控制大部分是面向硬體的,關於這些物理硬體的控制,最重要的就是調節速度和精度,表現在單片機內部演算法上,我認為就是時間和空間的合理運用,而這些對演算法的要求是什麼呢,或者說作為單片機開發者來說,應該怎麼樣考慮自己的單片機程序呢?
第一,程序結構
我知道你肯定不會想去仔細研究數據結構,那太抽象了。在這里我直接告訴你,基於「狀態機」的程序結構更加適合單片機,確切的說是有限狀態機。狀態機編程技術將直接促使你解決程序的時間問題,並且程序結構可大可小,普通狀態機和層次式狀態機能讓你對絕大多數項目手到擒來。當然狀態機編程技術也是需要學習的,但這比你直接去學數據結構要輕松的多。
第二,使用適合的演算法
我們編程時要明白一個道理,再多復雜的演算法也不能證明你的程序是一個好程序,那什麼才是呢?是簡潔明了和可靠穩定。大道至簡放在編程上不是一句空話,同樣一個冒泡排序演算法,有的人寫出來死板的很,有的人卻能獨具效率,這是對演算法的理解高度不同。我認為與其學習更為復雜的控制演算法,不如加深自己對現有演算法的理解。通樣的PID演算法程序,有的人能加上積分分離,有的人能用上環境自適應,這裡面差別不可謂不大啊。
最後希望你能早日從自己的工作中形成自己獨到的理解,精益求精。
『捌』 C語言 我是初學者
函數,或者說子程序,追求的效果是高內聚、低耦合。簡單點說,最好是一個子程序只完成一個功能。具體的細節,軟體工程裡面對這個問題有相關討論。
初學者,可以試著這樣做:
首先,把很長的主函數劃分成幾個子程序,分的生硬一點也沒關系。
然後,試著給每個子程序起一個名字,盡量做到名符其實。
回過頭來,用這幾個子程序的名字去寫主程序,看主程序是否看起來還算合理。如果看著哪裡不舒服,就試著倒回去重新劃分、重新起名。多來幾次,逐漸調整,最後你會覺著主程序看起來舒服多了,因為你的邏輯結構變得清晰了。
注意,最終的主程序,我們把它稱為程序的構架,它可能是一個超級循環,也可能是一個狀態機,也可能是別的什麼結構,比如,我們通常稱Windows程序的構架是事件驅動的構架,按鍵、滑鼠都是事件。當然,設計一個好的構架不是一個簡單的事,事實上,這應該是系統分析人員應該考慮的,這需要經驗,海量的經驗,經過實踐檢驗的經驗。
初學者,只要記住一個大的原則,一個子程序只完成一個功能。
『玖』 C語言 狀態機代碼 怎麼寫
剛好前段時間寫了一個簡單協議的狀態機,代碼就不寫了,說一下大概吧
1、確定一共有多少種狀態,這里的狀態有開和關,細分還有say thankyou 和警告
2、確定狀態之間的遷移條件
如果按照四種狀態:開、關、說謝謝、警告,那麼這四種狀態之前的遷移條件很明顯了
分兩個函數:1、檢查是否需要遷移狀態;2、遷移狀態。
遍歷各種狀態檢查是否有狀態需要發生遷移。一般用一個switch將各種狀態列出,然後在各種狀態裡面用if檢查是否需要遷移狀態,如果需要遷移,做好標記。
再次遍歷各種狀態,檢查哪些狀態做了標記,遷移到新狀態,並做相應的操作,比如進入關的時候,做關門動作
剛才忘記說了,還有一個運轉狀態機函數,main函數在被觸發的情況下調用運轉函數,觸發條件有:投幣,人進入。