From 7e0f021a9aec35fd8e6725e87e3313b101d26f5e Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Sun, 27 Jan 2008 11:37:44 +0100 Subject: Initial import (2.0.2-6) --- reference/C/PROBLEMS/calender.c | 197 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 reference/C/PROBLEMS/calender.c (limited to 'reference/C/PROBLEMS/calender.c') 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 +#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 */ + } +} -- cgit v1.2.3-54-g00ecf