微信图片_20210409162423.png
    微信图片_20210409162429.png

    1. #include <stdio.h>
    2. #include<stdbool.h>
    3. //声明所有用到的函数
    4. void printMonth(int, int);
    5. void printMonthTitle(int, int);
    6. void printMonthBody(int, int);
    7. int getStartDay(int, int);
    8. int getTotalNumberOfDays(int, int);
    9. int getNumberOfDaysInMonth(int, int);
    10. bool isLeapYear(int);
    11. int main() {
    12. int year, month;
    13. printf("请输入一个年份(例如: 2001): ");
    14. scanf_s("%d", &year);
    15. fflush(stdin);
    16. printf("请输入一个月份(1-12的数字): ");
    17. scanf_s("%d", &month);
    18. fflush(stdin);
    19. // 调用printMonth函数打印相应年份和月份的日历
    20. printMonth(year, month);
    21. return 0;
    22. }
    23. /** 打印相应年份和月份的日历 */
    24. void printMonth(int year, int month) {
    25. // 打印日历的开头
    26. printMonthTitle(year, month);
    27. // 打印日历内容
    28. printMonthBody(year, month);
    29. }
    30. /** 打印月份的开头*/
    31. void printMonthTitle(int year, int month) {
    32. // 填写代码打印月份的开头
    33. printf("\t\t----------%d年--%d月--------",year,month);
    34. printf("\n");
    35. printf("\t\t-----------------------------");
    36. printf("\n");
    37. printf("\t一\t二\t三\t四\t五\t六\t日");
    38. printf("\n");
    39. }
    40. /** 打印日历内容 */
    41. void printMonthBody(int year, int month) {
    42. // 调用getStartDay函数获得每月第一天是星期几
    43. int xqj;
    44. int ts;
    45. int x,j;
    46. j = 1;
    47. xqj = getStartDay(year, month);
    48. // 调用getNumberOfDaysInMonth函数获得某个月有几天?
    49. ts = getNumberOfDaysInMonth(year, month);
    50. // 在当月的第一天前面加上若干空格
    51. for (x = 1; x < xqj; x++)
    52. printf("\t ");
    53. for (int i = 0; i < 5; i++)
    54. {
    55. for (x; x <= 7; x++) {
    56. if (j <= ts) {
    57. printf("\t%d", j++);
    58. }
    59. }
    60. printf("\n");
    61. x = 1;
    62. }
    63. }
    64. /** 获得某月第一天是星期几 */
    65. int getStartDay(int year, int month) {
    66. const int START_DAY_FOR_JAN_1_1800 = 3;
    67. // 获得从 1800年1月1日 至 year年month月1日之间的天数
    68. int xq;
    69. xq = getTotalNumberOfDays(year, month);
    70. // 返回year年month月1日是星期几
    71. xq += 3 ;
    72. return xq%7;
    73. }
    74. /** 获得从 1800年1月1日 至 year年month月1日之间的天数 */
    75. int getTotalNumberOfDays(int year, int month) {
    76. // 获得从 1800年1月1日 至 year年month月1日之间的天数
    77. int tgtn;
    78. int ksy;
    79. ksy = 1800;
    80. tgtn = 0;
    81. for (ksy; ksy < year; ksy++) {
    82. if (isLeapYear(ksy)) {
    83. tgtn += 366;
    84. }
    85. else
    86. tgtn += 365;
    87. }
    88. // 计算输入年份的1月1日至输入月份的第一天之间的日期数
    89. for (month - 1; month - 1 > 0; month--) {
    90. tgtn += getNumberOfDaysInMonth(year, month-1);
    91. }
    92. return tgtn;
    93. }
    94. /** 获得每个月的天数 */
    95. int getNumberOfDaysInMonth(int year, int month) {
    96. if (month == 1|| month==3 || month==5 || month==7 || month==8 || month==10 || month==12)
    97. return 31;
    98. if (month == 2)
    99. {
    100. if (isLeapYear(year))
    101. {
    102. return 29;
    103. }
    104. else
    105. return 28;
    106. }
    107. if (month == 4 || month == 6 || month == 9 || month == 11)
    108. return 30;
    109. }
    110. /** 判断是否是闰年 */
    111. bool isLeapYear(int year) {
    112. if (year % 100 == 0) {
    113. if ((year % 400 == 0))
    114. return 1;
    115. else
    116. return 0;
    117. }
    118. else {
    119. if ((year % 4 == 0))
    120. return 1;
    121. else
    122. return 0;
    123. }
    124. }