問題① 次のうち、結果が「真」になるものをすべて選んでください。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];
(s, sizeof(s), stdin);
fgetsint value;
(s, "%d", &value);
sscanfreturn value;
}
int main(void)
{
("Please enter the integer.");
putsint value = get_input_integer();
if (value % 2 != 0 && 200 <= value && value < 500) {
("OK!");
puts}
}
実行結果:
Please enter the integer.
303 <-- 入力された内容
OK!
問題③ 標準入力から受け取った西暦年が、閏年かどうか判定するプログラムを作成してください。
※閏年の定義を正確に知っていますか?「4年に1度」だけでは不正解です。
閏年の定義は、以下のようになります。
これを踏まえると、次のようなプログラムになります。
#include <stdio.h>
// 整数の入力を受け取る
// 戻り値: 標準入力から整数の入力を受け取り、その値を返す。
int get_input_integer(void)
{
char s[40];
(s, sizeof(s), stdin);
fgetsint value;
(s, "%d", &value);
sscanfreturn value;
}
int main(void)
{
("Please enter the year.");
putsint year = get_input_integer();
if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0))) {
("Leap year");
puts}
else{
("Not leap year");
puts}
}
実行結果:
Please enter the year.
2004 <-- 入力された内容
Leap year
Please enter the year.
2000 <-- 入力された内容
Leap year
Please enter the year.
1900 <-- 入力された内容
Not leap year
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |