条件分岐

[C++] switch文で複数条件分岐する方法

C++のswitch文は、特定の変数の値に基づいて複数の条件分岐を行う制御構文です。

switch文では整数型や列挙型などの値を評価し、対応するcaseラベルに基づいて処理を実行します。

caseラベルは一意でなければならず、複数の条件をまとめる場合はcaseを連続して記述し、共通の処理を記述します。

defaultラベルを使用すると、どのcaseにも一致しない場合の処理を指定できます。

複数条件を扱うためのswitch文の工夫

C++のswitch文は、特定の変数の値に基づいて複数の条件分岐を行うための便利な構文です。

しかし、デフォルトでは単一の値に対してのみ条件を評価します。

複数の条件を扱うためには、いくつかの工夫が必要です。

以下にその方法を紹介します。

複数のcaseを使用する

switch文では、同じ処理を複数のcaseで実行することができます。

これにより、同じ処理を複数の条件で実行することが可能です。

#include <iostream>
int main() {
    int value = 2;
    switch (value) {
        case 1: // valueが1の場合
            std::cout << "値は1です。" << std::endl;
            break;
        case 2: // valueが2の場合
        case 3: // valueが3の場合
            std::cout << "値は2または3です。" << std::endl;
            break;
        default: // それ以外の場合
            std::cout << "値は1, 2, 3ではありません。" << std::endl;
            break;
    }
    return 0;
}
値は2または3です。

この例では、valueが2または3の場合に同じメッセージが表示されます。

caseを連続して記述することで、複数の条件を一つの処理にまとめることができます。

条件をグループ化する

複数の条件をグループ化することで、より複雑な条件分岐を実現できます。

例えば、特定の範囲に基づいて処理を分けることができます。

#include <iostream>
int main() {
    int score = 85;
    switch (score / 10) { // scoreを10で割った値を使用
        case 10: // 100点
        case 9:  // 90点以上
            std::cout << "優秀です。" << std::endl;
            break;
        case 8:  // 80点以上
            std::cout << "良い成績です。" << std::endl;
            break;
        case 7:  // 70点以上
            std::cout << "まずまずです。" << std::endl;
            break;
        default: // それ以外
            std::cout << "頑張りましょう。" << std::endl;
            break;
    }
    return 0;
}
良い成績です。

この例では、scoreを10で割った結果を使用して、成績に応じたメッセージを表示しています。

これにより、スコアの範囲に基づいて条件をグループ化することができます。

複数の変数を使用する

switch文では、複数の変数を使用して条件を評価することはできませんが、if文と組み合わせることで実現できます。

以下のように、switch文の前にif文を使って条件を分岐させることができます。

#include <iostream>
int main() {
    int value1 = 1;
    int value2 = 2;
    if (value1 == 1 && value2 == 2) {
        std::cout << "value1は1で、value2は2です。" << std::endl;
    } else {
        switch (value1) {
            case 1:
                std::cout << "value1は1です。" << std::endl;
                break;
            case 2:
                std::cout << "value1は2です。" << std::endl;
                break;
            default:
                std::cout << "value1は1でも2でもありません。" << std::endl;
                break;
        }
    }
    return 0;
}
value1は1で、value2は2です。

このように、if文を使って複数の条件を評価し、必要に応じてswitch文を使用することで、柔軟な条件分岐が可能になります。

実践的なswitch文の使い方

switch文は、特定の値に基づいて異なる処理を実行するための強力なツールです。

ここでは、実際のプログラムでの使用例をいくつか紹介し、switch文の効果的な使い方を解説します。

メニュー選択の例

ユーザーがメニューから選択肢を選ぶ場合、switch文を使って選択肢に応じた処理を行うことができます。

以下は、簡単なメニュー選択の例です。

#include <iostream>
int main() {
    int choice;
    std::cout << "メニューを選択してください:" << std::endl;
    std::cout << "1. オプション1" << std::endl;
    std::cout << "2. オプション2" << std::endl;
    std::cout << "3. オプション3" << std::endl;
    std::cout << "選択: ";
    std::cin >> choice;
    switch (choice) {
        case 1:
            std::cout << "オプション1が選択されました。" << std::endl;
            break;
        case 2:
            std::cout << "オプション2が選択されました。" << std::endl;
            break;
        case 3:
            std::cout << "オプション3が選択されました。" << std::endl;
            break;
        default:
            std::cout << "無効な選択です。" << std::endl;
            break;
    }
    return 0;
}
メニューを選択してください:
1. オプション1
2. オプション2
3. オプション3
選択: 2
オプション2が選択されました。

