CMIS 140
Due 16 Dec
Write a program to display a calendar for any month of any year of the
twentieth century and on.
Here is a sample run, with user input in . (The angle
brackets are not entered by the user, they are here to show what part
of the interaction is user input.) Your prompts do not have to be
identical to these:
Enter month number: <13>
Month must be between 1 and 12, please re-enter: <0>
Month must be between 1 and 12, please re-enter: <2>
Enter year: <98>
Year must be 1900 or later, please re-enter: <2002>
February 2002
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28
Another? (y or n)
--------------------------------------------------------
To determine the day of the week on which the month starts: know that
January 1, 1900 was a Monday, and then find the number of days
difference between that day and the first day of the month for which
you are making the calendar. This difference plus one mod 7
(i.e. (totaldays+1) % 7) tells you the day of the week (0 meaning
Sunday, 1 meaning Monday etc.). Finding the number of days from
1/1/1900 to the first day of any other month can be further broken
down into the following subproblems:
1. Number of days in whole years (i.e., (Year - 1900) * 365);
2. One day for each year in the above range which is a leap year;
3. The number of days in each month from January thru the previous
month of the year you're making a month calendar for.
You must use this algortihm to calculate the starting day; you may not
use another algorithm found on the web.
Remember the rule for leap years: A year is a leap year if it is
divisible by 4, unless it is divisible by 100 (in which case it's not
a leap year) UNLESS it's also divisible by 400 (in which case it's a
leap year). year%4==0 && year%100!=0 || year%400==0 (1900 was not a
leap year, but 2000 is, 2100 will not be). See the function in the
notes.
Use the method of top-down design, breaking the problem into
subproblems and each subproblem into further subproblems, until it is
easy to code each subproblem as a C function. At this point, your
problem decomposition should show the basic structure of the program,
as well as making the code modular and easy to read and debug. To give
you practice in writing functions, your program MUST have several
functions, including one that inputs from the user the month and
year. main should be not much more than a series of function
calls. Global variables are NOT allowed.
Displaying the dates hint: have a loop that prints out the blank days
of the first week, then have a loop that loops over the days 1 to 30
(or 31, 28, or 29) The end of the week is when the date plus the
number of blank days is a multiple of 7.
You must learn how to write and use functions. The problem seems
bewildering, but if you analyze it and split it into subproblems it
becomes clear. Solving the problem by devising an algorithm to do it
is the essence of programming and computer science. The programming
language is just the tool to implement the algorithm. You won't find
the procedure to create a monthly calendar in a textbook, you are
creating and inventing the procedure.