Project 1
Write a program to compute the day of the week for any date of the Gregorian calendar. Here is the formula:
W=(C+Y+L+M+D ) mod 7
Y is the last two digits of the actual year and D is the actual day. You need to obtain the value of C from the following rule for the years:
- If year is in the 1400s, 1800s, 2200s, C=2
- If year is in the 1500s, 1900s, 2300s, C=0
- If year is in the 1600s, 2000s, 2400s, C=5
- If year is in the 1700s, 2100s, 2500s, C=4 Months are numbered from 1 in the usual way, but (from January) M is 0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5
The only tricky part of this algorithm is L, the number of leap days that have occurred since the beginning of the century of the given date. To obtain this:
- Integer divide the last two digits of the year by 4 to obtain the number of “ordinary” leap years in the century up to that year, not counting the century year itself if applicable.
- Obtain the remainder of the two digits and 4. If it is not a century year and the remainder is 0 the year is a leap year, otherwise it is not. If the year itself is a century year see Step 3.
- If the century (1400, 1500, etc.) was evenly divisible by 400 then the century year is a leap year, otherwise it is not. Thus 2000 was a leap year but 1900 was not. So add 1 for centuries divisible by 400 and 0 otherwise.
- If your date is January 1-February 29 of a leap year, subtract 1. Try to devise a method to obtain the last two digits on your own. Print the day of the week as a word (Monday, Tuesday, etc.). Remember that Sunday is the first day of the week and it will be counted as 0 in this algorithm.
Test your program first with your own birthdate. Then test with the following dates:
- Today’s date
- December 25, 1642 (Note: this is Newton’s birthdate in the Julian calendar, but use it as a Gregorian date)
- October 12, 1492
- January 20, 2000
- December 11, 2525
Try to write and test your own program before peeking at the sample solution.
Sample solution
program day_of_week
!*******************************************************************************
! This program computes the day of the week given a date in the
! Gregorian calendar.
!
! Author: K. Holcomb
! Changelog: 2013-06-05 Initial version
! 2014-01-29 Bug fix to correct leap_year test for century
! 2014-01-29 Added a loop for user input
! 2015-01-29 Modification to use only conditionals (no arrays)
!*******************************************************************************
implicit none
integer :: max_year, min_year
integer :: day, month, year, century
integer :: D, M, Y, C, L, W
logical :: leap_year, century_leap_year
day=2
month=3
year=2016
D=day
century=100*(int(year)/100)
Y=year-century
century_leap_year = mod(century,400)==0
leap_year=.false.
if (Y>0) then
leap_year = mod(year,4)==0
else
if (century_leap_year) leap_year=.true.
endif
L = int(Y)/4
if (century_leap_year) L=L+1
if (leap_year .and. month<3) L=L-1
if (month==1 .or. month==10) then
M=0
elseif (month==2 .or. month==3 .or. month==11) then
M=3
elseif (month==4 .or. month==7) then
M=6
elseif (month==5) then
M=1
elseif (month==6) then
M=4
elseif (month==8) then
M=2
else
M=5
endif
if ( century==1400 .or. century==1800 .or. century==2200 ) then
C=2
elseif ( century==1500 .or. century==1900 .or. century==2300 ) then
C=0
elseif ( century==1600 .or. century==2000 .or. century==2400 ) then
C=5
elseif ( century==1700 .or. century==2100 .or. century==2500 ) then
C=4
else
print *, "This algorithm doesn't cover the century requested"
endif
W=mod((C+Y+L+M+D),7)
!Example of select case
select case(W)
case(0)
print *, 'Sunday'
case(1)
print *, 'Monday'
case(2)
print *, 'Tuesday'
case(3)
print *, 'Wednesday'
case(4)
print *, 'Thursday'
case(5)
print *, 'Friday'
case(6)
print *, 'Saturday'
end select
end program