Please enable JavaScript.
Coggle requires JavaScript to display documents.
Chapter 8 語句階層 控制結構 (迭代語句 (邏輯控制迴圈 (迭代based on資料結構 (C : 呼叫iterator…
Chapter 8
語句階層
控制結構
控制結構
定義 : 控制下一步該往哪裡走
設計議題 : 是否允許多個entries? (e.g.
gotos
, statement
label
)
選擇語句
定義 : 提供多種執行路徑做選擇
分類
Two-way selectors (e.g. if then else)
設計議題
控制表達式的形式、型別?
如何指定then、else子句?
如何指定巢狀選擇的意義?
控制表達式
用
then
,或用括號 (2擇1)
C89沒有布林型態,用
算數表達式
Ada, Java, Ruby, and C# 都只能用
布林表達式
問題
in FORTRAN : 只能選擇一個statement,再多就要用
goto
( 負邏輯的可讀性差)
後來大多數的語言都允許復合語句 (if, the, else)
巢狀選擇
Java :
else
會跟距離最近的
if
f搭在一起
C, C++, C# : 為了強制另類語意,必須使用復合語句 (使用大括號)
Multiple-way selectors (e.g. switch)
定義 : 可以從多個statement中做選擇
設計議題
控制表達式的形式、型別?
如何給定可選擇的語句?
只能執行一個或多個segment?
若每個條件都不滿足,該執行什麼?
如何給定case values?
in 各語言
C
無暗示性的branch,在執行完後須自行加上break
default
: 可用來表示無滿足條件的狀況,若無default則不做任何動作
Ada
滿足一個條件後就跳出去了,比C的switch可靠度高
選擇清單必須是
exhaustive
(全面的),通常在結尾加上
when others
使其更可靠
else-if
: 多重選擇也可以用two-way延伸做出來
迭代語句
定義 : 會被重複執行的指令 (by迴圈or遞迴)
設計議題
計數器控制
迴圈or
邏輯控制
迴圈
控制機制在迴圈的哪裡?
計數器控制迴圈
說明
有一個
迴圈變數
,需給定迴圈參數
迴圈參數
: 定義迴圈變數
起始
、
終止
、
stepsize
的值
設計議題
迴圈變數的type、scope?
迴圈結束後,迴圈變數的值為何?
是否允許在loop body中
改變
迴圈變數或迴圈參數? 此改變是否
影響
迴圈控制?
迴圈參數只被evaluated一次? 或是每回合都一次?
邏輯控制迴圈
User-Located迴圈控制機制
定義 : programmer可自行定義迴圈控制的擺放位置,更方便
巢狀迴圈的設計議題
條件機制是否為不可或缺的出口?
結束時是跳出一個body,或是結束整個loop?
機制
break
continue
設計議題
Pre-test or post-test?
邏輯控制迴圈應是特殊形式的計數器迴圈,或是單獨的語句?
迭代based on資料結構
C : 呼叫
iterator
functionfor (p=root; p!=NULL; traverse(p)){}
C# :
foreach
Java : for (i in a) // a為陣列
Python :
ord(c)
回傳ASCII code或unicode字元
無條件Branching
定義 : 將程式的執行控制權轉移到特定的位置 (e.g. goto)
主要問題 : 可讀性差
保護命令
說明
基本想法 : 若順序並不重要,那程式不應該只指定一個
用途 : 提出一種支援驗證正確性的編程方法
分類(2種)
Selection Guarded Command
做法
若true<1 -> runtime error
若true>1 -> 隨機挑一個執行
所有
的表達式都驗證看看
(圖p.51, p.52比較 :fire::fire::fire:)
Loop Guarded Command
做法 :同上
緣由
控制語句與驗證正確性的關聯相當大
在有
goto
時幾乎不可能進行驗證
只有在selection以及pre-test迴圈時,才可能進行驗證