程式設計基礎/迴圈
“while”迴圈是一種控制流語句,它允許根據給定的布林條件重複執行程式碼。可以將“while”迴圈視為重複的“if”語句。[1]
在迭代(或重複)控制結構類別中,有兩個常用的“先測試”迴圈。它們是“while”和“for”;本模組介紹“while”迴圈。
迭代的概念與可能想要重複操作相關聯。就像所有控制結構一樣,我們都會問一個問題來控制迴圈的執行。術語“迴圈”來自使用流程圖時發生的迴圈運動。while 迴圈的基本形式如下所示
initialization of the flag
while the answer to the question is true then do
some statements or action
some statements or action
some statements or action
update the flag
在大多數程式語言中,問題(稱為測試表達式)是一個布林表示式。布林資料型別有兩個值 - true 和 false。讓我們重寫結構來考慮這一點
initialization of the flag
while the expression is true then do
some statements or action
some statements or action
some statements or action
update the flag
在“while”控制結構內,一個正常工作的迴圈有四個屬性。它們是
- 初始化標誌
- 測試表達式
- 操作或操作
- 標誌的更新
標誌的初始化技術上不是控制結構的一部分,但是在迴圈開始之前必須執行的操作。英文表達是,“當表示式為真時,執行以下操作。”這是迴圈在真值上。當測試表達式為假時,您停止迴圈並繼續執行程式中的下一項。請注意,因為這是一個“先測試”迴圈,所以操作可能不會發生。它被稱為“先測試”迴圈,因為測試在操作之前進行。它有時也稱為“預測試”迴圈,這意味著測試在操作和更新之前(或拉丁語中為“before”)。
考慮一下父母和孩子之間的一段單方面對話。
剛吃完早餐,父母知道孩子吃了麥圈。過去的經驗告訴他們,孩子通常會把麥圈灑在地板上。
父母告訴孩子:“只要地板上有一顆麥圈,就撿起來扔進垃圾桶。”
所有要素都存在,以確定孩子將要執行的操作(或流程)(在這種情況下是重複)。因為問題(地板上有一顆麥圈嗎?)只有兩個可能的答案(真或假),所以只要地板上有麥圈,孩子就會繼續執行操作。因此,孩子要麼 1) 從未撿起麥圈,因為他們從未灑過任何麥圈,要麼 2) 撿起麥圈,並一次撿起一顆麥圈,直到所有的麥圈都被撿起來。
在這一點上,值得一提的是,良好的程式設計總是提供一種方法來確保迴圈問題最終會變為假,以便迴圈停止執行,程式繼續執行下一行程式碼。但是,如果這種情況沒有發生,那麼程式將進入無限迴圈,並且不會停止,直到程式被外部終止或計算機重新啟動。考慮以下程式碼
虛擬碼無限迴圈
loop_response = 'y'
While loop_response == 'y'
Output "What is your age?"
Input user_age
Output "What is your friend's age?"
Input friend_age
Output "Together your ages add up to: "
Output user_age + friend_age
程式設計師在迴圈之前為標誌分配了一個值,這是正確的。但是,他們忘記更新標誌。每次詢問測試表達式時,它將始終為真。因此,它是一個無限迴圈,因為程式設計師沒有提供退出迴圈的方法(他忘記更新標誌)。考慮以下程式碼
loop_response = 'y';
While loop_response = 'y'
Output "What is your age?"
Input user_age
Output "What is your friend's age?"
Input friend_age
Output "Together your ages add up to: "
Output user_age + friend_age
Output "Do you want to try again? y or n"
Input loop_response
無論使用者在標誌更新期間回覆什麼,測試表達式都不會進行關係比較,而是進行賦值。它將“y”分配給變數,並詢問“y”是否為真?由於所有非零值都被視為表示真值,因此測試表達式的答案為真。瞧,您有一個無限迴圈。
上面的例子是針對事件控制迴圈。標誌更新是一個事件,有人決定是否要再次執行迴圈。通常,初始化會設定標誌,以便迴圈至少執行一次。
while 迴圈的另一個常見用法是作為計數迴圈。考慮
counter = 0
While counter < 5
Output "I love ice cream!"
counter += 1
變數 counter 被認為是控制迴圈的。它在進入 while 迴圈結構之前被設定為零(稱為初始化),只要它小於 5(五);將執行迴圈操作。但是,迴圈操作的一部分使用遞增運算子將 counter 的值增加 1。在執行迴圈五次(counter 的值為 0、1、2、3 和 4 時執行一次)之後,表示式將為假,程式中的下一行程式碼將執行。計數迴圈旨在執行操作(可能是多條語句)一定次數。在我們的例子中,訊息在監視器上顯示五次。這是透過確保 while 控制結構的所有四個屬性都存在並正常工作來實現的。這些屬性是
- 初始化標誌
- 測試表達式
- 操作或操作
- 標誌的更新
缺少屬性可能會導致無限迴圈或產生不良結果(無法正常工作)。
考慮
counter = 0;
while counter < 5
Output "I love ice cream!"
缺少標誌更新通常會導致無限迴圈。
在下面的例子中,整數變數 age 被認為是控制迴圈的(也就是標誌)。我們可以假設 age 在程式中早些時候有一個值。因為 while 結構是一個先測試迴圈;有可能該人的年齡為 0(零),並且第一次測試表達式時它將為假,並且迴圈的操作部分將永遠不會被執行。
While 0 < age
Output "I love candy!"
age -= 1
考慮以下變體,假設 age 和 counter 都是整數資料型別,並且 age 有一個值
counter = 0;
While counter < age
Output "I love corn chips!"
counter += 1
這個迴圈類似於我們第一個計數迴圈示例,是一個計數迴圈。唯一的區別是,在我們的表示式中,我們沒有使用文字常量(換句話說,是 5),而是使用了變數 age(以及儲存在 age 中的值)來確定執行迴圈的次數。但是,與我們第一個計數迴圈示例不同的是,第一個計數迴圈示例將始終準確執行 5 次;有可能該人的年齡為 0(零),並且第一次測試表達式時它將為假,並且迴圈的操作部分將永遠不會被執行。
- 計數控制
- 使用變數遞增或遞減來控制迴圈。
- 無限迴圈
- 由於迴圈沒有終止條件、無法滿足終止條件,或者導致迴圈重新開始,而無休止地迴圈的一系列指令。
- 初始化項
- 迭代控制結構的一個屬性。
- 迴圈屬性
- 與迭代或迴圈控制結構相關的專案。
- 可能不會發生
- 表示迴圈前測試可能不會執行操作。
- while
- 迴圈前迭代控制結構。