この例では、ユーザーがメニューから選択肢を選ぶと、その選択に応じたメッセージが表示されます。

defaultケースを使うことで、無効な選択に対する処理も行っています。

数値の評価

switch文は、数値の評価にも適しています。

以下の例では、数値の範囲に基づいて異なるメッセージを表示します。

#include <iostream>
int main() {
    int number;
    std::cout << "数値を入力してください: ";
    std::cin >> number;
    switch (number) {
        case 1:
        case 2:
        case 3:
            std::cout << "数値は1, 2, または3です。" << std::endl;
            break;
        case 4:
        case 5:
            std::cout << "数値は4または5です。" << std::endl;
            break;
        default:
            std::cout << "数値は1から5の範囲外です。" << std::endl;
            break;
    }
    return 0;
}
数値を入力してください: 4
数値は4または5です。

この例では、入力された数値に応じて異なるメッセージが表示されます。

複数のcaseをまとめることで、同じ処理を簡潔に記述しています。

文字列の評価

C++の標準のswitch文では文字列を直接扱うことはできませんが、enum型を使って文字列の代わりに数値を使用することができます。

以下はその例です。

#include <iostream>
#include <string>
enum class Fruit { Apple = 1, Banana, Orange };
int main() {
    int choice;
    std::cout << "果物を選択してください:" << std::endl;
    std::cout << "1. りんご" << std::endl;
    std::cout << "2. バナナ" << std::endl;
    std::cout << "3. オレンジ" << std::endl;
    std::cout << "選択: ";
    std::cin >> choice;
    switch (static_cast<Fruit>(choice)) {
        case Fruit::Apple:
            std::cout << "りんごが選択されました。" << std::endl;
            break;
        case Fruit::Banana:
            std::cout << "バナナが選択されました。" << std::endl;
            break;
        case Fruit::Orange:
            std::cout << "オレンジが選択されました。" << std::endl;
            break;
        default:
            std::cout << "無効な選択です。" << std::endl;
            break;
    }
    return 0;
}
果物を選択してください:
1. りんご
2. バナナ
3. オレンジ
選択: 1
りんごが選択されました。

この例では、enum型を使用して果物の選択肢を定義し、switch文でその選択肢に基づいて処理を行っています。

これにより、コードがより読みやすくなります。

switch文は、条件分岐を簡潔に記述するための強力なツールです。

メニュー選択や数値の評価、enum型を使った文字列の代替など、さまざまな場面で活用できます。

適切に使用することで、コードの可読性と保守性を向上させることができます。

switch文での注意点と制限

C++のswitch文は非常に便利ですが、使用する際にはいくつかの注意点や制限があります。

これらを理解しておくことで、より効果的にswitch文を活用できるようになります。

以下に主な注意点と制限を示します。

1. 値の型に制限がある

switch文では、整数型(int、char、enumなど)の値のみを使用できます。

浮動小数点数(float、double)や文字列(std::string)を直接使用することはできません。

#include <iostream>
int main() {
    double value = 2.5; // 浮動小数点数
    // switch (value) { // エラー: switch文には整数型のみ使用可能
    //     case 2.5:
    //         std::cout << "値は2.5です。" << std::endl;
    //         break;
    // }
    return 0;
}

このように、switch文には使用できる値の型に制限があるため、注意が必要です。

2. caseの重複に注意

同じcaseラベルを複数回使用することはできません。

重複したcaseラベルがあると、コンパイルエラーが発生します。

#include <iostream>
int main() {
    int value = 1;
    switch (value) {
        case 1:
            std::cout << "値は1です。" << std::endl;
            break;
        case 1: // エラー: caseラベルが重複しています
            std::cout << "再度、値は1です。" << std::endl;
            break;
        default:
            std::cout << "値は1ではありません。" << std::endl;
            break;
    }
    return 0;
}

このように、caseラベルの重複には注意が必要です。

