疊代結構

疊代結構

疊代結構(iteration structure)亦稱循環結構,是最重要的控制結構,也是軟體設計人員需要掌握的基本技能。當條件成立的時候,執行循環體的代碼,當條件不成立的時候,跳出循環,執行循環結構後面的代碼。 疊代結構可以減少源程式重複書寫的工作量,用來描述重複執行某段算法的問題,這是程式設計中最能發揮計算機特長的程式結構 。

簡介

在程式設計時常有這樣的要求:當指定的條件為“真”時,反覆執行a塊;反之,即條件為“假”時就不執行a塊,如圖所示。

疊代結構 疊代結構

這種循環結構也稱“當型結構"或“WHILE型結構",即“當條件為“真”時執行a塊”,先判斷後執行。稱B塊為循環體。

循環結構(直到型結構) 循環結構(直到型結構)

另外,也可以先執行後判斷,如圖,這也是一種循環結構,稱“直到型循環結構’’或“UNTIL型結構",即反覆執行a塊,直到指定的條件為“真”時不再執行。

“直到型循環結構’’可以理解為由“當型循環結構”派生的結構,相當於在當型循環結構前再加一個a塊,即先執行一次a塊再進入當型循環,如圖所示。

用當型構造的直到型循環 用當型構造的直到型循環

“當型循環”是在條件為“假”時結束,而“直到型循環”是在條件為“真”時結束。若把“直到型"改為“當型”,除增加一個a塊外,還要對直到型中的條件取“反”。

注意,任何循環結構都應當在重複有限次時終止,否則不符合結構化程式對循環結構的要求。

疊代結構

當條件成立的時候,執行循環體的代碼,當條件不成立的時候,跳出循環,執行循環結構後面的代碼。    循環結構可以減少源程式重複書寫的工作量,用來描述重複執行某段算法的問題,這是程式設計中最能發揮計算機特長的程式結構 。循環結構可以看成是一個條件判斷語句和一個向迴轉向語句的組合。另外,循環結構的三個要素:循環變數、循環體和循環終止條件。循環結構在程式框圖中是利用判斷框來表示,判斷框內寫上條件,兩個出口分別對應著條件成立和條件不成立時所執行的不同指令,其中一個要指向循環體,然後再從循環體回到判斷框的入口處。

結構簡介

循環結構可以看成是一個條件判斷語句和一個向迴轉向語句的組合。另外,循環結構的三個要素:循環變數、循環體和循環終止條件. ,循環結構在程式框圖中是利用判斷框來表示,判斷框內寫上條件,兩個出口分別對應著條件成立和條件不成立時所執行的不同指令,其中一個要指向循環體,然後再從循環體回到判斷框的入口處.

常見的兩種疊代結構

①當型循環:先判斷所給條件p是否成立,若p成立,則執行A(步驟);再判斷條件p是否成立;若p成立,則又執行A,若此反覆,直到某一次條件p不成立時為止。

②直到型循環:先執行A,再判斷所給條件p是否成立,若p不成立,則再執行A,如此反覆,直到p成立,該循環過程結束。

結構設計

實現

循環結構可以用條件語句或循環語句實現。

在程式設計過程中,循環的設計對整個算法起至關重要的作用。不能認為,只要能編循環程式,就已經掌握了循環程式設計方法,還應更深入地研究它,才能設計出好的循環程式。

•典型的WHILE循環:其中只有兩個被標識的部分:條件cond和循環體body。執行循環的機理很簡單,只要cond為“真”便反覆執行body。它可被執行零次或多次。

循環的結構和機理並不令人感興趣,使人們感興趣的是怎樣才能把循環的各部分與欲求解的問題聯繫起來,並確信此循環可以解決給定的問題。

考察循環結束,不難發現,由於循環不再進行,循環結束便應該與問題的解相吻合。循環結束的唯一理由是cond變為假。通常,並不能預先知道循環中疊代的次數。所以cond為假,實際上是所能得到的唯一信息,即必須不斷地改變計算狀態才能終止循環。結論是,應該在疊代中解決問題,除非cond為真。

以上描述形成一種印象:有某種東西必須在疊代過程中保持不變。這種不變的東西稱作循環不變式。在cond首次及以後各次被檢驗時,循環不變式必須出現。尤其重要的是在con&最後一次被檢驗時,循環不變式必須為真(不變式的運行結果值恰好與問題的解相吻合)。換言之,循環結束時,不變式為真,而cond條件值為假。

