talosのプログラミング教室

はじめてのC++ ~制御文編~

スポンサーリンク

f:id:talosta:20200330151413p:plain


今回はC++制御文の説明をします。

アルゴリズムを実装するために非常に重要なところなのでしっかり覚えましょう。

if文

条件分岐をする制御文です。

#include <iostream>

int main() {
    int a = 0;

    if (a == 0) {
        std::cout << "true\n";
    }

    return 0;
}
true

if文は( )の中がtrue(真)のときはその後の{ }の中を実行し、false(偽)のときは実行しません。

{ }がない場合は直後の1文だけが実行されます。

「a == 0」というのは「aが0に等しい」ということを表しています。

C++の場合、「a = 0」と書くとaに0を代入するという意味なので注意しましょう。

関係演算子の一覧を以下に示します。


関係演算子 意味
== 左項と右項が等しい
!= 左項と右項が等しくない
> 左項が右項より大きい
< 左項が右項より小さい
>= 左項が右項以上
<= 左項が右項以下

if-else文

ifの後にelseを追加することで、if( )の中が偽の場合の処理を指定できます。

#include <iostream>

int main() {
    int a = 1;

    if (a == 0) {
        std::cout << "true\n";
    }
    else {
        std::cout << "false\n";
    }

    return 0;
}
false

また、elseとifを組み合わせることで3つ以上に条件分岐させることもできます。

#include <iostream>

int main() {
    int a = 2;

    if (a == 0) {
        std::cout << "0\n";
    }
    else if (a == 1){
        std::cout << "1\n";
    }
    else {
        std::cout << "a is neither 0 nor 1.\n";
    }

    return 0;
}
a is neither 0 nor 1.

for文

for文は繰返しを行う制御文です。

#include <iostream>

int main() {
    for (int i = 0; i < 5; i++) {
        std::cout << i << "\n";
    }

    return 0;
}
0
1
2
3
4

( )の中にセミコロン区切りで3つの文を書きます。

1つ目は初期化です。

上の例ではiを0で初期化しています。

2つ目は繰返しを続ける条件です。

上の例ではiが5以上になるまで繰返しを続けるように指定しています。

5以上になったら繰返しは終わるので5は出力されていません。

3つ目は増減幅です。

上の例では繰返しが1回終わるごとに、iを+1しています。

while文

while文も繰返しを行う制御文です。

#include <iostream>

int main() {
    int i = 0;

    while(i < 5) {
        std::cout << i << "\n";
        i++;
    }

    return 0;
}
0
1
2
3
4

for文の例と同じことをしたプログラムです。

これだけ見るとfor文のほうがすっきりしていますが、while文のほうが適している状況もあります。

それは繰返しの条件が数値ではないときです。

例えば、キーボードで入力を受け付け、ある文字が入力されるまでは処理を続けるという場合。

// whileを用いた場合

#include <iostream>

int main() {
    std::string str;

    // endと入力されるまでループ
    while (str != "end") {
        // 標準入力
        std::cin >> str;
    }

    return 0;
}
// forを用いた場合

#include <iostream>

int main() {
    std::string str;

    // endと入力されるまでループ
    for ( ; ; ) {
        // 標準入力
        std::cin >> str;

        if (str == "end") {
            break;
        }
    }

    return 0;
}

whileを用いたほうがすっきりしていますよね。

このように上手く使い分けることで見やすいコードを書くことができます。

do-while文

whileでは条件によっては1回も{ }内の処理を行わず終了することがありますが、do-whileでは必ず1回は{ }内の処理を行います。

例えば、

#include <iostream>

int main() {
    int i = 10;

    while (i < 5) {
        std::cout << i << "\n";
        i++;
    }

    return 0;
}

上記のコードでは、iは最初から10でwhileの条件が i < 5 なので、{ }の中の処理は一度も行われずに終了します。

これをdo-whileにすると、

#include <iostream>

int main() {
    int i = 5;

    do {
        std::cout << i << "\n";
        i++;
    } while (i < 5);

    return 0;
}
5

と一度だけ{ }の中の処理が行われていることがわかります。

break文

break文はループを強制終了させることができます。

#include <iostream>

int main() {
    for (int i = 0; i < 10; i++) {
        std::cout << i << "\n";
        if (i == 5) {
            break;
        }
    }

    return 0;
}
0
1
2
3
4
5

iが5に等しいときに強制終了したため、それ以降は出力されません。

continue文

continue文はそれ以降の処理をスキップし、次の繰返しに移ります。

言葉ではわかりにくいと思うので、コードをしっかり読んで理解してください。

#include <iostream>

int main() {
    for (int i = 0; i < 10; i++) {
        if (i == 5) {
            continue;
        }
        std::cout << i << "\n";
    }
    
    return 0;
}
0
1
2
3
4
6
7
8
9

iが5に等しいときはcontinue以降の処理をスキップするため、5だけ表示されていません。

switch文

switch文はif文の複数バージョンです。

if文でもelseを使えば複数に条件分岐できますが、見栄えがよくありません。

3つ以上に分岐するときはswitch文を使うとよいでしょう。

switch文は以下のように使います。

#include <iostream>

int main() {
    int i = 3;

    switch(i) {
        case 1:
            std::cout << "one\n";
            break;
        case 2:
            std::cout << "two\n";
            break;
        case 3:
            std::cout << "three\n";
            break;
    }

    return 0;
}
three

breakがないとそれ以降の処理をすべて実行してしまいますので、忘れないようにしましょう。

おわりに

今回はC++制御文について説明しました。

次回はクラスについて説明します。