OpenLearning
  1. //Oscar Duretto
  2. //Last Edited 25/3/15
  3.  
  4. /*
  5. * doomsday.c
  6. * A program to test a function dayOfWeek which determines which
  7. * day of the week a particular date falls on.
  8. * (only for dates after the start of the Gregorian calendar).
  9. *
  10. * Program stub created by Richard Buckland on 17/03/14
  11. * This program by YOUR-NAME-HERE
  12. * Freely licensed under Creative Commons CC-BY-3.0
  13. *
  14. *
  15. */
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <assert.h>
  19.  
  20. #define THURSDAY 0
  21. #define FRIDAY 1
  22. #define SATURDAY 2
  23. #define SUNDAY 3
  24. #define MONDAY 4
  25. #define TUESDAY 5
  26. #define WEDNESDAY 6
  27.  
  28. #define TRUE 1
  29. #define FALSE 0
  30. #define DAYS_PER_WEEK 7
  31.  
  32. //Specific date of doomsday in each month
  33. #define DOOMSDAY_JAN 3
  34. #define DOOMSDAY_FEB 28
  35. #define DOOMSDAY_MAR 7
  36. #define DOOMSDAY_APR 4
  37. #define DOOMSDAY_MAY 9
  38. #define DOOMSDAY_JUN 6
  39. #define DOOMSDAY_JUL 11
  40. #define DOOMSDAY_AUG 8
  41. #define DOOMSDAY_SEP 5
  42. #define DOOMSDAY_OCT 10
  43. #define DOOMSDAY_NOV 7
  44. #define DOOMSDAY_DEC 12
  45.  
  46. int dayOfWeek (int doomsday, int leapYear, int month, int day);
  47.  
  48. int main (int argc, char *argv[]) {
  49. //tests to make sure function is working
  50.  
  51. //general testing
  52. assert (dayOfWeek (THURSDAY, FALSE, 4, 4) == THURSDAY);
  53. assert (dayOfWeek (FRIDAY, FALSE, 6, 6) == FRIDAY);
  54. assert (dayOfWeek (MONDAY, FALSE, 8, 8) == MONDAY);
  55. assert (dayOfWeek (WEDNESDAY, FALSE, 10, 10) == WEDNESDAY);
  56. assert (dayOfWeek (FRIDAY, FALSE, 12, 12) == FRIDAY);
  57. assert (dayOfWeek (THURSDAY, FALSE, 9, 5) == THURSDAY);
  58. assert (dayOfWeek (FRIDAY, FALSE, 5, 9) == FRIDAY);
  59. assert (dayOfWeek (SUNDAY, FALSE, 7, 11) == SUNDAY);
  60. assert (dayOfWeek (TUESDAY, FALSE, 11, 7) == TUESDAY);
  61. assert (dayOfWeek (WEDNESDAY, FALSE, 3, 7) == WEDNESDAY);
  62. assert (dayOfWeek (THURSDAY, FALSE, 4, 5) == FRIDAY);
  63. assert (dayOfWeek (SATURDAY, FALSE, 6, 5) == FRIDAY);
  64. assert (dayOfWeek (MONDAY, FALSE, 8, 9) == TUESDAY);
  65. assert (dayOfWeek (WEDNESDAY, FALSE, 10, 9) == TUESDAY);
  66. assert (dayOfWeek (FRIDAY, FALSE, 12, 20) == SATURDAY);
  67. assert (dayOfWeek (THURSDAY, FALSE, 9, 9) == MONDAY);
  68. assert (dayOfWeek (FRIDAY, FALSE, 5, 5) == MONDAY);
  69. assert (dayOfWeek (SUNDAY, FALSE, 7, 7) == WEDNESDAY);
  70. assert (dayOfWeek (TUESDAY, FALSE, 11, 11) == SATURDAY);
  71. assert (dayOfWeek (THURSDAY, FALSE, 3, 30) == SATURDAY);
  72. assert (dayOfWeek (TUESDAY, FALSE, 2, 28) == TUESDAY);
  73. assert (dayOfWeek (TUESDAY, FALSE, 2, 27) == MONDAY);
  74. assert (dayOfWeek (THURSDAY, FALSE, 1, 3) == THURSDAY);
  75.  
  76. //leapyear testing
  77. assert (dayOfWeek (WEDNESDAY, FALSE, 2, 28) == WEDNESDAY);
  78. assert (dayOfWeek (WEDNESDAY, TRUE, 2, 28) == TUESDAY);
  79. assert (dayOfWeek (MONDAY, FALSE, 1, 29) == SATURDAY);
  80. assert (dayOfWeek (WEDNESDAY, TRUE, 1, 29) == SUNDAY);
  81. assert (dayOfWeek (SUNDAY, TRUE, 7, 7) == WEDNESDAY);
  82.  
  83.  
  84.  
  85. //Birthday! 2015, 2012
  86. assert (dayOfWeek (SATURDAY, FALSE, 7, 9) == THURSDAY);
  87. assert (dayOfWeek (WEDNESDAY, TRUE, 7, 9) == MONDAY);
  88.  
  89. //End and start of year
  90. assert (dayOfWeek (MONDAY, FALSE, 12, 31) == SATURDAY);
  91. assert (dayOfWeek (WEDNESDAY, TRUE, 1, 1) == SUNDAY);
  92.  
  93. assert (dayOfWeek (MONDAY, FALSE, 2, 2) == WEDNESDAY);
  94.  
  95. printf ("all tests passed - You are awesome!\n");
  96. return EXIT_SUCCESS;
  97. }
  98.  
  99. // given the doomsday for a year, and whether or not it is a
  100. // leap year, this function return the day of the week for any
  101. // given month and day in the year.
  102.  
  103. int dayOfWeek (int doomsday, int leapYear, int month, int day) {
  104. int dayOfWeek;
  105. int doomsdayOfMonth;
  106. int differenceBetweenDays;
  107.  
  108. //Finds the specific doomsday date for the month being checked
  109. if (month == 1) {
  110. doomsdayOfMonth = DOOMSDAY_JAN;
  111. }
  112. if (month == 2) {
  113. doomsdayOfMonth = DOOMSDAY_FEB;
  114. }
  115. if (month == 3) {
  116. doomsdayOfMonth = DOOMSDAY_MAR;
  117. }
  118. if (month == 4) {
  119. doomsdayOfMonth = DOOMSDAY_APR;
  120. }
  121. if (month == 5) {
  122. doomsdayOfMonth = DOOMSDAY_MAY;
  123. }
  124. if (month == 6) {
  125. doomsdayOfMonth = DOOMSDAY_JUN;
  126. }
  127. if (month == 7) {
  128. doomsdayOfMonth = DOOMSDAY_JUL;
  129. }
  130. if (month == 8) {
  131. doomsdayOfMonth = DOOMSDAY_AUG;
  132. }
  133. if (month == 9) {
  134. doomsdayOfMonth = DOOMSDAY_SEP;
  135. }
  136. if (month == 10) {
  137. doomsdayOfMonth = DOOMSDAY_OCT;
  138. }
  139. if (month == 11) {
  140. doomsdayOfMonth = DOOMSDAY_NOV;
  141. }
  142. if (month == 12) {
  143. doomsdayOfMonth = DOOMSDAY_DEC;
  144. }
  145. //doomsday dates of Jan and Feb are one day after in a leap year
  146. if ((leapYear) && (month <= 2)) {
  147. doomsdayOfMonth = doomsdayOfMonth + 1;
  148. }
  149.  
  150. //calculates how far from day of week is the doomsday
  151. differenceBetweenDays = (day - doomsdayOfMonth) % DAYS_PER_WEEK;
  152. //then calculates day of week
  153. dayOfWeek = DAYS_PER_WEEK + differenceBetweenDays + doomsday;
  154. //corrects any numbers that are >= 7 from previous equation
  155. dayOfWeek = (dayOfWeek % DAYS_PER_WEEK);
  156.  
  157. return (dayOfWeek);
  158. }
  159.  
  160.  

Download file: doomsday.c (4.9 KB)

Comments

Loading
Error: Loading CSS chunk vendors-node_modules_fortawesome_pro-regular-svg-icons_faGlobe_js-node_modules_fortawesome_pr-d462f3 failed. (error: https://assets.openlearning.com/chunks_live/vendors-node_modules_fortawesome_pro-regular-svg-icons_faGlobe_js-node_modules_fortawesome_pr-d462f3.8fd07ef9993d3220.css)

Chat