什么是分支程序設(shè)計?相關(guān)示例總結(jié)
C語言中有三大結(jié)構(gòu),分別是順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)(分支結(jié)構(gòu)):
順序結(jié)構(gòu)就是程序從頭到尾的順序依次執(zhí)行每一條代碼,不重復(fù)執(zhí)行任何代碼,也不跳過任何代碼。
選擇結(jié)構(gòu)也稱分支結(jié)構(gòu),就是讓程序“拐彎”,有選擇性的執(zhí)行代碼,即可以跳過沒用的代碼,只執(zhí)行有用的代碼。
循環(huán)結(jié)構(gòu)就是讓程序“殺個回馬槍”,不斷地重復(fù)執(zhí)行同一段代碼。
結(jié)構(gòu)化程序設(shè)計思想
1976年,圖靈獎獲得者Niklaus Wirth出版了名為Algorithms+Data Structure=Programs的軟件設(shè)計專著,書中提及了算法和數(shù)據(jù)結(jié)構(gòu)的概念,并提出作為結(jié)構(gòu)化程序設(shè)計的基礎(chǔ)的著名論斷:程序=算法+數(shù)據(jù)結(jié)構(gòu)。
從書中我們可以了解到結(jié)構(gòu)化程序設(shè)計的基本思想為:
自上而下、逐步細化、模塊化設(shè)計、結(jié)構(gòu)化程序編碼
由此結(jié)構(gòu)化程序具有以下特點:
程序由不同功能的模塊構(gòu)成,各模塊又可以按照不同類型分成一個或者多個子模塊。
每個子模塊之間有一個或者多個程序單元構(gòu)成,個子模塊之間可以互相調(diào)用程序單元。
一個程序單元由順序、分支、循環(huán)三種基本結(jié)構(gòu)構(gòu)成。
分支結(jié)構(gòu)程序的指令執(zhí)行順序與指令在ROM中的存放順序不同,其中某些具有判斷功能的指令會根據(jù)判斷結(jié)果改變接下來的指令執(zhí)行順序,從而使程序產(chǎn)生一個或多個分支流向。可用于分支結(jié)構(gòu)程序設(shè)計的判斷指令主要包括JZ、CJNE和JB等有條件轉(zhuǎn)移指令。根據(jù)程序分支的數(shù)量,可以將分支程序分為三類:單分支、一般多分支和散轉(zhuǎn)多分支。
1.單分支程序
單分支程序僅進行一個條件判斷,程序流程相對簡單。
【例3-58】判斷單字節(jié)數(shù)的奇偶性。要求:單字節(jié)數(shù)X存放于片內(nèi)RAM地址為55H的存儲單元中,判斷其奇偶性,若其為奇數(shù)則將PSW寄存器中的F0置1,否則將F0清0。
參考程序如下,運行結(jié)果是:(F0)=01。該程序的流程圖如圖3-6所示。
【例3-59】判斷兩個單字節(jié)型無符號數(shù)的大小。要求:單字節(jié)型無符號數(shù)X和Y分別存放于寄存器R0和R1中,比較兩個數(shù)的大小,將其中較大的數(shù)存入R2中。
參考程序如下,運行結(jié)果是:(R2)=20H。該程序的流程圖如圖3-7所示。
2.一般多分支程序
一般多分支程序需要進行兩次或兩次以上的分支判斷,而且一個判斷可能需要兩條(或以上)條件轉(zhuǎn)移指令配合完成。
【例3-60】求三個無符號字節(jié)型數(shù)據(jù)X、Y和Z中的最大值。要求:X、Y和Z分別存放于片內(nèi)RAM的30H、31H和32H單元,最大值存于33H單元。
以下參考程序的運行結(jié)果是:(33H)=57H,其流程圖如圖3-8所示。分析程序和流程圖可知,大于等于的判斷由CJNE和JNC兩條指令配合實現(xiàn),并且大于等于判斷進行了兩次,因此本程序?qū)儆诙喾种У某绦蚪Y(jié)構(gòu)。
3.散轉(zhuǎn)多分支程序
與一般多分支程序相比,散轉(zhuǎn)多分支程序具有更多分支,可以根據(jù)用戶輸入或之間的處理結(jié)果轉(zhuǎn)向相應(yīng)分支,并執(zhí)行對應(yīng)的處理程序。散轉(zhuǎn)多分支程序所用的轉(zhuǎn)移指令是散轉(zhuǎn)指令“JMP@A+DPTR”。散轉(zhuǎn)多分支程序的設(shè)計方法有三種:轉(zhuǎn)移指令表法、分支地址表法和地址偏移量表法。其中,轉(zhuǎn)移指令表法已經(jīng)結(jié)合指令JMP進行了講解(見例3-47),因此本小節(jié)僅介紹后兩種方法。
(1)分支地址表法
分支地址表法將各分支程序的首條指令的地址存入一個表中,當執(zhí)行某個分支時,通過索引在該表中查找分支地址,并送入程序指針寄存器(PC),從而實現(xiàn)程序的分支轉(zhuǎn)移。
【例3-62】利用分支地址表法,實現(xiàn)與例3-47程序相同的功能。
解:參考程序如下: