首頁 關於 支持
上一篇:章節0-1 下一篇:章節0-3 章節0-2練習題
快速移動至特定內容
bool型別
條件判斷
迴圈

章節0-2.C++基礎語法(二)

bool型別

所謂的bool型別是用來儲存真、假值的變數,真用1表示,假用0表示。

bool常出現在比較運算(或稱關係運算),也就是常見的比大小、判斷相等,例如「5>3」為真、其值為1,「4>4」為假、其值為0,這些比較運算的結果可以直接賦值給bool或進行輸出,只不過記得將其()起來,因為進行比較運算的順序在較後面。
其他常見的比較運算有判斷相等「==」(與賦值不同,賦值是單個=)、不相等「!=」、大於等於「>=」、小於等於「<=」等等。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int x,y;
    cin>>x>>y;
    bool b=(x*y>=20);
    cout<<b; //也可以直接cout<<(x*y>=20);
    //若輸入「3 6」,因為3*6為18會輸出「0」
    //若輸入「4 5」,因為4*5為20會輸出「1」
}

除此之外,不同條件間還可以進行邏輯運算,所謂邏輯運算是指以bool型別為主角的運算,有三種。
第一是「且」,寫法為「a&&b」,僅有a、b皆為1時結果才是1,否則為0。
第二是「或」,寫法為「a||b」,只要a、b至少一個為1時結果就是1,否則為0。
第三是「非」,寫法為「!a」,若a為1,!a會得到0,反之a為0,!a會得到1。
以上的a、b都能使用bool變數或直接寫比較運算的式子。

這三種邏輯運算是可以混用的,只是需要注意優先順序為「! > && > ||」,若不確定順序就放上()來讓特定內容先算完再進行後續運算。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int x,y;
    cin>>x>>y;
    bool b=(x*y>=20 && x*y<=30); //b值代表x*y是否在20~30(含)以內
    bool c=(x==0 || y==0); //c值代表x,y是否至少有一個為0
    cout<<(!b); //將b值之真假顛倒,輸出結果可以理解為x*y不在20~30內
}

條件判斷

if-else是C++中的條件判斷語句,可以特定條件執行不同的程式碼。

if-else最基本的結構如下,如果其中的「條件」成立,就會執行{}內的程式,其中「條件」可以是bool變數或上述的比較運算、邏輯運算式子。

if(條件){
    //要執行的程式碼
}

如果要不成立時執行程式碼,可以使用else,當else前的if不成立就會執行else後的{}。

if(條件){
    //條件成立要執行的程式碼
}else{
    //條件不成立要執行的程式碼
}

若要在多個不同條件執行不同程式,可以在else後繼續加上不同條件,如下。

if(條件一){
    //條件一成立要執行的程式碼
}else if(條件二){
    //條件二成立要執行的程式碼
}else if(條件三){
    //條件三成立要執行的程式碼
}else{
    //以上條件都不成立要執行的程式碼
}

注意以上的if-else程式碼,如果是用if(條件1){條件1程式碼}...else if(條件n){條件n程式碼}else{都不符合的程式碼}的形式,那麼只會有一個{}的內容執行到,只要遇到符合的條件就會跳過所有後續的else。

其實可以將if-else的語法用中文下去理解,也就是「如果(條件1){執行條件1的程式},否則如果(條件2){執行條件2的程式}」,否則{執行以上條件都不成立的程式}。

補充:if-else可以省略{}的情況

以下是if-else的範例,可以用來判斷輸入的數是奇數還是偶數,奇數、偶數分別輸出「odd」跟「even」。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    if(n%2==1){
        cout<<"odd";
    }else{
        cout<<"even";
    }
}
小技巧:將其他型別的變數當作bool

迴圈

而在C++中若要重複執行一樣或類似的程式碼就需要使用迴圈這個功能。

較簡單的迴圈是while迴圈,語法為「while(條件){重複執行的程式}」,while的中文意思之一是「當...」,所以此迴圈的作用便是當條件成立時會一直執行裡面的程式,如下。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n=1;
    while(n<=5){
        cout<<n<<' ';
        n++;
    }
    cout<<'\n';
    //以上會輸出「1 2 3 4 5 」,每次會先輸出n,再將n增加1,直到n變為6過後因為條件不符合就跳出迴圈
    n=20;
    while(n<10){
        cout<<"There will not be run.\n";
        n++;
    }
    //在while迴圈開始時也會進行條件的檢查,以上程式碼在這個時候便會跳出迴圈了,因此不輸出內容
    n=5;
    while(n--){
        cout<<"There will be run n times.\n";
    }
    //以上會輸出5行「There will be run n times.」
    //原理可以參考0-1章的「小技巧:變數操作完會丟出操作完的值」與本章的「小技巧:將其他型別的變數當作bool」
    //可以在以上迴圈中加入「cout<<n<<' ';」來幫助理解
}

另外控制迴圈還有「break;」與「continue;」兩個方法。
「break;」執行後會直接離開迴圈,「continue;」會直接重新開始迴圈,並且同樣會執行迴圈條件的檢查。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n=1;
    while(n<=5){
        if(n==3)break;
        cout<<n<<' ';
        n++;
    }
    cout<<'\n';
    //以上會輸出「1 2 」,當n變3後,因為條件仍符合,迴圈會繼續執行,但馬上會因為「break;」而跳出迴圈
    n=0;
    while(n<=5){
        n++;
        if(n%3==2)continue;
        cout<<n<<' ';
    }
    //以上會輸出「1 3 4 6」,在n為2、5時會執行到「continue;」而跳過後面的輸出
}
補充:先執行迴圈後判斷的方法

另一種常見的迴圈為for迴圈,語法為「for(初始化;條件;遞增式){程式碼}」,迴圈第一次執行前會先執行「初始化」的賦值或者宣告;接著每次迴圈前會先檢查「條件式」,為真的話執行「程式碼」,否則離開迴圈;而每次迴圈執行完則會執行「遞增式」,常見的作法是透過「++」、「+=」等等來改變變數。以下是for迴圈的例子。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cout<<i<<' ';
    }
    //輸入n後該程式碼會輸出由1到n
}

若覺得for迴圈的執行順序很複雜,可以用以下方式思考。
迴圈每次執行時,變數會從「初始化」的值開始,每次依照「遞增式」改變值,直到「條件」不符合,而過程中的每個值就是執行一次迴圈內的「程式碼」。
如此一來就可以輕易搞懂「for(int i=1;i<32;i*=2){...}」會如何運作了,i從1開始,每次乘2,直到i<32不符合,也就是i值會是1、2、4、8、16,迴圈共執行5次。

而for迴圈由於可以同時宣告變數並操控的特性,常用於配合陣列操作,如一次性讀入n個變數可以用「for(int i=0;i<n;i++)cin>>a[i];」或「for(int i=1;i<=n;i++)cin>>a[i];」,兩者分別是將n個數儲存在a[0]~a[n-1]跟a[1]~a[n],建議養成使用前者從0編號的習慣,後續實作會方便一些。

而for迴圈一樣可以使用「break;」與「continue;」,基本上都跟while迴圈時使用得效果一樣,continue一樣會跳到開頭並進行遞增後再條件檢查。需要注意for迴圈初始化宣告的變數只能用在迴圈內。另外for迴圈的「初始化」、「條件」、「遞增式」皆可留空,而條件式留空時的效果與while(1)類似。

補充:while迴圈、for迴圈可以省略{}的情況

而迴圈是可以寫在另一個迴圈內的,稱作巢狀迴圈。
而其實執行時的順序跟原本的迴圈一樣,從外層迴圈開始跑,而當執行外層迴圈的程式碼到內層迴圈時,就進入內層迴圈的程式碼直到跳出內層的迴圈。
如此可以用來進行二維、多維陣列的存取,也可以進行一些需要兩兩對應甚至更複雜的重複操作,如以下的九九乘法表就是簡單的例子。

#include<bits/stdc++.h>
using namespace std;
int main(){
    for(int i=1;i<=9;i++){
        for(int j=1;j<=9;j++){
            cout<<i*j<<' ';
        }
        cout<<'\n';
    }
    //會輸出以下內容
    //1 2 3 4 5 6 7 8 9
    //2 4 6 8 10 12 14 16 18
    //3 6 9 12 15 18 21 24 27
    //4 8 12 16 20 24 28 32 36
    //5 10 15 20 25 30 35 40 45
    //(略)
    //9 18 27 36 45 54 63 72 81
}