if文と条件演算子 解答ページ | Programming Place Plus 新C++編

トップページ新C++編if文と条件演算子

このページの概要

このページは、練習問題の解答例や解説のページです。



解答・解説

問題1 (確認★)

次のプログラムを実行したとき、B が出力されるのは、変数 value の値が以下のいずれのときですか? すべて選んでください。

#include <iostream>

int main()
{
    int value {};

    if (value <= 10) {
        std::cout << "A\n";
    }
    else {
        std::cout << "B\n";
    }
}


B が出力されるということは、value <= 10 が false になるときということです。value <= 10 は「変数value の値が 10 以下である」といっているので、その逆になる場合です。

「以下」の逆は「以上」ではなく、「より大きい」であることに注意してください。条件が逆であるということは、true だったものが false になり、false だったものが true にならなければならないからです。「以下」と「以上」はいずれも「同じ」であることを含んでいますから、「同じ」だったときの結果が逆になりません。

そのため、else の方にいくのは「変数value の値が 10 より大きいとき」です。選択肢の中でこれを満たしているのは、「15」だけです。

問題2 (確認★)

switch文で書かれた次の分岐構造を、if文で書き換えてください。

#include <iostream>

int main()
{
    std::cout << "Please enter the integer.\n";
    int value {};
    std::cin >> value;

    switch (value) {
    case 0:
        std::cout << "A\n";
        break;
    case 1:
        std::cout << "B\n";
        break;
    case 2:
        std::cout << "C\n";
        break;
    default:
        std::cout << "X\n";
        break;
    }
}


switch文は、if文で書き換えられます。caseラベルごとに else if を並べ、defaultラベルの代わりに単独の else を使えばいいです。

#include <iostream>

int main()
{
    std::cout << "Please enter the integer.\n";
    int value {};
    std::cin >> value;

    if (value == 0) {
        std::cout << "A\n";
    }
    else if (value == 1) {
        std::cout << "B\n";
    }
    else if (value == 2) {
        std::cout << "C\n";
    }
    else {
        std::cout << "X\n";
    }
}

実行結果:

Please enter the integer.
2  <-- 入力した整数
C
Please enter the integer.
3  <-- 入力した整数
X

ただし、このプログラムのように、caseラベルに書く値が連続的な場合は、switch文で書いた方が自然ですし、実行時の効率も高い可能性があります。

問題3 (基本★)

2つの整数の入力を受け取り、大きい方の値を出力するプログラムを作成してください。if文を使う場合と、条件演算子を使う場合とで書いてみてください。


if文を使う場合は次のように書けます。

#include <iostream>

int main()
{
    std::cout << "Please enter two integers.\n";
    int a {};
    int b {};
    std::cin >> a >> b;

    if (a > b) {
        std::cout << a << "\n";
    }
    else {
        std::cout << b << "\n";
    }
}

実行結果:

Please enter two integers.
20 10  <-- 入力した整数
20

a と b の値が同じだった場合は、どちらの値を出力しても同じことですから、if文の条件式a >= b としても構いません。もちろん、a < b のように反対にして、true の場合と false の場合に実行する処理を入れ替えても同じ結果になります。

条件演算子を使う場合は、次のように書けます。

#include <iostream>

int main()
{
    std::cout << "Please enter two integers.\n";
    int a {};
    int b {};
    std::cin >> a >> b;

    std::cout << (a > b ? a : b) << "\n";
}

実行結果:

Please enter two integers.
20 10  <-- 入力した整数
20

条件演算子の場合は、式であり、結果の値がつくられるため、std::cout を使った文の中に埋め込んでしまえます。構文の都合で、( ) で囲まないとコンパイルエラーになります(本編解説)。

問題4 (基本★★)

入力されたスコアに応じて、以下のように * を出力したいとします。

そこで、次のようなプログラムを書きましたが、これは間違っています。その理由を答え、正しいプログラムを書いてください。

#include <iostream>

int main()
{
    std::cout << "Please enter the score.\n";
    int score {};
    std::cin >> score;

    if (score < 40) {
        std::cout << "\n";
    }
    else if (score >= 40) {
        std::cout << "*\n";
    }
    else if (score >= 70) {
        std::cout << "**\n";
    }
    else if (score == 100) {
        std::cout << "***\n";
    }
}


