summaryrefslogtreecommitdiff
path: root/reference/C/PROBLEMS/calender.c
diff options
context:
space:
mode:
Diffstat (limited to 'reference/C/PROBLEMS/calender.c')
-rw-r--r--reference/C/PROBLEMS/calender.c197
1 files changed, 197 insertions, 0 deletions
diff --git a/reference/C/PROBLEMS/calender.c b/reference/C/PROBLEMS/calender.c
new file mode 100644
index 0000000..c5c9b7e
--- /dev/null
+++ b/reference/C/PROBLEMS/calender.c
@@ -0,0 +1,197 @@
+/*
+ * Purpose: To generate a calender.
+ * Author: M J Leslie
+ * Date: 19-Mar-94
+ */
+
+#include <stdio.h>
+#define TRUE 1
+#define FALSE 0
+
+#define DAYS_IN_A_WEEK 7
+#define MAX_COLS 6
+#define BASE_YEAR 1990 /* Year from which all
+ calculations are done. */
+
+ /* Function declatations */
+int calender_month(const int month, const int year);
+int start_day(const int month, const int year);
+int leap(int);
+
+ /* Global variables. */
+int days_in_month[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
+
+main(int argc, char *argv[])
+{
+ int i; /* General purpose var */
+ int year; /* year to start display */
+ int num_of_months; /* Number of months */
+ int start_month; /* Start month */
+ int month; /* Current month */
+ char *prog=argv[0]; /* Program name */
+
+ /* Check we have the
+ program name and 3 parms */
+ if ( argc != 4)
+ {
+ puts("\tProgram syntax:");
+ printf("\t\t%s start_month start_year num_of_months",prog );
+ exit(1);
+ }
+ /* Dont bother checking if the
+ parms are integers!! */
+
+ /* Put command line parms into
+ meaningfull variable names */
+ start_month = atoi(argv[1]);
+ year = atoi(argv[2]);
+ num_of_months = atoi(argv[3]);
+
+ /* AND OFF WE GO... */
+ month = start_month;
+ for (i=start_month; i < start_month + num_of_months ; i++)
+ {
+ calender_month(month, year); /* O/P one month. */
+ if ( month++ >= 12) /* Q. End of year? */
+ { /* Yes. */
+ month = 1;
+ year++;
+ }
+ }
+}
+
+/************************************************************************/
+/* Calender_month */
+/* Display one calender month. */
+/************************************************************************/
+
+calender_month(const int month, const int year)
+{
+ int i,j,count; /* General Purpose variables. */
+
+ /* dont forget - arrays start
+ at zero */
+ char *days[]=
+ {
+ " ",
+ "Mon",
+ "Tue",
+ "Wed",
+ "Thr",
+ "Fri",
+ "Sat",
+ "Sun"
+ };
+
+ char *months[]=
+ {
+ " ",
+ "January",
+ "Febuary",
+ "March",
+ "April",
+ "May",
+ "June",
+ "July",
+ "August",
+ "September",
+ "October",
+ "November",
+ "December"
+ };
+
+
+ int month_map[8][MAX_COLS+1]={0}; /* init array with zeros */
+
+ j=start_day(month, year); /* Get the day the month starts */
+ /* Build the calender values */
+ i=1;count=0;
+ while ( days_in_month[month] > count)
+ {
+ month_map[j++][i]=++count; /* Build the table. */
+ /* Start a new week. */
+ if ( j > DAYS_IN_A_WEEK)
+ {
+ j=1;
+ i++;
+ }
+ }
+ /* O/P Title bar. */
+ printf("\n\t\t%s %d\n\n",months[month], year);
+ /* O/P the calender */
+ for (j=1; j<=DAYS_IN_A_WEEK; j++)
+ {
+ printf("\t%s ",days[j]); /* Day names */
+
+ for (i=1; i<=MAX_COLS; i++)
+ {
+ if ( month_map[j][i] == 0 ) /* dates */
+ {printf (" ");}
+ else
+ {printf ("%2d ", month_map[j][i]);}
+ }
+
+ puts (""); /* puts supplies a Newline */
+ }
+}
+
+/************************************************************************/
+/* Start_day */
+/* Work out which day the month starts on. */
+/************************************************************************/
+
+int start_day(const int month, const int year)
+{
+ int day=1; /* 1/1/1990 was a Monday. */
+ int i,j; /* GP work variable. */
+
+ /* Count days in the year. */
+ i = BASE_YEAR;
+
+ while ( i < year )
+ {
+ leap(i); /* Check for leap years */
+ for (j=1; j<=12; j++) day = day + days_in_month[j];
+ i++;
+ }
+
+ /* Count upto the month required */
+ i=1;
+ leap(year); /* Check for leap years */
+ while ( i < month )
+ {
+ day = day + days_in_month[i++];
+ }
+ /* Get modulo and return it as
+ the start day for this month */
+ if ( (day = day%7) == 0 ) day = 7; /* correct 0 to 7 */
+ return ( day );
+}
+
+/************************************************************************/
+/* leap */
+/* Find leap years. */
+/* Returns 0 - Not a leap year. */
+/* 1 - leap year. */
+/************************************************************************/
+
+int leap(int year)
+{
+
+ /*
+ A leap year follows the following rules:
+ if divisable by 4 and not 100 its a leap year.
+ if divisable by 400 it is a leap year.
+ */
+
+ if ( (year%4 == FALSE && year%100 != FALSE) || year%400 == FALSE )
+ {
+ days_in_month[2] = 29;
+ return(1); /* leap year */
+ }
+ else
+ {
+ days_in_month[2] = 28;
+ return(0); /* NOT a leap year */
+ }
+}