3. break文の重要性

switch文の各caseの最後には通常、break文を記述します。

break文がない場合、次のcaseに処理が流れ込む「フォールスルー」が発生します。

これにより、意図しない動作を引き起こす可能性があります。

#include <iostream>
int main() {
    int value = 2;
    switch (value) {
        case 1:
            std::cout << "値は1です。" << std::endl;
            break;
        case 2:
            std::cout << "値は2です。" << std::endl;
            // break; // コメントアウトするとフォールスルーが発生
        case 3:
            std::cout << "値は3です。" << std::endl;
            break;
        default:
            std::cout << "値は1, 2, 3ではありません。" << std::endl;
            break;
    }
    return 0;
}
値は2です。
値は3です。

この例では、valueが2の場合に、意図せず3のメッセージも表示されています。

break文を忘れないようにしましょう。

4. defaultケースの重要性

defaultケースは、どのcaseにも一致しない場合の処理を定義するために使用されます。

defaultケースを設定しないと、無効な入力に対する処理が行われず、プログラムが予期しない動作をする可能性があります。

#include <iostream>
int main() {
    int value = 4; // 無効な値
    switch (value) {
        case 1:
            std::cout << "値は1です。" << std::endl;
            break;
        case 2:
            std::cout << "値は2です。" << std::endl;
            break;
        // defaultケースがないため、無効な値に対する処理がない
    }
    return 0;
}

この場合、valueが4の場合、何も出力されません。

defaultケースを追加することで、無効な入力に対する処理を行うことができます。

5. switch文のネストに注意

switch文をネストして使用することも可能ですが、可読性が低下するため注意が必要です。

ネストが深くなると、コードの理解が難しくなります。

#include <iostream>
int main() {
    int outerValue = 1;
    int innerValue = 2;
    switch (outerValue) {
        case 1:
            std::cout << "外側の値は1です。" << std::endl;
            switch (innerValue) {
                case 1:
                    std::cout << "内側の値は1です。" << std::endl;
                    break;
                case 2:
                    std::cout << "内側の値は2です。" << std::endl;
                    break;
            }
            break;
        default:
            std::cout << "外側の値は1ではありません。" << std::endl;
            break;
    }
    return 0;
}
外側の値は1です。
内側の値は2です。

このように、switch文をネストすることは可能ですが、コードが複雑になりやすいため、適切に使用することが重要です。

switch文は便利な構文ですが、使用する際には型の制限やcaseの重複、break文の重要性、defaultケースの必要性、ネストの可読性などに注意が必要です。

これらのポイントを理解し、適切に使用することで、より効果的なプログラムを作成できます。

switch文を使った応用例

switch文は、さまざまな場面での条件分岐に利用できる強力なツールです。

ここでは、実際のプログラムでの応用例をいくつか紹介し、switch文の効果的な使い方を解説します。

1. 曜日を表示するプログラム

ユーザーが入力した数値に基づいて、曜日を表示するプログラムの例です。

1から7までの数値を入力すると、それに対応する曜日が表示されます。

#include <iostream>
int main() {
    int day;
    std::cout << "曜日を選択してください (1-7): ";
    std::cin >> day;
    switch (day) {
        case 1:
            std::cout << "月曜日" << std::endl;
            break;
        case 2:
            std::cout << "火曜日" << std::endl;
            break;
        case 3:
            std::cout << "水曜日" << std::endl;
            break;
        case 4:
            std::cout << "木曜日" << std::endl;
            break;
        case 5:
            std::cout << "金曜日" << std::endl;
            break;
        case 6:
            std::cout << "土曜日" << std::endl;
            break;
        case 7:
            std::cout << "日曜日" << std::endl;
            break;
        default:
            std::cout << "無効な入力です。" << std::endl;
            break;
    }
    return 0;
}
曜日を選択してください (1-7): 3
水曜日

このプログラムでは、ユーザーが入力した数値に基づいて、対応する曜日を表示します。

無効な入力に対してはdefaultケースでエラーメッセージを表示します。

2. 簡易電卓

switch文を使って、簡単な電卓を作成することもできます。

ユーザーが選択した演算子に基づいて、2つの数値の計算を行います。