たとえば 80 を入力されたとすると、** が出力されることを望んでいる訳ですが、このプログラムでは、* が出力されます。

こうなってしまうのは、上にある if から順番に調べていくからです。

1つ目の if文の条件式は score < 40 です。80 が入力されたのなら、これは false になりますから、else に進みます。

そこには else if (score >= 40) があります。score には 80 が入っているので、この判定は true になります。したがって、*\n を出力して終了してしまいます。

これは条件式を並べる順番が悪いのです。以下のように並び替えると解決します。

#include <iostream>

int main()
{
    std::cout << "Please enter the score.\n";
    int score {};
    std::cin >> score;

    if (score == 100) {
        std::cout << "***\n";
    }
    else if (score >= 70) {
        std::cout << "**\n";
    }
    else if (score >= 40) {
        std::cout << "*\n";
    }
    else {
        std::cout << "\n";
    }
}

実行結果:

Please enter the score.
80  <-- 入力したスコア
**

「大きい・小さい」「以上・以下」の判定を使った条件で else if を並べるとき、その並び順は重要です。

問題5 (応用★★)

1 から 50 までの整数の中で、4 の倍数のものだけを出力するプログラムを作成してください。ただし、for文と if文を使うようにしてください。

実行結果はこうなります。

4
8
12
16
20
24
28
32
36
40
44
48


for文と if文を組み合わせて実現します。4 の倍数かどうかは、4 で割ったときに余りが出ないことで分かります。

#include <iostream>

int main()
{
    for (int i = 1; i <= 50; ++i) {
        if (i % 4 == 0) {
            std::cout << i << "\n";
        }
    }
}

実行結果:

4
8
12
16
20
24
28
32
36
40
44
48

問題6 (応用★★)

for文」のページで取り上げた電卓プログラム(ソースコードは以下に再掲)を改造して、ゼロ除算を回避するようにしてください。たとえば、“zero divide.” のような文字列を出力するといった対応をしてください。

#include <iostream>
#include <string>

int main()
{
    constexpr auto addition = '+';
    constexpr auto subtraction = '-';
    constexpr auto multiplication = '*';
    constexpr auto division = '/';

    for (int i = 0; i < 5; ++i) {
        std::cout << "Please enter the formula.\n";
        int value1 {};
        std::string op {};
        int value2 {};
        std::cin >> value1 >> op >> value2;

        switch (op[0]) {
        case addition:
            std::cout << value1 + value2 << "\n";
            break;
        case subtraction:
            std::cout << value1 - value2 << "\n";
            break;
        case multiplication:
            std::cout << value1 * value2 << "\n";
            break;
        case division:
            std::cout << value1 / value2 << "\n";
            break;
        default:
            std::cout << "The formula is incorrect.\n";
            break;
        }
    }
}


除算のところに if文を追加すればいいです。

#include <iostream>
#include <string>

int main()
{
    constexpr auto addition = '+';
    constexpr auto subtraction = '-';
    constexpr auto multiplication = '*';
    constexpr auto division = '/';

    for (int i = 0; i < 5; ++i) {
        std::cout << "Please enter the formula.\n";
        int value1 {};
        std::string op {};
        int value2 {};
        std::cin >> value1 >> op >> value2;

        switch (op[0]) {
        case addition:
            std::cout << value1 + value2 << "\n";
            break;
        case subtraction:
            std::cout << value1 - value2 << "\n";
            break;
        case multiplication:
            std::cout << value1 * value2 << "\n";
            break;
        case division:
            if (value2 == 0) {
                std::cout << "zero divide.\n";
            }
            else {
                std::cout << value1 / value2 << "\n";
            }
            break;
        default:
            std::cout << "The formula is incorrect.\n";
            break;
        }
    }
}

実行結果:

Please enter the formula.
3 / 0  <-- 入力した計算式
zero divide.
Please enter the formula.
3 / 1  <-- 入力した計算式
3
Please enter the formula.
3 / 2  <-- 入力した計算式
1
Please enter the formula.
3 / 3  <-- 入力した計算式
1
Please enter the formula.
3 / 4  <-- 入力した計算式
0

電卓プログラムに限らず、ゼロ除算の可能性がある場面では、このように if文を使って回避します。


参考リンク



更新履歴




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