Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * 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 Tomas Donovic on 26/3/14
- * 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 JAN_DOOMSDAY_LEAP 4
- #define JAN_DOOMSDAY_COMMON 3
- #define FEB_DOOMSDAY_COMMON 28
- #define FEB_DOOMSDAY_LEAP 29
- #define MARCH_DOOMSDAY 0
- #define APRIL_DOOMSDAY 4
- #define MAY_DOOMSDAY 9
- #define JUNE_DOOMSDAY 6
- #define JULY_DOOMSDAY 11
- #define AUGUST_DOOMSDAY 8
- #define SEPTEMBER_DOOMSDAY 5
- #define OCTOBER_DOOMSDAY 10
- #define NOVEMBER_DOOMSDAY 7
- #define DECEMBER_DOOMSDAY 12
- #define TRUE 1
- #define FALSE 0
- #define DAYS_PER_WEEK 7
- int dayOfWeek (int doomsday, int leapYear, int month, int day);
- int dateCalc (int doomsdate, int day, int doomsday);
- int doomsdayCalc (int month, int leapYear);
- int inputChecker (int doomsday, int LeapYear, int month, int day);
- int main (int argc, char *argv[]) {
- 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);
- assert (dayOfWeek (SATURDAY, FALSE, 2, 1) == SUNDAY);
- assert (dayOfWeek (0, 1, 7, 1) == 4);
- 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 badInput = inputChecker (doomsday, leapYear, month, day);
- int doomsdateRes = doomsdayCalc(month, leapYear);
- int finResult = dateCalc(doomsdateRes, day, doomsday);
- int dayOfWeek = finResult;
- //calls a bad run if input is bad.
- if(badInput == TRUE) {
- finResult = -99;
- }
- printf("%d\n",dayOfWeek);
- return dayOfWeek;
- }
- int inputChecker (int doomsday, int LeapYear, int month, int day) {
- //Various tests to see if there is user input error.
- int flag = FALSE;
- if(doomsday > 7) {
- if(doomsday < 0) {
- flag = TRUE;
- }
- flag = TRUE;
- }
- if(LeapYear > 1) {
- if(LeapYear <0) {
- flag = TRUE;
- }
- flag = TRUE;
- }
- if(month>12) {
- if(month<1) {
- flag = TRUE;
- }
- flag = TRUE;
- }
- if(day>6) {
- if(day<0) {
- flag = TRUE;
- }
- flag = TRUE;
- }
- return flag;
- }
- int doomsdayCalc (int month, int leapYear) {
- int doomsdate;
- //Associates month with its doomsday
- if(month == 12) {
- doomsdate = DECEMBER_DOOMSDAY;
- }else if(month == 11) {
- doomsdate = NOVEMBER_DOOMSDAY;
- }else if(month == 10) {
- doomsdate = OCTOBER_DOOMSDAY;
- }else if(month == 9) {
- doomsdate = SEPTEMBER_DOOMSDAY;
- }else if(month == 8) {
- doomsdate = AUGUST_DOOMSDAY;
- }else if(month == 7) {
- doomsdate = JULY_DOOMSDAY;
- }else if(month == 6) {
- doomsdate = JUNE_DOOMSDAY;
- }else if(month == 5) {
- doomsdate = MAY_DOOMSDAY;
- }else if(month == 4) {
- doomsdate = APRIL_DOOMSDAY;
- }else if(month == 3) {
- doomsdate = MARCH_DOOMSDAY;
- }else if(month == 2) {
- if(leapYear == TRUE) {
- doomsdate = FEB_DOOMSDAY_LEAP;
- }else {
- doomsdate = FEB_DOOMSDAY_COMMON;
- }
- }else {
- if(leapYear == TRUE) {
- doomsdate = JAN_DOOMSDAY_LEAP;
- }else {
- doomsdate = JAN_DOOMSDAY_COMMON;
- }
- }
- return doomsdate;
- }
- int dateCalc (int doomsdate, int day, int doomsday){
- int intRem;
- int rem;
- int result;
- intRem = (day - doomsdate);
- rem = intRem % 7;
- if (rem < 0){
- rem = rem + 7;
- }
- result = (doomsday + rem) % 7;
- return result;
- }
Advertisement
Add Comment
Please, Sign In to add comment