5.8.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #include <stdio.h>
  2. static char daytab[2][13] = {
  3. {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
  4. {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
  5. };
  6. int month_day(int year, int yearday, int *pmonth, int *pday);
  7. int day_of_year(int year, int month, int day);
  8. void test_day_of_year();
  9. int main()
  10. {
  11. test_day_of_year();
  12. return(0);
  13. }
  14. void test_day_of_year()
  15. {
  16. for (int j=1990; j<2019; j++)
  17. for(int k=1; k<13; k++)
  18. for(int i=1; i<32; i++)
  19. printf("day_of_year %d \n",day_of_year(j,k,i));
  20. }
  21. /* day_of_year: set day of year from month & day */
  22. int day_of_year(int year, int month, int day)
  23. {
  24. int i, leap;
  25. if (month<1)
  26. return -1;
  27. if (month>12)
  28. return -2;
  29. leap = ((year%4) == 0) && ((year%100) != 0) || ((year%400) == 0);
  30. if (day > daytab[leap][month])
  31. return -4;
  32. if (day <0)
  33. return -8;
  34. if(year<0)
  35. return -16;
  36. for (i = 1; i < month; i++)
  37. day += daytab[leap][i];
  38. return day;
  39. }
  40. /* month_day: set month, day from day of year */
  41. int month_day(int year, int yearday, int *pmonth, int *pday)
  42. {
  43. int i, leap;
  44. if (year<0) return -16;
  45. if (yearday>366) return -1;
  46. if (yearday<1) return -2;
  47. leap = ((year%4) == 0) && ((year%100) != 0) || ((year%400) == 0);
  48. if ((!leap) && (yearday==366)) return -4;
  49. for (i = 1; yearday > daytab[leap][i]; i++)
  50. yearday -= daytab[leap][i];
  51. *pmonth = i;
  52. *pday = yearday;
  53. }