Quantcast
Channel: C言語 – Japanシーモア
Viewing all articles
Browse latest Browse all 2205

初心者も楽々マスター!C言語のswitch文活用法10選

$
0
0

はじめに

皆さんがプログラミング言語Cを学習する際、様々な制御構文が存在する中で「switch文」について詳しく知りたいと思ったことはありませんか?

この記事ではC言語のswitch文の基本から応用まで、初心者から上級者まで活用できる10のサンプルコードをご紹介します。

●C言語とは

C言語は、1970年代にベル研究所で開発されたプログラミング言語で、その効率の良さと拡張性の高さから、現在でも広く使用されています。

C言語は、オペレーティングシステムや組み込みシステムの開発に特に適しており、その特性を活かすために様々な制御構文が用意されています。

●C言語のswitch文の基本

制御構文の一つである「switch文」は、特定の変数の値によって処理を分岐するための構文です。

基本的な形は以下のようになります。

switch (変数) {
case 値1:
    処理1;
    break;
case 値2:
    処理2;
    break;
default:
    処理3;
}

このコードでは、まずswitch文の括弧内の変数の値を評価します。

その値がcase文に記述された値と一致する場合、その後ろに続く処理を実行します。

処理が終わったら、break文でswitch文から抜け出します。

どのcase文の値とも一致しない場合は、default文の処理を実行します。

●C言語のswitch文の使い方

次に、具体的なサンプルコードを見ながら、switch文の基本的な使い方を見ていきましょう。

○サンプルコード1:基本的なswitch文

#include<stdio.h>

int main() {
    int num = 2;
    switch (num) {
    case 1:
        printf("num is 1.\n");
        break;
    case 2:
        printf("num is 2.\n");
        break;
    default:
        printf("num is not 1 or 2.\n");
    }
    return 0;
}

このコードでは、整数型の変数numの値に応じてprintf関数によるメッセージの出力を切り替えています。

この例ではnumの値が2なので、「num is 2.」と表示します。

○サンプルコード2:break文を使ったswitch文

#include<stdio.h>

int main() {
    int num = 1;
    switch (num) {
    case 1:
        printf("num is 1.\n");
        break;
    case 2:
        printf("num is 2.\n");
        break;
    default:
        printf("num is not 1 or 2.\n");
    }
    return 0;
}

このコードではnumの値が1であるため、「num is 1.」と表示されます。

break文がなければ、次のcaseの処理も実行されてしまいますが、break文によりそれを防ぎます。

○サンプルコード3:default文を使ったswitch文

#include<stdio.h>

int main() {
    int num = 3;
    switch (num) {
    case 1:
        printf("num is 1.\n");
        break;
    case 2:
        printf("num is 2.\n");
        break;
    default:
        printf("num is not 1 or 2.\n");
    }
    return 0;
}

このコードではnumの値が1や2ではないため、「num is not 1 or 2.」と表示されます。

default文は、どのcaseにも該当しないときに実行されます。

●C言語のswitch文の応用例

C言語のswitch文を使った応用例を見ていきましょう。

これまでの基本的な使い方を理解しているなら、もう少し高度な使い方に挑戦できるはずです。

○サンプルコード4:多段階のメニューを作る

このコードでは、switch文を使って多段階のメニューを作成する例を紹介します。

ユーザーからの入力に応じて、さまざまな機能を実行するプログラムを作成します。

#include <stdio.h>

int main() {
    int menu1, menu2;

    printf("メニュー1を選択してください (1-3):\n");
    scanf("%d", &menu1);

    switch (menu1) {
        case 1:
            printf("メニュー1-1を選択してください (1-2):\n");
            scanf("%d", &menu2);

            switch (menu2) {
                case 1:
                    printf("機能1-1-1を実行します。\n");
                    break;
                case 2:
                    printf("機能1-1-2を実行します。\n");
                    break;
                default:
                    printf("無効な選択です。\n");
                    break;
            }
            break;
        case 2:
            printf("メニュー1-2を選択してください (1-2):\n");
            scanf("%d", &menu2);

            switch (menu2) {
                case 1:
                    printf("機能1-2-1を実行します。\n");
                    break;
                case 2:
                    printf("機能1-2-2を実行します。\n");
                    break;
                default:
                    printf("無効な選択です。\n");
                    break;
            }
            break;
        case 3:
            printf("機能1-3を実行します。\n");
            break;
        default:
            printf("無効な選択です。\n");
            break;
    }

    return 0;
}

このコードを実行すると、まずユーザーにメニュー1の選択を促します。

ユーザーが1を選択すると、さらにメニュー1-1の選択を促します。

そして、その選択に応じて異なる機能を実行します。

