C言語

【C言語】第2章第3回:複雑な条件文:論理演算子の応用

論理演算子は、複数の条件を組み合わせて記述する際に欠かせないツールです。この章では、&&(論理積)、||(論理和)、および!(否定)の使い方を中心に、複雑な条件文を実装する方法を詳しく解説します。

1. 論理演算子とは?

論理演算子を使用することで、複数の条件を組み合わせて、より柔軟な条件分岐を実現できます。

  • &&(論理積):すべての条件が真である場合にtrueを返す。
  • ||(論理和):いずれか1つの条件が真である場合にtrueを返す。
  • !(否定):条件の真偽を反転させる。

2. 複数条件の組み合わせ

例1:論理積(&&)を使用した条件文

#include <stdio.h>

int main() {
    int age = 25;
    int income = 50000;

    // 複数条件を組み合わせて判定
    if (age >= 18 && income >= 30000) {
        printf("Eligible for the premium plan.\n");
    } else {
        printf("Not eligible for the premium plan.\n");
    }

    return 0;
}

解説:

  • 条件age >= 18が真であり、かつincome >= 30000が真の場合に"Eligible for the premium plan."が出力されます。
  • いずれかの条件が偽である場合、"Not eligible for the premium plan."が出力されます。

例2:論理和(||)を使用した条件文

#include <stdio.h>

int main() {
    int temperature;

    printf("Enter the temperature: ");
    scanf("%d", &temperature);

    if (temperature < 0 || temperature > 35) {
        printf("Extreme weather warning.\n");
    } else {
        printf("Weather conditions are normal.\n");
    }

    return 0;
}

解説:条件temperature < 0またはtemperature > 35のいずれかが真である場合、警告メッセージが出力されます。

3. 否定(!)の使い方

!演算子を使用することで、条件式の結果を反転させることができます。

例:否定演算子の使用

#include <stdio.h>

int main() {
    int isMember = 0; // 会員ではない

    if (!isMember) {
        printf("Non-member fee applies.\n");
    } else {
        printf("Member discount applies.\n");
    }

    return 0;
}

解説:変数isMemberが0(偽)である場合、否定演算子によってif条件が真と評価されます。

4. 複雑な条件文の実装例

複数の論理演算子を組み合わせることで、複雑な条件文を記述できます。

例:複数の条件を組み合わせたプログラム

#include <stdio.h>

int main() {
    int age = 20;
    int hasID = 1; // 身分証を持っている
    int hasTicket = 0; // チケットを持っていない

    if ((age >= 18 && hasID) || hasTicket) {
        printf("Access granted.\n");
    } else {
        printf("Access denied.\n");
    }

    return 0;
}

解説:

  • 年齢が18歳以上で身分証を持っている場合、またはチケットを持っている場合にアクセスが許可されます。
  • すべての条件が偽である場合、アクセスは拒否されます。

5. 練習問題

以下の課題に挑戦し、論理演算子の使い方をマスターしてください。

  1. 入力された数が0より大きく10以下である場合に「有効な範囲」、それ以外の場合に「無効な範囲」と出力するプログラムを作成してください。
  2. ユーザーの年齢を入力し、18歳以上または特別許可を持つ場合に「許可」、それ以外は「拒否」と出力するプログラムを作成してください。
  3. 3つの整数を入力し、それらのうち2つ以上が正の数である場合に「条件を満たす」と出力するプログラムを作成してください。

6. 練習問題の解答と解説

問1の解答

#include <stdio.h>

int main() {
    int number;

    printf("Enter a number: ");
    scanf("%d", &number);

    if (number > 0 && number <= 10) {
        printf("Valid range.\n");
    } else {
        printf("Invalid range.\n");
    }

    return 0;
}

問2の解答

#include <stdio.h>

int main() {
    int age, specialPermission;

    printf("Enter your age: ");
    scanf("%d", &age);

    printf("Do you have special permission? (1 for yes, 0 for no): ");
    scanf("%d", &specialPermission);

    if (age >= 18 || specialPermission) {
        printf("Permission granted.\n");
    } else {
        printf("Permission denied.\n");
    }

    return 0;
}

問3の解答

#include <stdio.h>

int main() {
    int a, b, c;

    printf("Enter three numbers: ");
    scanf("%d %d %d", &a, &b, &c);

    if ((a > 0 && b > 0) || (a > 0 && c > 0) || (b > 0 && c > 0)) {
        printf("Conditions met.\n");
    } else {
        printf("Conditions not met.\n");
    }

    return 0;
}

7. まとめ

論理演算子を活用することで、複雑な条件分岐を効率的に記述することが可能です。練習問題を通じて使い方をマスターし、実践的なプログラムに応用してみましょう。