現在,可以詳細地描述設計正確循環的步驟了。不變式的建立是循環設計過程的中心。

循環設計規範步驟

•第一步:精確定義計算目標,即如何識別成功的終結。

•第二步:建立一個循環不變式,它是普遍情形,而成功的終結只是它的一種特殊情形。

•第三步:設計這樣一個循環,只有達到成功的終結狀態時它才結束。要確保循環的執行不會毀壞不變式。

•第四步:將程式數據初始化,使條件cond在循環執行前為真。

按循環設計規範的步驟做。

•第一步:當C=A*B時,為成功的終結。

•第二步:C=A*B的普遍情形是C=A*D,其中D是一個變數。成功的終結是D=B。

•第三步;當D=B時結束的循環具有D≠B這個循環條件。由於C和D有關。所以保留關係C=A*D。這個不變式的循環體必須改變C和D兩者的值(注意A是常數)。這裡欲用C來逐次累加加數A,以使C增大,同時D亦逐步增大。自然,把D看作是加數A加C中去的個數計數器。現在可將該循環用偽代碼一一結構化漢語記為;

•(1)當 D≠B時,反覆做:

① c←c+A

②D←D十1

為了確保循環體的執行不毀壞不變式,可將循環體想像為一個黑箱,其輸入和輸出在不同時間是同一變數。下面給出代數式證明。

假設:Cn=A*D(下標O與n將分別表示舊與新)

求證;Cn=A*Do

證明:∴Cn=Co十A

Dn=Do+1

∵Cn=Co+A=A*Do十A=A*(Do+1)=A*D。

•第四步:算法中包含c和D,為將其初始化,又使不變式c=A木D為真,可選擇C=0,D=0,或者C=A,D=1(因為B為正整數)。

整個偽代碼可寫成:

用加法仿真正整數乘法的算法

MULT(A,B;C) ·

•(1)C←A

•(2)D←1

•(3)當 D≠B時,反覆做;

•①c←c+A

•②D←D+1

•(4)[返回]

C語言中的循環語句

三個循環

C語言中提供四種循環,即goto循環、while循環、do…while循環和for循環。四種循環可以用來處理同一問題,一般情況下它們可以互相代替換,但一般不提倡用goto循環,因為強制改變程式的順序經常會給程式的運行帶來不可預料的錯誤,在學習中我們主要學習while、do…while、for三種循環。常用的三種循環結構學習的重點在於弄清它們相同與不同之處,以便在不同場合下使用。這就要清楚三種循環的格式和執行順序,將每種循環的流程圖理解透徹後就會明白如何替換使用,如把while循環的例題,用for語句重新編寫一個程式,這樣能更好地理解它們的作用。特別要注意在循環體內應包含趨於結束的語句(即循環變數值的改變),否則就可能成了一個死循環,這是初學者的一個常見錯誤。

三個循環異同點

在學完這三個循環後,應明確它們的異同點:用while和do…while循環時,循環變數的初始化的操作應在循環體之前,而for循環一般在語句1中進行的;while 循環和for循環都是先判斷表達式,後執行循環體;而do…while循環是先執行循環體後判斷表達式,也就是說do…while的循環體最少被執行一次,而while 循環和for就可能一次都不執行。另外還要注意的是這三種循環都可以用break語句跳出循環,用continue語句結束本次循環,而goto語句與if構成的循環,是不能用break和 continue語句進行控制的。

順序結構、分支結構和循環結構並不彼此孤立的,在循環中可以有分支、順序結構,分支中也可以有循環、順序結構,其實不管哪種結構,我們均可廣義的把它們看成一個語句。在實際編程過程中常將這三種結構相互結合以實現各種算法,設計出相應程式。但是要編程的問題較大,編寫出的程式就往往很長、結構重複多,造成可讀性差,難以理解,解決這個問題的方法是將C程式設計成模組化結構。

模組化程式結構C語言的模組化程式結構用函式來實現,即將複雜的C程式分為若干模組,每個模組都編寫成一個C函式,然後通過主函式調用函式及函式調用函式來實現一大型問題的C程式編寫。因此常說:C程式=主函式+子函式。 因此,對函式的定義、調用、值的返回等要尤其注重理解和套用,並通過上機調試加以鞏固。

相關詞條

熱門詞條

聯絡我們