doomsday.c - OpenLearning
//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)

Comments

Chat