選擇結構 Selection Structrue
選擇結構簡單來說就是流程上我們會有岔路,因應不同的條件而做不同的事情。在C語言裡面,我們用if跟switch來達到這樣的效果。此篇暫時只有討論if的用法。
通常會先搭配「邏輯值」Logic Value 來講解,但它其實很直覺,因此我們直接用例子來說。
以下任何例子,可以使用Online GDB來線上測試程式。
IF Statement
程式碼
#include<stdio.h>
int main(){
int a = 5;
if (a > 3){
printf("%d 大於 3", a);
}
}執行結果
5 大於 3此例中,我們在第三行宣告一個整數變數a,並將它的值指派為5。而後在第四行的地方說「如果a大於3」,那麼我們就「顯示a 大於 3」這句話。
顯而易見,a > 5,因此程式執行會顯示5 大於 3。
TIP
試著把 a 的值改成別的數字,然後再執行看看。
單向選擇
這邊我們首先整理if的最基礎應用方式,專業術語是單向選擇。
程式碼
#include<stdio.h>
int main(){
if (expression){
// do something you want if the statement hold
}
}若某個條件成立,則做某事。這邊我們expression的部分,會是一個「邏輯值」,也就是true或是false。
在前面的例子中,a > 3是true,因此條件成立,而做大括號內的事。
Try it yourself
- 試著將
a改為其他數字,再執行看看結果。 - 試著寫多個
ifstatement。
如果你不知道要試什麼,可以直接複製以下的程式碼執行看看。
程式碼
#include<stdio.h>
int main(){
int a = 10;
if (a > 5){
printf("%d 大於 5\n", a);
}
if (a % 2 == 0){
printf("%d 是 2 的倍數\n", a);
}
if (a < 3){
printf("%d 小於 3\n", a);
}
}INFO
%是一種運算子,代表「取餘數」的意思,例如 30 % 7 的結果會是 2,因為 30除以7餘2。
雙向選擇
程式碼
#include<stdio.h>
int main(){
int a = 2;
if (a > 3){
printf("%d 大於 3", a);
}else{
printf("%d 小於等於 3", a);
}
}執行結果
2 小於等於 3此例增加了else,意思是「否則」。當前述條件不成立時,就會執行這個區塊的程式碼。因此我們一開始設定a = 2而在第三行判斷它如果大於 3 則執行某事。但它並不大於 3,因此程式跳到第六行的程式區塊中,執行printf("%d 小於等於 3", a);。
奇數偶數判斷
程式碼
#include<stdio.h>
int main(){
int a = 2;
if (a % 2 == 0){
printf("%d 是偶數", a);
}else{
printf("%d 是奇數", a);
}
}多向選擇
如果你有過填選志願的經驗,應該可以快速理解這個例子。假設第一志願的條件不通過,則看第二志願的條件是否通過,依此類推往後看最後落在哪個志願。
這裡我們簡單用分數來進行說明,
- 如果大於等於 90 分,則為 A 等級;
- 否則如果大於等於 80 分,則為 B 等級(即分數落在 80 ~ 89 之間);
- 否則如果大於等於 70 分,則為 C 等級(即分數落在 70 ~ 79 之間);
- 否則如果大於等於 60 分,則為 D 等級(即分數落在 60 ~ 69 之間);
程式碼
#include<stdio.h>
int main(){
int a = 79;
if (a >= 90){
printf("A");
}else if(a >= 80){
printf("B");
}else if(a >= 70){
printf("C");
}else if(a >= 60){
printf("D");
}else{
printf("不及格");
}
}你可以試著改動a的值來觀察執行結果。
巢狀結構
假設今天符合某條件之後,我們可以在裡面繼續進行選擇結構。例如,在剛才的例子中,不及格又可以分為:
- 大於等於 40 分,可以補考;
- 小於 40 分,不能補考。
程式碼
#include<stdio.h>
int main(){
int a = 79;
if (a >= 90){
printf("A");
}else if(a >= 80){
printf("B");
}else if(a >= 70){
printf("C");
}else if(a >= 60){
printf("D");
}else{
printf("不及格\n");
if (a >= 40) {
printf("可以補考。");
}else{
printf("不能補考。");
}
}
}值得注意的是,此處我們的例子中,a = 79,所以它大於等於 40,但是並不會顯示「可以補考。」