論理値 解答ページ | Programming Place Plus 新C++編

トップページ新C++編論理値

このページの概要

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



解答・解説

問題1 (確認★)

次のプログラムの実行結果はどうなりますか?

#include <iostream>

int main()
{
    int value1 {10};
    int value2 {20};

    std::cout << std::boolalpha
              << (value1 == value2) << "\n"
              << (value1 != value2) << "\n"
              << (value1 < value2) << "\n"
              << (value1 <= value2) << "\n"
              << (value1 > value2) << "\n"
              << (value1 >= value2) << "\n";
}


2種類の等価演算子本編解説)と、4種類の関係演算子本編解説)を使って、10 と 20 を比較しています。これらの演算子は、それぞれの意味を満たしていれば true、満たしていなければ false になります。

また、std::boolalpha を使っているので、出力結果は true や false の文字列表現になります(使っていなければ、01 が出力されます)(本編解説)。

実行結果:

false
true
true
true
false
false

問題2 (確認★)

次のプログラムの実行結果はどうなりますか?

#include <iostream>

int main()
{
    int value {0};

    std::cout << true << "\n";
    std::cout << false << "\n";
    std::cout << (value == 0) << "\n";
    std::cout << (value != 0) << "\n";
    std::cout << std::boolalpha << (value == 0) << "\n";
    std::cout << std::boolalpha << (value != 0) << "\n";
    std::cout << std::boolalpha << (value + 10) << "\n";
}


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

1
0
1
0
true
false
10
10

bool型の値をそのまま出力すると、0 か 1 としか出力されません。等価演算子や関係演算子の結果は bool型なので、やはり 0 か 1 で出力されます。

bool型の値を文字列表現で出力させるためには、std::boolalpha を使います。しかし、std::boolalpha は bool型の値にしか効果がありません(本編解説)。(value == 0)(value != 0) の結果は bool型なので、true や false という出力になりますが、(value + 10) の方は int型なので計算結果が整数のまま出力されます。

問題3 (基本★★)

文字列の入力を受け取り、その内容をそのまま出力することを繰り返すループを構築してください。入力内容が空文字列だったら、ループを抜け出すようにしてください。


たとえば、次のようになります。

#include <iostream>
#include <string>

int main()
{
    std::string input_str {"dummy"};

    for (int i = 0; input_str != ""; ++i) {
        std::cout << "Please enter the string.\n";
        std::getline(std::cin, input_str);
        std::cout << input_str << "\n";
    }
}

実行結果:

Please enter the string.
hello  <-- 入力した文字列
hello
Please enter the string.
world  <-- 入力した文字列
world
Please enter the string.
       <-- 入力した文字列

ループが必要なので for文を使います。

本当はもっと書きやすいループの構文がありますが、ここまでのページで取り上げていないので。

ループを続ける条件は、「入力された文字列が空文字列でない」です。入力を変数 input_str で受け取るとして、この条件式input_str != "" と書けます。for文の「条件式」のところに書くために、変数 input_str は、for文より手前で宣言する必要があります。

【上級】for (int i = 0, std::string input_str = "dummy"; input_str != ""; ++i) のようにすれば、「初期化文」のところで複数の変数宣言をおこなうことは可能です。

変数 input_str が宣言された後、1回目の入力を受け取る前に、for文のところに処理が差し掛かるので、初回の条件チェックが行われてしまいます。条件式を input_str != "" としたいので、変数 input_str の初期値を "" 以外のものにしておく必要があります。そうでないと、for文の内側に入ることなくプログラムが終わってしまいます。ここでは、“dummy” という文字列で初期化することにしました。

文字列の入力を受け取るには、std::getline関数を使います。>> による方法だと、空文字列を受け取れません(「文字列の入力」のページを参照)。


ところで、この for文では、変数 i がまったく使われていません。こういう場合は単に消してしまっても構いません。

for (; input_str != "";) {
    std::cout << "Please enter the string.\n";
    std::getline(std::cin, input_str);
    std::cout << input_str << "\n";
}

; は必要です。

問題4 (基本★★)

次の for文はどういう動作になるでしょうか?

for (int i = 0; 1; ++i) {
    // 繰り返す処理
}


「条件式」が 1 とだけ書かれています。

「条件式」に記述するものは論理値になるものです。1 という整数は、bool型に変換されて true になりますから(本編解説)、この条件式は true と書いたのと同等の意味をもちます。つまり、この for文の繰り返し条件は「必ず」ということになります。

いかなる場合においても「必ず」繰り返すのですから、実行中にこの for文に差し掛かったら、必ず内側に入り、その後、抜け出すことなく、ループし続けることになります。

もし、この for文を含んだプログラムを実行したのなら、実行が終了することなく、プログラムが動き続けます。止めたくなったら、キーボードから Ctrl+C を入力してください。Ctrl+C は実行者が強制的にプログラムの実行を停止させる方法であって、この操作に頼るプログラムを作ってはいけません。

問題5 (応用★★★)

“I am a programmer.” のように、「.」で終わる文字列があるとします。

この文字列の文字数(空白と最後のピリオドを含む)をカウントして出力するプログラムを作成してください。


たとえば、次のように書けます。

#include <iostream>

int main()
{
    constexpr auto str = "I am a programmer.";
    int count {0};

    for (int i = 0; str[i] != '.'; ++i) {
        ++count;
    }
    ++count;    // 最後の '.' の分を加算

    std::cout << count << "\n";
}

実行結果:

18

for文を使って、変数 i の値を 0 から順に増やしていき、その値を使って str[i] のようにして文字列内の文字をアクセスします。最後に登場する . を見つけたら for文を終了させるように「条件式」を記述すればいいことになります。

for文の「条件式」はループを続ける条件なので、「str[i] の位置にある文字が . ではないとき」です。よって、str[i] != '.' とすればいいことになります。

あとは for文を回しながら、変数 count に文字数をカウントしていけばいいです。for文の外で出力することになるので、変数 count の宣言は for文の外側で行う必要があります。また、str[i] == '.' になった周回には for文の「繰り返したい文」は実行されないことに注意が必要です。. も文字数に含めるという条件の問題なので、for文を抜けた後で、count の値をインクリメントしておきます。


参考リンク



更新履歴




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