//Oscar Duretto
//Last Edited 25/3/15
/*
* doomsday.c
* A program to test a function dayOfWeek which determines which
* day of the week a particular date falls on.
* (only for dates after the start of the Gregorian calendar).
*
* Program stub created by Richard Buckland on 17/03/14
* This program by YOUR-NAME-HERE
* Freely licensed under Creative Commons CC-BY-3.0
*
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define THURSDAY 0
#define FRIDAY 1
#define SATURDAY 2
#define SUNDAY 3
#define MONDAY 4
#define TUESDAY 5
#define WEDNESDAY 6
#define TRUE 1
#define FALSE 0
#define DAYS_PER_WEEK 7
//Specific date of doomsday in each month
#define DOOMSDAY_JAN 3
#define DOOMSDAY_FEB 28
#define DOOMSDAY_MAR 7
#define DOOMSDAY_APR 4
#define DOOMSDAY_MAY 9
#define DOOMSDAY_JUN 6
#define DOOMSDAY_JUL 11
#define DOOMSDAY_AUG 8
#define DOOMSDAY_SEP 5
#define DOOMSDAY_OCT 10
#define DOOMSDAY_NOV 7
#define DOOMSDAY_DEC 12
int dayOfWeek (int doomsday, int leapYear, int month, int day);
int main (int argc, char *argv[]) {
//tests to make sure function is working
//general testing
assert (dayOfWeek (THURSDAY, FALSE, 4, 4) == THURSDAY);
assert (dayOfWeek (FRIDAY, FALSE, 6, 6) == FRIDAY);
assert (dayOfWeek (MONDAY, FALSE, 8, 8) == MONDAY);
assert (dayOfWeek (WEDNESDAY, FALSE, 10, 10) == WEDNESDAY);
assert (dayOfWeek (FRIDAY, FALSE, 12, 12) == FRIDAY);
assert (dayOfWeek (THURSDAY, FALSE, 9, 5) == THURSDAY);
assert (dayOfWeek (FRIDAY, FALSE, 5, 9) == FRIDAY);
assert (dayOfWeek (SUNDAY, FALSE, 7, 11) == SUNDAY);
assert (dayOfWeek (TUESDAY, FALSE, 11, 7) == TUESDAY);
assert (dayOfWeek (WEDNESDAY, FALSE, 3, 7) == WEDNESDAY);
assert (dayOfWeek (THURSDAY, FALSE, 4, 5) == FRIDAY);
assert (dayOfWeek (SATURDAY, FALSE, 6, 5) == FRIDAY);
assert (dayOfWeek (MONDAY, FALSE, 8, 9) == TUESDAY);
assert (dayOfWeek (WEDNESDAY, FALSE, 10, 9) == TUESDAY);
assert (dayOfWeek (FRIDAY, FALSE, 12, 20) == SATURDAY);
assert (dayOfWeek (THURSDAY, FALSE, 9, 9) == MONDAY);
assert (dayOfWeek (FRIDAY, FALSE, 5, 5) == MONDAY);
assert (dayOfWeek (SUNDAY, FALSE, 7, 7) == WEDNESDAY);
assert (dayOfWeek (TUESDAY, FALSE, 11, 11) == SATURDAY);
assert (dayOfWeek (THURSDAY, FALSE, 3, 30) == SATURDAY);
assert (dayOfWeek (TUESDAY, FALSE, 2, 28) == TUESDAY);
assert (dayOfWeek (TUESDAY, FALSE, 2, 27) == MONDAY);
assert (dayOfWeek (THURSDAY, FALSE, 1, 3) == THURSDAY);
//leapyear testing
assert (dayOfWeek (WEDNESDAY, FALSE, 2, 28) == WEDNESDAY);
assert (dayOfWeek (WEDNESDAY, TRUE, 2, 28) == TUESDAY);
assert (dayOfWeek (MONDAY, FALSE, 1, 29) == SATURDAY);
assert (dayOfWeek (WEDNESDAY, TRUE, 1, 29) == SUNDAY);
assert (dayOfWeek (SUNDAY, TRUE, 7, 7) == WEDNESDAY);
//Birthday! 2015, 2012
assert (dayOfWeek (SATURDAY, FALSE, 7, 9) == THURSDAY);
assert (dayOfWeek (WEDNESDAY, TRUE, 7, 9) == MONDAY);
//End and start of year
assert (dayOfWeek (MONDAY, FALSE, 12, 31) == SATURDAY);
assert (dayOfWeek (WEDNESDAY, TRUE, 1, 1) == SUNDAY);
assert (dayOfWeek (MONDAY, FALSE, 2, 2) == WEDNESDAY);
printf ("all tests passed - You are awesome!\n");
return EXIT_SUCCESS;
}
// given the doomsday for a year, and whether or not it is a
// leap year, this function return the day of the week for any
// given month and day in the year.
int dayOfWeek (int doomsday, int leapYear, int month, int day) {
int dayOfWeek;
int doomsdayOfMonth;
int differenceBetweenDays;
//Finds the specific doomsday date for the month being checked
if (month == 1) {
doomsdayOfMonth = DOOMSDAY_JAN;
}
if (month == 2) {
doomsdayOfMonth = DOOMSDAY_FEB;
}
if (month == 3) {
doomsdayOfMonth = DOOMSDAY_MAR;
}
if (month == 4) {
doomsdayOfMonth = DOOMSDAY_APR;
}
if (month == 5) {
doomsdayOfMonth = DOOMSDAY_MAY;
}
if (month == 6) {
doomsdayOfMonth = DOOMSDAY_JUN;
}
if (month == 7) {
doomsdayOfMonth = DOOMSDAY_JUL;
}
if (month == 8) {
doomsdayOfMonth = DOOMSDAY_AUG;
}
if (month == 9) {
doomsdayOfMonth = DOOMSDAY_SEP;
}
if (month == 10) {
doomsdayOfMonth = DOOMSDAY_OCT;
}
if (month == 11) {
doomsdayOfMonth = DOOMSDAY_NOV;
}
if (month == 12) {
doomsdayOfMonth = DOOMSDAY_DEC;
}
//doomsday dates of Jan and Feb are one day after in a leap year
if ((leapYear) && (month <= 2)) {
doomsdayOfMonth = doomsdayOfMonth + 1;
}
//calculates how far from day of week is the doomsday
differenceBetweenDays = (day - doomsdayOfMonth) % DAYS_PER_WEEK;
//then calculates day of week
dayOfWeek = DAYS_PER_WEEK + differenceBetweenDays + doomsday;
//corrects any numbers that are >= 7 from previous equation
dayOfWeek = (dayOfWeek % DAYS_PER_WEEK);
return (dayOfWeek);
}
Download file:
doomsday.c
(4.9 KB)