fork download
  1. #include <stdio.h>
  2. #include <stdbool.h>
  3.  
  4. int ordinal_date(int day, int month, bool leap_year) {
  5. static const int days_up_to_month[] = {
  6. 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
  7. return days_up_to_month[month - 1] + day
  8. + ((leap_year && (month > 2)) ? 1 : 0);
  9. }
  10.  
  11.  
  12. #define check(expr) \
  13.   if(!(expr)) { \
  14.   printf("[FAILED] " #expr " in %s\n", __func__); \
  15.   }
  16.  
  17. void ordinal_date_in_january_should_be_day_number() {
  18. check(ordinal_date( 1, 1, false) == 1);
  19. check(ordinal_date( 1, 1, true) == 1);
  20. check(ordinal_date(11, 1, false) == 11);
  21. check(ordinal_date(11, 1, true) == 11);
  22. }
  23.  
  24.  
  25. void ordinal_date_in_february_should_be_day_number_plus_days_in_january() {
  26. check(ordinal_date( 1, 2, false) == 32);
  27. check(ordinal_date( 1, 2, true) == 32);
  28. check(ordinal_date(11, 2, false) == 42);
  29. check(ordinal_date(11, 2, true) == 42);
  30. }
  31.  
  32. void ordinal_date_should_match_known_values_for_non_leap_year_march_to_dezember() {
  33. check(ordinal_date( 1, 3, false) == ( 59 + 1));
  34. check(ordinal_date( 1, 4, false) == ( 90 + 1));
  35. check(ordinal_date( 1, 5, false) == (120 + 1));
  36. check(ordinal_date( 1, 6, false) == (151 + 1));
  37. check(ordinal_date( 1, 7, false) == (181 + 1));
  38. check(ordinal_date( 1, 8, false) == (212 + 1));
  39. check(ordinal_date( 1, 9, false) == (243 + 1));
  40. check(ordinal_date( 1, 10, false) == (273 + 1));
  41. check(ordinal_date( 1, 11, false) == (304 + 1));
  42. check(ordinal_date( 1, 12, false) == (334 + 1));
  43. }
  44.  
  45. void ordinal_date_should_match_known_values_for_leap_year_march_to_dezember() {
  46. check(ordinal_date( 1, 3, true) == ( 60 + 1));
  47. check(ordinal_date( 1, 4, true) == ( 91 + 1));
  48. check(ordinal_date( 1, 5, true) == (121 + 1));
  49. check(ordinal_date( 1, 6, true) == (152 + 1));
  50. check(ordinal_date( 1, 7, true) == (182 + 1));
  51. check(ordinal_date( 1, 8, true) == (213 + 1));
  52. check(ordinal_date( 1, 9, true) == (244 + 1));
  53. check(ordinal_date( 1, 10, true) == (274 + 1));
  54. check(ordinal_date( 1, 11, true) == (305 + 1));
  55. check(ordinal_date( 1, 12, true) == (335 + 1));
  56. }
  57.  
  58. int main(void) {
  59. ordinal_date_in_january_should_be_day_number();
  60. ordinal_date_in_february_should_be_day_number_plus_days_in_january();
  61. ordinal_date_should_match_known_values_for_non_leap_year_march_to_dezember();
  62. ordinal_date_should_match_known_values_for_leap_year_march_to_dezember();
  63. }
  64.  
Success #stdin #stdout 0s 9296KB
stdin
Standard input is empty
stdout
Standard output is empty