#include <iostream>
int main() {
    double num1, num2;
    char operation;
    std::cout << "1つ目の数値を入力してください: ";
    std::cin >> num1;
    std::cout << "演算子 (+, -, *, /) を入力してください: ";
    std::cin >> operation;
    std::cout << "2つ目の数値を入力してください: ";
    std::cin >> num2;
    switch (operation) {
        case '+':
            std::cout << "結果: " << num1 + num2 << std::endl;
            break;
        case '-':
            std::cout << "結果: " << num1 - num2 << std::endl;
            break;
        case '*':
            std::cout << "結果: " << num1 * num2 << std::endl;
            break;
        case '/':
            if (num2 != 0) {
                std::cout << "結果: " << num1 / num2 << std::endl;
            } else {
                std::cout << "エラー: ゼロで割ることはできません。" << std::endl;
            }
            break;
        default:
            std::cout << "無効な演算子です。" << std::endl;
            break;
    }
    return 0;
}
1つ目の数値を入力してください: 10
演算子 (+, -, *, /) を入力してください: *
2つ目の数値を入力してください: 5
結果: 50

このプログラムでは、ユーザーが選択した演算子に基づいて計算を行います。

ゼロで割る場合にはエラーメッセージを表示します。

3. ゲームのメニュー

ゲームのメニューを作成する際にもswitch文が役立ちます。

以下は、ゲームのメニューから選択肢を選ぶ例です。

#include <iostream>
int main() {
    int choice;
    std::cout << "ゲームメニュー:" << std::endl;
    std::cout << "1. 新しいゲーム" << std::endl;
    std::cout << "2. 設定" << std::endl;
    std::cout << "3. 終了" << std::endl;
    std::cout << "選択: ";
    std::cin >> choice;
    switch (choice) {
        case 1:
            std::cout << "新しいゲームを開始します。" << std::endl;
            break;
        case 2:
            std::cout << "設定メニューを開きます。" << std::endl;
            break;
        case 3:
            std::cout << "ゲームを終了します。" << std::endl;
            break;
        default:
            std::cout << "無効な選択です。" << std::endl;
            break;
    }
    return 0;
}
ゲームメニュー:
1. 新しいゲーム
2. 設定
3. 終了
選択: 1
新しいゲームを開始します。

このプログラムでは、ユーザーがゲームメニューから選択肢を選ぶと、その選択に応じたメッセージが表示されます。

無効な選択に対してはdefaultケースでエラーメッセージを表示します。

4. カードゲームのスコア計算

カードゲームのスコアを計算する際にもswitch文を使用できます。

以下は、カードの種類に応じてスコアを計算する例です。

#include <iostream>
int main() {
    char cardType;
    int score = 0;
    std::cout << "カードの種類を入力してください (A, K, Q, J, 2-10): ";
    std::cin >> cardType;
    switch (cardType) {
        case 'A':
            score = 11; // エース
            break;
        case 'K':
        case 'Q':
        case 'J':
            score = 10; // 王、女王、ジャック
            break;
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
        case '10':
            score = cardType - '0'; // 数字カード
            break;
        default:
            std::cout << "無効なカードの種類です。" << std::endl;
            return 1; // エラー終了
    }
    std::cout << "スコア: " << score << std::endl;
    return 0;
}
カードの種類を入力してください (A, K, Q, J, 2-10): K
スコア: 10

このプログラムでは、入力されたカードの種類に基づいてスコアを計算します。

無効なカードの種類に対してはエラーメッセージを表示します。

switch文は、さまざまな場面での条件分岐に利用できる強力なツールです。

曜日の表示、簡易電卓、ゲームのメニュー、カードゲームのスコア計算など、実際のプログラムでの応用例を通じて、switch文の効果的な使い方を学ぶことができます。

これらの例を参考にして、実際のプログラムに応用してみてください。

まとめ

この記事では、C++のswitch文を使った複数条件分岐の方法や実践的な応用例について詳しく解説しました。

switch文は、特定の値に基づいて異なる処理を行うための便利な構文であり、メニュー選択や計算、ゲームのロジックなど、さまざまな場面で活用できます。

これらの知識を活かして、実際のプログラムにswitch文を取り入れ、より効率的な条件分岐を実現してみてください。

関連記事

Back to top button