---
# System prepended metadata

title: 條件判斷
tags: [中和高中]

---

# 條件判斷

## if()

```c
if(判斷式){
    陳述句
}
```

如果符合小括號內的條件，就會執行大括號內的程式



範例:
```c=
#include <stdio.h>

int main(){
    int n=1;
    if(n==1){
        printf("1");
    }
    return 0 ;
}
```

輸出:
```
1
```

如果n=0

```c=
#include <stdio.h>

int main(){
    int n=0;
    if(n==1){
        printf("1");
    }
    return 0 ;
}
```

輸出:
```

```

---

還可以加上邏輯運算子

#### &&
```c=
#include <stdio.h>

int main(){
    int n=1;
    if(n==1 && n==0){
        printf("1");
    }
    return 0 ;
}
```
輸出:
```

```
#### ||

```c=
#include <stdio.h>

int main(){
    int n=1;
    if(n==1 || n==0){
        printf("1");
    }
    return 0 ;
}
```
輸出:
```
1
```

---

## else if()

```c=
if(判斷式){
    陳述句
}else if(判斷句){
    陳述句
}
```

如果if裡條件不成立，就會跑到else if()裡看條件成不成立
* 不能直接寫else if ，前面至少要有if。
:::warning
else if 可以寫很多層 但if只能寫一次(就是在開頭)。
:::


舉例:
```c=
#include <stdio.h>

int main(){
    int n=1;
    if(n==0){
        printf("1");
    }else if(n==1){
        printf("2");
    }
    return 0 ;
}
```
輸出
```
2
```

---

## else

```c=
if(判斷式){
    陳述句
}else if(判斷句){
    陳述句
}else{
    陳述句
}
```

如果if、else if 的條件都不成立，就會執行else 裡的程式
不可以直接寫else 前面至少要有一個if 


舉例:
```c=
#include <stdio.h>

int main(){
    int n=2;
    if(n==0){
        printf("1");
    }else if(n==1){
        printf("2");
    }else{
        printf("3");
    }
    return 0 ;
}
```

輸出
```
3
```

---

我們來帶個例子
### zerojudge a003 : 兩光法師占卜術
https://zerojudge.tw/ShowProblem?problemid=a003

題目敘述:

兩光法師時常替人占卜，由於他算得又快有便宜，因此生意源源不絕，時常大排長龍，他想算 得更快一點，因此找了你這位電腦高手幫他用電腦來加快算命的速度。

　　他的占卜規則很簡單，規則是這樣的，輸入一個日期，然後依照下面的公式：

M=月
D=日
S=(M*2+D)%3

得到 S 的值，再依照 S 的值從 0 到 2 分別給與 普通、吉、大吉 等三種不同的運勢

::: spoiler 參考解法
```c=
#include<stdio.h>
int main(){
    int M,D,S;
    scanf("%d %d",&M,&D);
    S=(M*2+D)%3;
    if(S==0){
        printf("普通");
    }
    else if(S==1){
        printf("吉");
    }
    else{
        printf("大吉");
    }
    return 0;
}
```
:::

---

## switch
```c=
switch(變數名稱或運算式) { 
    case 符合數字或字元: 
        陳述句一; 
        break; 
    case 符合數字或字元: 
        陳述句二; 
        break; 
    default: 
        陳述三; 
}
```
他的功能是在判斷變數的值符合哪個 case，並執行該 case 底下的陳述句。
而 default 就相當於 else，也是可有可無。
:::warning
case 後面加的是 : 不是 ;
這裡的 break 基本上都要加上去。
:::

舉例:
```c=
#include <stdio.h>
int main(){
    char ch;
    scanf("%c", &ch);
    switch(ch){
        case 'Y':
            printf("Yes\n");
            break;
        case 'N':
            printf("No\n");
            break;
        default:
            printf("Err\n");
            break;
    }
}
```
輸入:
```
Y
```
輸出:
```
Yes
```
輸入:
```
N
```
輸出:
```
No
```
輸入:
```
A
```
輸出:
```
Err
```

如果沒加break?
```c=
#include <stdio.h>
int main(){
    char ch;
    scanf("%c", &ch);
    switch(ch){
        case 'Y':
            printf("Yes\n");
        case 'N':
            printf("No\n");
        default:
            printf("Err\n");
    }
}
```

輸入:
```
Y
```
輸出:
```
Yes
No
Err
```
輸入:
```
N
```
輸出:
```
No
Err
```
輸入:
```
A
```
輸出:
```
Err
```
他就會一直往下執行直到遇到`break`或者switch整個結束
記得要加`break`

## 三元運算子
```c
(判斷句 ? 陳述句 : 陳述句)
```
如果判斷是true的話會執行?後的陳述句，如果是false則執行:後的陳述句

舉例:
```c=
#include <stdio.h>
int main(){
    int n=1;
    printf(n==1?"Yes":"No");
}
```
輸出
```
Yes
```

當n=0

輸出
```
No
```

---

## 兩個數字排序
由小到大排列
```c=
#include <stdio.h>
int main(){
    int a,b,t;
    scanf("%d%d",&a,&b);
    if(a>b){
        t=a;
        a=b;
        b=t;
    }
    printf("%d %d",a,b);
}
```
輸入:
```
2 1
```

輸出:

```
1 2
```
## 三個數字排序
舉例:
```c=
#include <stdio.h>
int main(){
    int a,b,c,t;
    scanf("%d%d%d",&a,&b,&c);
    if(a>b){
        t=a;
        a=b;
        b=t;
    }
    if(a>c){
        t=a;
        a=c;
        c=t;
    }
    if(b>c){
        t=b;
        b=c;
        c=t;
    }
    printf("%d %d %d",a,b,c);
}
```

輸入:
```
3 1 2
```

輸出:

```
1 2 3
```


---


### 來個練習題:
[最後一台計算機](https://chiscoj.com/problem/a007)
[小鬼最討厭的東西](https://chiscoj.com/problem/a008)
[經典問題:雞兔同龍問題](https://chiscoj.com/problem/a009)


###### tags: `中和高中`