このように、switch文を入れ子にすることで、より詳細な分岐が可能になります。

○サンプルコード5:関数内でのswitch文の利用

このコードでは、関数内でswitch文を利用する例を紹介します。

ここでは、計算機プログラムを作成します。

ユーザーから2つの数字と、行いたい演算(加算、減算、乗算、除算)を入力してもらい、その結果を返します。

#include <stdio.h>

void calculator(int num1, int num2, char operator) {
    switch (operator) {
        case '+':
            printf("%d + %d = %d\n", num1, num2, num1 + num2);
            break;
        case '-':
            printf("%d - %d = %d\n", num1, num2, num1 - num2);
            break;
        case '*':
            printf("%d * %d = %d\n", num1, num2, num1 * num2);
            break;
        case '/':
            if (num2 != 0)
                printf("%d / %d = %.2f\n", num1, num2, (float)num1 / num2);
            else
                printf("ゼロで除算することはできません。\n");
            break;
        default:
            printf("無効な演算子です。\n");
            break;
    }
}

int main() {
    int num1, num2;
    char operator;

    printf("2つの数値と演算子を入力してください (例: 1 + 2):\n");
    scanf("%d %c %d", &num1, &operator, &num2);

    calculator(num1, num2, operator);

    return 0;
}

このコードでは、関数calculator内でswitch文を使用しています。

ユーザーから入力された演算子に応じて、加算、減算、乗算、除算のいずれかの演算を行います。

○サンプルコード6:複数の条件を組み合わせたswitch文

複雑なプログラムでは、さまざまな条件が組み合わさる場面がよくあります。

そこでC言語のswitch文を使って、複数の条件を組み合わせたコードを実現しましょう。

このコードでは、例えばユーザーからの入力に基づいて異なる処理を行うような状況を想定しています。

#include <stdio.h>

int main() {
    int input1, input2;
    printf("数字を2つ入力してください:");
    scanf("%d %d", &input1, &input2);

    switch(input1) {
        case 1:
            switch(input2) {
                case 1:
                    printf("あなたは1と1を選びました。\n");
                    break;
                case 2:
                    printf("あなたは1と2を選びました。\n");
                    break;
            }
            break;
        case 2:
            switch(input2) {
                case 1:
                    printf("あなたは2と1を選びました。\n");
                    break;
                case 2:
                    printf("あなたは2と2を選びました。\n");
                    break;
            }
            break;
    }

    return 0;
}

この例では、2つの数字(input1とinput2)をユーザーから入力してもらい、それぞれの組み合わせに応じて異なるメッセージを表示しています。

具体的には、最初のswitch文でinput1の値を判定し、それが1の場合と2の場合で処理を分岐しています。

さらに、その中でinput2の値に基づくswitch文を用いて、更に詳細な分岐を行っています。

つまり、2段階のswitch文を使用して、複数の条件を組み合わせた判断を行っています。

このコードを実行し、「1 2」と入力すると、「あなたは1と2を選びました。」というメッセージが表示されます。

同様に、「2 1」と入力すると、「あなたは2と1を選びました。」というメッセージが表示されます。

これにより、2つの入力の組み合わせ全てに対して異なる処理を行うことができます。

以上のように、switch文を用いて複数の条件を組み合わせた複雑な分岐処理を実装することは、プログラムの柔軟性を高め、ユーザーからの様々な入力に対応するための手段となります。

●C言語のswitch文の注意点と対処法

ここで、switch文を使用する際の注意点とその対処法について解説していきます。

これらのポイントを押さえておくことで、思わぬバグを避けることができます。

○break文の重要性

先ほどの例では、各caseの最後にbreak文を用いています。

これはswitch文における非常に重要な要素で、break文がないと、一度条件が合致したcase文から次々にコードが実行されてしまいます。

これを「フォールスルー(fall through)」と呼び、意図しない結果を引き起こす可能性があります。

例えば、次のようなコードを考えてみましょう。

#include <stdio.h>

int main() {
    int num = 1;

    switch (num) {
        case 1:
            printf("1です。\n");
        case 2:
            printf("2です。\n");
        case 3:
            printf("3です。\n");
    }

    return 0;
}

このコードでは、break文を省略しています。その結果、numが1であるにも関わらず、「1です。」「2です。」「3です。」の全てのメッセージが表示されてしまいます。

これが「フォールスルー」の例です。

従って、各case文の最後にはbreak文を忘れずに入れることが大切です。

その一方で、意図的に「フォールスルー」を利用することもあります。

それは、複数のcaseで同じ処理を行いたい場合です。そのような場合には、次のように記述します。

#include <stdio.h>

