! all round calendar PROGRAM main IMPLICIT NONE INTEGER :: md(1:12) = (/31,28,31,30,31,30,31,31,30,31,30,31/) INTEGER :: y, m, d, ld CHARACTER(LEN=2) :: name(0:6) = (/'日','月','火','水','木','金','土'/) DO PRINT '(1X, A)', '何年? ( 0で終了 )' READ *, y IF ( y <= 0 ) EXIT md(2) = 28 + leap(y) ! add 1 for leap. PRINT '(1X, A)', '何月?' DO READ *, m IF ( 0 < m .AND. m <= 12 ) EXIT PRINT '(1X, A)', '12以下の正の数を入れ直して下さい。' END DO PRINT '(1X, A)', 'day?' READ *, d IF ( d <= 0 .OR. d > md(m) ) THEN PRINT '(1X, A)', 'そんな日は存在しません。' ELSE call count(ld) PRINT '(1x, i4, "年", i2, "月", i2, "日は ", a2, a/)', & y, m, d, name(ld), '曜日 です。' END IF END DO CONTAINS ! ここからが内部手続き ! その日が西暦1年1月1日から何日目かを数え,曜日を算出する SUBROUTINE count( n ) IMPLICIT NONE INTEGER, INTENT(OUT) :: n n = yday(y) + sum( md(1:m-1) ) + d n = MOD( n, 7 ) END SUBROUTINE ! 前年の12月31日が,西暦1年1月1日から何日目かを数える関数 FUNCTION yday( x ) RESULT( days ) IMPLICIT NONE INTEGER, INTENT(IN) :: x INTEGER :: days days = 365 * ( x - 1 ) & + ( x - 1 ) / 4 & - ( x - 1 ) / 100 & + ( x - 1 ) / 400 END FUNCTION yday ! うるう年なら1,平年なら0を返す関数 FUNCTION leap( x ) RESULT( y ) IMPLICIT NONE INTEGER, INTENT(IN) :: x INTEGER :: y y = yday( x + 1 ) & - yday( x ) & - 365 END FUNCTION leap END PROGRAM main