跳轉到內容

計算機程式設計/控制

來自華夏公益教科書
這篇計算機程式設計文章適用於 虛擬碼Adaooc

條件語句

[編輯原始碼]

條件子句是程式碼塊,只有當特定表示式(條件)為 時才會執行。

if-else 語句是最簡單的條件語句。它們也被稱為分支,因為當程式在執行期間到達 if 語句時,控制權將“分支”到兩個或多個“方向”中的一個。if-else 語句通常採用以下形式


if (condition):
    statement
else:
    other statement

如果滿足原始條件,則執行第一個語句中的所有程式碼。可選的 else 部分指定了一個備用語句,如果條件為假,則執行該語句。確切的語法在不同的程式語言中會有所不同,但大多數程式語言(尤其是 過程式結構化 語言)都會內建某種形式的 if-else 條件語句。if-else 語句通常可以擴充套件到以下形式


if (condition):
    statement
else if (condition):
    other statement
else if (condition):
    other statement
...
else (condition):
    another statement

整個塊中只執行一個語句。這個語句將是第一個條件為真的語句。藉助示例,可以更容易地理解 if-else-if 結構的概念


if (temperature is equal to or greater than 40 degrees celsius):
    print "It's extremely hot"
else if (temperature is between 30 and 39 degrees):
    print "It's hot"
else if (temperature is between 20 and 29 degrees):
    print "It's warm"
else if (temperature is between 10 and 19 degrees):
    print "It's cool"
else if (temperature is between 0 and 9 degrees):
    print "It's cold"
else:
    print "It's freezing"

最佳化提示

[編輯原始碼]

當這個程式執行時,計算機將按順序檢查所有條件,直到其中一個條件與其對真的概念匹配。一旦發生這種情況,程式將執行緊跟在條件後面的語句並繼續,而不會檢查任何其他條件。出於這個原因,當您嘗試 最佳化 程式時,最好按照降序 機率 排序您的 if-else 條件。這將確保在最常見的情況下,計算機需要做的工作更少,因為它很可能只需要檢查一兩個“分支”就能找到它應該執行的語句。但是,在第一次編寫程式時,儘量不要考慮太多,以免發現自己進行了 過早最佳化

話雖如此,您應該知道,當所討論的語句沒有 副作用 時,最佳化編譯器 可能會隨意重新排列您的 if 語句。除了其他技術之外,最佳化編譯器甚至可能會應用 跳轉表二分查詢


通常有必要將一個特定變數與多個常量表達式進行比較。對於這種條件表示式,存在 case 語句。例如


case X :
  when 1 :

     Walk_The_Dog;

  when 5 :

     Launch_Nuke;

  when 8 or 10 :

     Sell_All_Stock;

  when others :

     Self_Destruct;

esac;

無條件語句

[編輯原始碼]

無條件語句允許您在沒有條件的情況下改變程式的流程。使用無條件語句時要小心。通常它們會使程式難以理解。閱讀 goto 邪惡嗎? 獲取更多資訊。

結束函式並返回到呼叫過程或函式。


對於過程

return

對於函式

return Value

Goto 將控制權轉移到標籤後面的語句。


goto Label

Dont_Do_Something;

Label :

goto 邪惡嗎?

[編輯原始碼]

自從 Dikstra 教授發表了他的文章 關於 Go To 語句的思考 以來,goto 在結構化程式語言中被認為是不好的做法,事實上,許多程式設計風格指南禁止使用 goto 語句。但經常被忽略的是,任何不是過程或函式中最後一個語句的返回也是無條件語句——一種偽裝的 goto。不過有一個重要的區別:返回是 goto 的一種僅向前使用。異常也是一種 goto 語句;注意它們不需要指定要去哪裡。

因此,如果您有包含多個 return 語句的函式和過程,您就會破壞程式的結構,類似於使用 goto。在實踐中,幾乎每個程式設計師都熟悉 'return' 語句及其相關行為;因此,在可讀性方面,以下兩個示例幾乎相同


還要注意,Ada 中的 goto 語句比其他語言中的更安全,因為它不允許您將控制權

  • 轉移到主體之外;
  • case 語句、if 語句或 select 語句的不同備選方案之間;
  • 在不同的異常處理程式之間;或者從已處理_語句序列的異常處理程式返回到其語句序列。
procedure Use_Return
  Do_Something

  if Test : return

  Do_Something_Else

  return
end
procedure Use_Goto
  Do_Something
  
  if Test : goto Exit

  Do_Something_Else

  Exit :
  return
end

由於使用 goto 需要宣告標籤,因此 goto 的可讀性實際上是 return 的兩倍。因此,如果可讀性是您的關注點,而不是嚴格的“不要使用 goto”程式設計規則,那麼您應該使用 goto 而不是多個 return。當然,最好的方法是結構化方法,不需要 goto 也不需要多個 return


procedure Use_If
  Do_Something;
     
  if not Test :

     Do_Something_Else;

  fi;

  return
end

迴圈允許您重複執行一組語句。

無限迴圈

[編輯原始碼]

無限迴圈是一個永遠不會結束的迴圈,迴圈內的語句會永遠重複。術語“無限迴圈”是一個相對術語;如果正在執行的程式被一些超出程式控制範圍的方式強行終止,那麼無限迴圈確實會結束。


loop :

  Do_Something;   

repeat

開頭帶條件的迴圈

[編輯原始碼]

此迴圈在開頭有一個條件。只要滿足條件,這些語句就會重複執行。如果一開始條件不滿足,那麼迴圈內的語句永遠不會執行。


while (X < 5) :

  let X := Calculate_Something

repeat

結尾帶條件的迴圈

[編輯原始碼]

這種迴圈的條件在末尾,語句會重複執行,直到條件滿足。由於檢查是在末尾進行的,因此語句至少會執行一次。


loop

    X := Calculate_Something

until (X > 5)

帶中間條件的迴圈

[編輯原始碼]

有時需要先進行計算,並在滿足特定條件時退出迴圈。但是,如果條件不滿足,則需要做其他事情。因此,你需要一個在中間設定退出條件的迴圈。


loop

   X := Calculate_Something

   if X > 5 : exit

   Do_Something (X)

repeat

for 迴圈

[編輯原始碼]

通常情況下,需要一個迴圈,將特定變數從給定的起始值向上或向下計數到特定結束值。你可以在這裡使用 while 迴圈 - 但由於這是一個非常常見的迴圈,因此可以使用更簡單的語法。


for I := 1 to 10 :
 
   Do_Something (I)

repeat

陣列上的 for 迴圈

[編輯原始碼]

另一種非常常見的情況是,需要一個迴圈,它遍歷陣列中的每個元素。以下示例程式碼展示瞭如何實現這一點。


for-each I in X :

    X [I] := Get_Next_Element;

repeat
華夏公益教科書