Most years have 52 weeks, some have 53, according to ISO8601.



Task

Write a function which determines if a given year is long (53 weeks) or not, and demonstrate it.




 
program longyear
    use iso_fortran_env, only: output_unit, input_unit
    implicit none
 
    integer             :: start, ende, i, counter
    integer, parameter  :: line_break=10
 
    write(output_unit,*) "Enter beginning of interval"
    read(input_unit,*) start
    write(output_unit,*) "Enter end of interval"
    read(input_unit,*) ende
 
    if (start>=ende) error stop "Last year must be after first year!"
 
    counter = 0
    do i = start, ende
        if (is_long_year(i)) then
            write(output_unit,'(I0,x)', advance="no") i
            counter = counter + 1
            if (modulo(counter,line_break) == 0) write(output_unit,*)
        end if
    end do
contains
    pure function p(year)
        integer, intent(in) :: year
        integer             :: p
 
        p = modulo(year + year/4 - year/100 + year/400, 7)
    end function p
 
    pure function is_long_year(year)
        integer, intent(in) :: year
        logical             :: is_long_year
 
        is_long_year = p(year) == 4 .or. p(year-1) == 3
    end function is_long_year
end program longyear
 