このページは、練習問題の解答例や解説のページです。
次のプログラムの実行結果はどうなりますか?
#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
の文字列表現になります(使っていなければ、0
や
1
が出力されます)(本編解説)。
実行結果:
false
true
true
true
false
false
次のプログラムの実行結果はどうなりますか?
#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型なので計算結果が整数のまま出力されます。
文字列の入力を受け取り、その内容をそのまま出力することを繰り返すループを構築してください。入力内容が空文字列だったら、ループを抜け出すようにしてください。
たとえば、次のようになります。
#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";
}
;
は必要です。
次の for文はどういう動作になるでしょうか?
for (int i = 0; 1; ++i) {
// 繰り返す処理
}
「条件式」が 1
とだけ書かれています。
「条件式」に記述するものは論理値になるものです。1
という整数は、bool型に変換されて true
になりますから(本編解説)、この条件式は
true
と書いたのと同等の意味をもちます。つまり、この
for文の繰り返し条件は「必ず」ということになります。
いかなる場合においても「必ず」繰り返すのですから、実行中にこの for文に差し掛かったら、必ず内側に入り、その後、抜け出すことなく、ループし続けることになります。
もし、この for文を含んだプログラムを実行したのなら、実行が終了することなく、プログラムが動き続けます。止めたくなったら、キーボードから Ctrl+C を入力してください。Ctrl+C は実行者が強制的にプログラムの実行を停止させる方法であって、この操作に頼るプログラムを作ってはいけません。
“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で書く |
RSS | 管理者情報 | プライバシーポリシー |