5.9.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int *getdaytab(int leapyear);
  4. int *getdaytab(int leapyear)
  5. {
  6. static int *daytab[2];
  7. daytab[0]=malloc(sizeof(int)*13);
  8. daytab[1]=malloc(sizeof(int)*13);
  9. *(daytab[0])=0;
  10. *(daytab[0]+1)=31;
  11. *(daytab[0]+2)=28;
  12. *(daytab[0]+3)=31;
  13. *(daytab[0]+4)=30;
  14. *(daytab[0]+5)=31;
  15. *(daytab[0]+6)=30;
  16. *(daytab[0]+7)=31;
  17. *(daytab[0]+8)=31;
  18. *(daytab[0]+9)=30;
  19. *(daytab[0]+10)=31;
  20. *(daytab[0]+11)=30;
  21. *(daytab[0]+12)=31;
  22. *(daytab[1])=0;
  23. *(daytab[1]+1)=31;
  24. *(daytab[1]+2)=29;
  25. *(daytab[1]+3)=31;
  26. *(daytab[1]+4)=30;
  27. *(daytab[1]+5)=31;
  28. *(daytab[1]+6)=30;
  29. *(daytab[1]+7)=31;
  30. *(daytab[1]+8)=31;
  31. *(daytab[1]+9)=30;
  32. *(daytab[1]+10)=31;
  33. *(daytab[1]+11)=30;
  34. *(daytab[1]+12)=31;
  35. return (leapyear==1) ? daytab[1] : daytab[0];
  36. }
  37. /* month_day: set month, day from day of year */
  38. int month_day(int year, int yearday, int *pmonth, int *pday)
  39. {
  40. int leap=0;
  41. /* month_day: set month, day from day of year */
  42. int i;
  43. if (year<0) return -16;
  44. if (yearday>366) return -1;
  45. if (yearday<1) return -2;
  46. leap = ((year%4) == 0) && ((year%100) != 0) || ((year%400) == 0);
  47. if ((!leap) && (yearday==366)) return -4;
  48. for (i = 1; yearday > *(getdaytab(leap)+i); i++)
  49. yearday -= *(getdaytab(leap)+i);
  50. *pmonth = i;
  51. *pday = yearday;
  52. return 0;
  53. }
  54. int day_of_year(int year, int month, int day);
  55. /* day_of_year: set day of year from month & day */
  56. int day_of_year(int year, int month, int day)
  57. {
  58. int i, leap;
  59. if (month<1)
  60. return -1;
  61. if (month>12)
  62. return -2;
  63. leap = ((year%4) == 0) && ((year%100) != 0) || ((year%400) == 0);
  64. if (day > *(getdaytab(leap)+month))
  65. return -4;
  66. if (day <0)
  67. return -8;
  68. if(year<0)
  69. return -16;
  70. for (i = 1; i < month; i++)
  71. day += *(getdaytab(leap)+i);
  72. return day;
  73. }
  74. int main()
  75. {
  76. int pday = 0;
  77. int pmonth = 0;
  78. //month_day(2017, 365, &pmonth, &pday);
  79. // printf ("pday : %d pmonth : %d \n", pday, pmonth);
  80. printf("%d \n", day_of_year(2019, 12, 31));
  81. return (0);
  82. }