-
「西暦年数が100の倍数のときは400で割れる年、
100の倍数でないときは4で割り切れる年を閏年とし、
その他を平年とする。」
をそのまま実現すると、
/* 閏年か平年かを判定するプログラム */
#include <stdio.h>
main()
{
int n;
printf("西暦年を入力して下さい:");
scanf("%d", &n );
if( n % 100 == 0 )
if( n % 400 == 0 )
printf("%d 年は閏年です。\n", n );
else
printf("%d 年は平年です。\n", n );
else /* n % 100 != 0 */
if( n % 4 == 0 )
printf("%d 年は閏年です。\n", n );
else
printf("%d 年は平年です。\n", n );
}
/* end of leap00.c */
- 下の様な内側のif-elseを囲っている{}は不要である。何故か?
/* 閏年か平年かを判定するプログラム */
#include <stdio.h>
main()
{
int n;
printf("西暦年を入力して下さい:");
scanf("%d", &n );
if( n % 100 == 0 )
{
if( n % 400 == 0 )
printf("%d 年は閏年です。\n", n );
else
printf("%d 年は平年です。\n", n );
}
else /* n % 100 != 0 */
{
if( n % 4 == 0 )
printf("%d 年は閏年です。\n", n );
else
printf("%d 年は平年です。\n", n );
}
}
/* end of leap0.c */
-
「西暦年数が4で割り切れる年を閏年とし、
さらに100で割り切れる年は平年に戻し、
400で割り切れる年は再び閏年にする。」
をそのまま実現すると、
/* 閏年か平年かを判定するプログラム */
#include <stdio.h>
main()
{
int n;
printf("西暦年を入力して下さい:");
scanf("%d", &n );
if( n % 4 == 0 )
if( n % 100 == 0 )
if( n % 400 == 0 )
printf("%d 年は閏年です。\n", n );
else
printf("%d 年は平年です。\n", n );
else
printf("%d 年は閏年です。\n", n );
else
printf("%d 年は平年です。\n", n );
}
/* end of leap01.c */
- if-ifとインデント(字下げ)レベルが深くなるし、
elseが対応するifから離れて見通しが悪い
- 条件判定(if)の条件を否定(not)してみると...
/* 閏年か平年かを判定するプログラム */
#include <stdio.h>
main()
{
int n;
printf("西暦年を入力して下さい:");
scanf("%d", &n );
if( n % 4 != 0 )
printf("%d 年は平年です。\n", n );
else if( n % 100 != 0 )
printf("%d 年は閏年です。\n", n );
else if( n % 400 != 0 )
printf("%d 年は平年です。\n", n );
else
printf("%d 年は閏年です。\n", n );
}
/* end of leap02.c */
- else ifという便利な記法を用いることができるので、
インデント(字下げ)レベルが深くならずに済む
- 上のやり方では、「...閏年です。」とかの表示の仕方を変更する為には、
2箇所ずつ同じように変更しなければならない。
- if文を一個にすると、それぞれの表示部分をまとめられる
/* 閏年か平年かを判定するプログラム */
#include <stdio.h>
main()
{
int n;
printf("西暦年を入力して下さい:");
scanf("%d", &n );
if( 条件 )
printf("%d 年は閏年です。\n", n );
else
printf("%d 年は平年です。\n", n );
}
/* end of leap1.c */
- このif文の条件を適切に埋めて完成せよ
ヒント
- 整数の集合を$N$、4の倍数の集合を$N_4$、100の倍数の集合を$N_{100}$、400の倍数の集合を$N_{400}$として、
閏年となる年の集合$L$を図示してみよ
- また、$L$を$N_4$、$N_{100}$、$N_{400}$で表すとどうなるか?
- 閏年は「400の倍数の年、または、100の倍数でない4の倍数の年」となる
- leap0x.cで「閏年です」の部分に来るのはどの様な場合か?と考えても良い
- この様に判定条件が複雑な場合は、その部分を別の手続き(関数)として実現し、
判定部分と結果の表示部分を分けて考えた方が良い