論理演算 解答ページ | Programming Place Plus C言語編 第15章

トップページC言語編第15章

問題① 🔗

問題① 次のうち、結果が「真」になるものをすべて選んでください。a の値は 10、b の値は 20 とします。

  1. a == 10 && b == 20
  2. a == 10 && b == 10
  3. a != b || a == 0
  4. !(a == b)
  5. !(a == 10 || b == 10)
  6. a % 2 != 0 || a == 10 && b == 20


1番は、論理積演算子(&&)を使って、2つの条件式をつないでいます。論理積演算子は、まず左側のオペランド(a == 10)を評価します。これは 1(真)です。左側のオペランドが 0以外の場合にかぎって、右側のオペランド(b == 20)の評価に進みます。こちらも 1(真)なので、全体の結果は 1 になります。

2番も論理積演算子を使っています。1番と同様に、左側のオペランド(a == 10)を評価し、これは 1(真)になります。続いて、右側のオペランド(b == 10)を評価します。こちらは 0(偽)になるので、全体の結果は 0(偽)です。

3番は、論理和演算子(||)を使っています。論理和演算子は、まず左側のオペランド(a != b)を評価します。これは 1(真)です。左側のオペランドが 0以外であった時点で、全体の結果は真で確定し、右側のオペランドは評価されません。

4番は、論理否定演算子(!)を使っています。論理否定演算子は、条件式の結果を逆(0 なら 1 に、0以外なら 0)にします。条件式は (a == b) で、これは 0 ですから、全体の結果は 1 になります。なお、!(a == b) という条件式は、a != b と同じ意味です。

5番は、論理否定演算子を適用する対象が (a == 10 || b == 10) となっています。論理和演算子のルールにしたがって、左側のオペランド(a == 10)が評価され、これが 1(真)なので、この条件式の結果は 1(真)であることが確定します。この結果を、論理否定演算子によって逆にするので、全体の結果は 0(偽)です。

6番は、論理和演算子と論理積演算子が混在しています。演算子の優先順位は、論理積演算子のほうが高いため、この式は a % 2 != 0 || (a == 10 && b == 20) と同等です。オペランドの評価順としては、論理和演算子が短絡評価であるため、まず左側のオペランド(e % 2 != 0)が評価されます。この結果は 0(偽)なので、次に右側のオペランド((a == 10 && b == 20))を評価します。こちらは論理積演算子を含んでおり、これも短絡評価なので、先に左側のオペランド(a == 10)を評価します。これは 1(真)になるので、右側のオペランド(b == 20)の評価に進み、こちらも 1(真)です。論理積演算子の両オペランドが 0以外なので、(a == 10 && b == 20) は 1(真)です。よって、0 || 1 が残り、最終的に結果は 1(真)ということになります。

したがって、真になるのは、1、3、4、6です。

問題② 🔗

問題② 標準入力から受け取った整数が、次の条件をすべて満たすときに、標準出力へ「OK!」と出力するプログラムを作ってください。


すべて満たす場合なので、論理積演算子を使って、3つの条件式を結べばいいです。

#include <stdio.h>

// 整数の入力を受け取る
// 戻り値: 標準入力から整数の入力を受け取り、その値を返す。
int get_input_integer(void)
{
    char s[40];
    fgets(s, sizeof(s), stdin);
    int value;
    sscanf(s, "%d", &value);
    return value;
}

int main(void)
{
    puts("Please enter the integer.");
    int value = get_input_integer();

    if (value % 2 != 0 && 200 <= value && value < 500) {
        puts("OK!");
    }
}

実行結果:

Please enter the integer.
303  <-- 入力された内容
OK!

問題③ 🔗

問題③ 標準入力から受け取った西暦年が、閏年かどうか判定するプログラムを作成してください。
※閏年の定義を正確に知っていますか?「4年に1度」だけでは不正解です。


閏年の定義は、以下のようになります。

これを踏まえると、次のようなプログラムになります。

#include <stdio.h>

// 整数の入力を受け取る
// 戻り値: 標準入力から整数の入力を受け取り、その値を返す。
int get_input_integer(void)
{
    char s[40];
    fgets(s, sizeof(s), stdin);
    int value;
    sscanf(s, "%d", &value);
    return value;
}

int main(void)
{
    puts("Please enter the year.");
    int year = get_input_integer();

    if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0))) {
        puts("Leap year");
    }
    else{
        puts("Not leap year");
    }
}

実行結果:

Please enter the year.
2004  <-- 入力された内容
Leap year
Please enter the year.
2000  <-- 入力された内容
Leap year
Please enter the year.
1900  <-- 入力された内容
Not leap year


参考リンク 🔗


更新履歴 🔗



第15章のメインページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る