條件判斷 (Condition) 與迴圈 (Loop)
if
條件判斷
為了應付不同條件下能做出不同指令, C/C++
提供了 if
條件句判斷。
條件句需要使用條件運算子,條件句有兩種結果,True (1) 和 False (0)。當 if
條件句符合時,會執行對應的陳述句,否則會無視陳述句,執行之後的程式碼。陳述句為一系列指令,可有 到多句,用 {}
包起來,只有 句時可省略,但為維護及可讀性,建議不要省略,
如果有兩種(含)以上的條件,可使用複合陳述句,當 if
條件不符合時,會執行 else if
,如果 else if
再不符合,會再執行下一個 else if
,直到遇到符合的條件句,就會執行對應的陳述句,如果執行到 else
則會無條件的執行對應的陳述句。在複合陳述句中,可以有 到多個 else if
,以及 或 個 else
。
if
條件判斷支持巢狀結構,意思為可以在 if
條件判斷裡面放 if
條件判斷。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
|
if
條件判斷只能執行單次,如要重複執行,需使用迴圈,迴圈有兩種: while
和 for
。
while
迴圈
while
迴圈用在終止條件未知的情況下。
執行順序為: 條件部
(符合)-> 陳敘
-> 條件部
(符合)-> 陳敘
->...-> 條件部
(符合)-> 陳敘
-> 條件部
(不符合)-> 跳出。
當條件部的條件符合,才會執行陳敘。換句話說,只有當條件部的條件不符合,這個迴圈才會終止。
有個和 while
迴圈相似的迴圈叫做 do-while
迴圈,差別在於 do-while
會先執行陳敘,再判斷是否要離開迴圈。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
條件部可搭配遞增/遞減運算子,注意使用前綴和後綴。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
for
迴圈
for
迴圈用在終止條件已知的情況下,會設立一個控制變數 (Control Variable) 來控制迴圈執行的次數。
for
迴圈分成初始部、條件部、更新部三部分
-
初始部、條件部、更新部這三部分皆可省略。
-
初始部:用來宣告和初始化控制變數(
C99
前不能宣告),變數宣告只能是同種形態,如果有兩種(含)以上的形態要宣告,其中一種要宣告外部。 -
條件部:判斷是否要繼續迴圈,同
while
迴圈的條件部。 -
更新部:更新控制變數,更新部的值如果是要
+1
或-1
,通常會使用遞增運算子。 -
前綴後綴運算子,在更新部效果相同。在追求效率的程式競賽,會使用前綴遞增/遞減運算子,因為前綴遞增/遞減運算子,只會改變數的值,而後綴運算子,會先複製一個變數用於回傳,再改變數的值,效率會低於前綴運算子。
-
for
迴圈執行順序:初始部
->條件部
(符合)->陳敘
->更新部
->條件部
(符合條件)->陳敘
->更新部
->...條件部
(符合)->陳敘
->更新部
->條件部
(不符合)-> 跳出。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
while
和 for
兩種寫法可以轉換,皆支持巢狀結構,可以和 if
搭配。
1 2 3 4 5 6 7 8 9 |
|
break
和 continue
break
:跳出迴圈。continue
:直接繼續下一次迴圈執行,跳過這次迴圈後續的程式碼。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
常見的輸入條件
比賽中會有一些輸入條件,常見有 EOF 版、 行版、X 尾版,以下一一介紹。
行版
這種題目格式如下:
1 |
|
用 while
和 for
迴圈可以這樣寫:
1 2 3 4 5 6 7 8 |
|
EOF 版
這種題目通常沒有明確的終止條件,或是直接告訴你「以 EOF 結尾」。
檔案結尾 (End of File, EOF),是指作業系統無法從資料來源讀取更多資料的情形,也就是一個程式讀資料讀到檔尾,程式遇到檔尾會回傳值,下列列出常用輸入函式(函式請參考 函式與遞迴章節 ):
如何模擬 EOF
- 在 windows 的命令提示字元按
Crtl + Z
- 類 Linux 系統按
Crtl + D
- 也可以用 command line 編譯程式,重新導向輸入輸出
當讀到檔尾時, scanf
會回傳 -1
,利用 scanf
的回傳值判斷是否獨到檔尾。
錯誤觀念
- 錯誤:讀不到數字會變成 -1
- 正確:讀不到
scanf()
會回傳 -1,也只有 C 的scanf
會回傳 -1
cin
有兩種寫法,一種是利用函式 eof
判斷是否還有資料輸入。第二種是利用 cin
的回傳值,當讀到檔尾時, cin
會回傳空物件。空物件在 C++
轉換成 bool
值會是 false
,可將結果轉換至 bool
值在判斷,在條件句裡面,所有回傳值都會變成 bool
值,不用特別轉換。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
另外附上 JAVA
和 python
的 EOF 寫法:
1 2 |
|
1 2 3 |
|
X
尾版
1 |
|
X 可以是任意型態的任意值,例如數字的 -1
,字元的 e
。
這種輸入有兩種寫法,一種是使用 break
,另一種是使用 C++
的逗號運算子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|