int main() {
    int num = 1;

    switch (num) {
        case 1:
        case 2:
            printf("1または2です。\n");
            break;
        case 3:
            printf("3です。\n");
            break;
    }

    return 0;
}

このコードでは、numが1でも2でも、「1または2です。」というメッセージが表示されます。

このように、意図的に「フォールスルー」を利用することで、コードを簡潔に保つことができます。

ただし、「フォールスルー」を使う場合には、その意図をコメントで明示すると、他の開発者がコードを理解する助けになります。

○case文の並び順

それでは、C言語のswitch文におけるcase文の並び順について解説していきます。

switch文のcase文の並び順は、あなたが思うよりも重要です。

それはなぜでしょうか?

それは、switch文は上から順に条件を評価し、最初に一致したcase文を実行するからです。

そのため、case文の並び順がプログラムの動作に大きな影響を及ぼす可能性があります。

case文の並び順によって動作が変わるサンプルコードを紹介します。

このコードでは、整数の変数numを使って、その値が0ならば「zero」と表示し、1ならば「one」と表示し、それ以外ならば「other」と表示する処理を行っています。

#include<stdio.h>

int main() {
    int num = 1;

    switch (num) {
    case 0:
        printf("zero\n");
        break;
    case 1:
        printf("one\n");
        break;
    default:
        printf("other\n");
    }

    return 0;
}

このコードを実行すると、「one」と表示されます。

なぜなら、switch文は上から順に評価し、変数numの値が1であるため、最初に一致したcase文(ここではcase 1:)が実行されるからです。

では、case文の順番を変えてみましょう。

例えば、case 0:とcase 1:の順番を逆にします。

#include<stdio.h>

int main() {
    int num = 1;

    switch (num) {
    case 1:
        printf("one\n");
        break;
    case 0:
        printf("zero\n");
        break;
    default:
        printf("other\n");
    }

    return 0;
}

このコードも同様に、「one」と表示されます。

なぜなら、先ほどと同様にswitch文は上から順に評価し、変数numの値が1であるため、最初に一致したcase文(ここではcase 1:)が実行されるからです。

○switch文とif文の使い分け

ここでは、C言語におけるswitch文とif文の使い分けについて考察していきます。

これらは似たような条件分岐の機能を果たしますが、使い方を適切に区別することでコードの可読性と効率性を向上させることができます。

if文は非常に柔軟性が高いのが特徴です。

条件はほぼ無制限で、真偽値を評価するだけでなく、複数の条件を組み合わせた複雑な評価も可能です。

しかし、特定の値に対して多数の条件分岐を行いたい場合には、if文では一つ一つ条件を書かなければならず、コードが長くなることがあります。

int num = 3;
if (num == 1) {
  printf("num is 1\n");
} else if (num == 2) {
  printf("num is 2\n");
} else if (num == 3) {
  printf("num is 3\n");
} else {
  printf("num is not 1, 2, or 3\n");
}

この例では、if文を用いてnumの値が1、2、3のいずれであるかを評価しています。

それぞれの場合について異なるアクションを行い、どれにも該当しない場合には別のアクションを行います。

一方で、switch文は一つの変数の値に基づいて複数の条件分岐を行うのに適しています。

switch文の中では、値が一致したcaseに基づいて処理が行われ、一致するものがない場合にはdefault節が実行されます。

int num = 3;
switch (num) {
  case 1:
    printf("num is 1\n");
    break;
  case 2:
    printf("num is 2\n");
    break;
  case 3:
    printf("num is 3\n");
    break;
  default:
    printf("num is not 1, 2, or 3\n");
}

この例では、switch文を使用して、同じ動作をより簡潔に実現しています。

このように、比較対象が一つで、その値によって挙動が変わるような場合には、switch文の方が適しています。

つまり、簡単に言えば、複数の異なる条件を評価する必要がある場合や条件が複雑な場合はif文を、特定の値に対する複数の分岐を行う場合にはswitch文を使うと良いでしょう。

●C言語のswitch文のカスタマイズ方法

C言語のswitch文はその基本的な使い方だけでなく、さまざまなカスタマイズが可能です。

ここでは、enumを用いたswitch文、マクロを用いたswitch文、変数を用いたcase文の書き方、一部のcaseのみbreakを使わない方法といった具体的なカスタマイズ方法を解説します。

それぞれのカスタマイズ方法を用いると、switch文をより強力に、より柔軟に使用することが可能となります。

○サンプルコード7:enumを用いたswitch文

まずはenumを用いたswitch文の例から見てみましょう。

enumとは列挙型を表すキーワードで、特定の値に名前を付けることができます。

それではサンプルコードを見てみましょう。

#include <stdio.h>

enum Weekdays {
    Monday = 1,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
};

