このページは、練習問題の解答例や解説のページです。
次のプログラムを実行したとき、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」だけです。
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文で書いた方が自然ですし、実行時の効率も高い可能性があります。
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
を使った文の中に埋め込んでしまえます。構文の都合で、( )
で囲まないとコンパイルエラーになります(本編解説)。
入力されたスコアに応じて、以下のように *
を出力したいとします。
*
を出力して改行する*
を出力して改行する*
を出力して改行するそこで、次のようなプログラムを書きましたが、これは間違っています。その理由を答え、正しいプログラムを書いてください。
#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
を並べるとき、その並び順は重要です。
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
「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で書く |
RSS | 管理者情報 | プライバシーポリシー |