void printDay(enum Weekdays day) {
    switch(day) {
        case Monday:
            printf("月曜日です。\n");
            break;
        case Tuesday:
            printf("火曜日です。\n");
            break;
        case Wednesday:
            printf("水曜日です。\n");
            break;
        case Thursday:
            printf("木曜日です。\n");
            break;
        case Friday:
            printf("金曜日です。\n");
            break;
        case Saturday:
            printf("土曜日です。\n");
            break;
        case Sunday:
            printf("日曜日です。\n");
            break;
        default:
            printf("不正な値です。\n");
            break;
    }
}

int main() {
    printDay(Wednesday);
    return 0;
}

このコードでは、enumを使って曜日を表す変数を定義しています。

その後で、printDay関数内のswitch文では、enumの各値をcase文で分岐しています。

このようにenumを使用することで、数値ではなく名前でcaseを分岐させることが可能となります。

コードの可読性を上げることができ、またenumの値を変更した際にも、それを使用しているswitch文全体を修正する手間を省くことが可能です。

○サンプルコード8:マクロを用いたswitch文

次に、マクロを用いたswitch文の例を見てみましょう。

マクロはプリプロセッサによってコードの一部を置き換えるための機能で、文字列や数値を定数として定義することができます。

マクロを使うことで、コードの一部を一元管理することが可能となります。

#include <stdio.h>

#define MONDAY 1
#define TUESDAY 2
#define WEDNESDAY 3
#define THURSDAY 4
#define FRIDAY 5
#define SATURDAY 6
#define SUNDAY 7

void printDay(int day) {
    switch(day) {
        case MONDAY:
            printf("月曜日です。\n");
            break;
        case TUESDAY:
            printf("火曜日です。\n");
            break;
        case WEDNESDAY:
            printf("水曜日です。\n");
            break;
        case THURSDAY:
            printf("木曜日です。\n");
            break;
        case FRIDAY:
            printf("金曜日です。\n");
            break;
        case SATURDAY:
            printf("土曜日です。\n");
            break;
        case SUNDAY:
            printf("日曜日です。\n");
            break;
        default:
            printf("不正な値です。\n");
            break;
    }
}

int main() {
    printDay(WEDNESDAY);
    return 0;
}

このコードでは、マクロを使って曜日を表す数値を定義しています。

そして、それらをswitch文のcase文で使用しています。

enumと同様に、マクロを使うことで、値そのものではなく名前でcaseを分岐させることが可能となり、コードの可読性を向上させることができます。

○サンプルコード9:変数を用いたcase文の書き方

しかし、switch文のcase文に変数を直接使用することはできません。

したがって、変数の値に応じて分岐させたい場合は、if文やif-else文を使う必要があります。

#include <stdio.h>

int main() {
    int x = 5;
    int y = 10;

    // xとyが等しいか判定
    if (x == y) {
        printf("xとyは等しいです。\n");
    } else {
        printf("xとyは等しくありません。\n");
    }

    return 0;
}

このコードでは、xとyという2つの変数を定義し、それらが等しいかどうかをif文で判定しています。

case文で変数を用いることはできないため、このような場合はif文を使う必要があります。

○サンプルコード10:一部のcaseのみbreakを使わない方法

最後に、一部のcaseのみbreakを使わない方法を見てみましょう。

switch文では、通常、各case文の最後にbreak文を書くことで、それ以降のcase文をスキップします。

しかし、特定のcaseでbreakを書かないことにより、そのcaseが成立した場合でも次のcaseを実行する、ということが可能です。

#include <stdio.h>

void printNumber(int x) {
    switch(x) {
        case 1:
            printf("1です。\n");
            // break文を書かない
        case 2:
            printf("2です。\n");
            break;
        default:
            printf("1でも2でもありません。\n");
            break;
    }
}

int main() {
    printNumber(1);
    return 0;
}

このコードでは、printNumber関数内のswitch文で、xが1の場合と2の場合に異なるメッセージを表示します。

しかし、xが1のcase文の最後にはbreak文を書いていないため、xが1の場合でも”2です。”というメッセージも表示されます。

このように、一部のcaseのみbreakを使わないことで、複数のcaseをまとめて実行するといったことも可能となります。

まとめ

C言語のswitch文は非常に強力な機能であり、基本的な使い方から応用まで、幅広く活用することができます。

enumやマクロを用いたcase文の書き方、一部のcaseのみbreakを使わない方法など、さまざまなカスタマイズも可能なため、それらを理解し、活用することで、あなたのC言語プログラミングはさらに豊かで効率的になります。

本記事を参考に、C言語のswitch文をぜひマスターしてください。


Viewing all articles
Browse latest Browse all 2205

Trending Articles