+ -
当前位置:首页 → 问答吧 → [原创] C语言实现:万年历

[原创] C语言实现:万年历

时间:2010-08-29

来源:互联网

经过近这几天的努力,终于写完了这个"万年历"的程序了,共享一下, 特别是同"勉"共享

[需求]

    请打印出任意年份的日历

[代码]
  1. #include <stdio.h>

  2. #define LMonth 31
  3. #define SMonth 30
  4. #define VMonth 28

  5. typedef enum {
  6. Sun,
  7. Mon,
  8. Jue,
  9. Wed,
  10. Thu,
  11. Fri,
  12. Sat
  13. } WEEK;

  14. typedef enum {
  15. January = 1,
  16. February,
  17. Match,
  18. Apirl,
  19. May,
  20. June,
  21. July,
  22. August,
  23. September,
  24. October,
  25. November,
  26. December
  27. } MONTH;

  28. void printMonHead(void)
  29. {
  30. printf(" Sun Mon Jue Wed Thu Fri Sat\n");
  31. }

  32. void printMonth(const WEEK firstDay, int length )
  33. {
  34. WEEK weekDay = firstDay % 7;

  35. int i;

  36. printMonHead();

  37. for (i=0; i<weekDay;++i)
  38. {
  39. printf(" ");
  40. }

  41. for(i=1;i<=length;++i)
  42. {
  43. weekDay = (++weekDay)%7;
  44. printf("%7d", i);

  45. if(weekDay==0) printf("\n");
  46. }

  47. printf("\n");
  48. }


  49. int isLeapYear(const int yr)
  50. {
  51. return ( yr%( yr%100 ? 4:400) ? 0 : 1);
  52. }


  53. int getYearDay(const int year)
  54. {

  55. int lastYear = year-1;
  56. int yearNum = lastYear-1899;

  57. int walker,counter=0;
  58. for(walker=1900; walker < year; ++walker)
  59. {
  60. if(isLeapYear(walker)==1)
  61. ++counter;
  62. }

  63. return (365*yearNum+counter+1)%7;
  64. }


  65. void printYear(const int y)
  66. {
  67. WEEK yDay = getYearDay(y);
  68. int vDay = isLeapYear(y);

  69. int monWeeks[13];
  70. int monLen [13];

  71. monLen[0]=0;
  72. monLen[January]=31; monLen[February]=28+vDay; monLen[Match]=31;
  73. monLen[Apirl]=30; monLen[May]=31; monLen[June]=30;
  74. monLen[July]=31; monLen[August]=31; monLen[September]=30;
  75. monLen[October]=31; monLen[November]=30; monLen[December]=31;

  76. monWeeks[0]=0;
  77. monWeeks[January] = yDay;
  78. monWeeks[February] = ((monWeeks[January] +monLen[January] )%7);
  79. monWeeks[Match] = ((monWeeks[February] +monLen[February] )%7);
  80. monWeeks[Apirl] = ((monWeeks[Match] +monLen[Match] )%7);
  81. monWeeks[May] = ((monWeeks[Apirl] +monLen[Apirl] )%7);
  82. monWeeks[June] = ((monWeeks[May] +monLen[May] )%7);
  83. monWeeks[July] = ((monWeeks[June] +monLen[June] )%7);
  84. monWeeks[August] = ((monWeeks[July] +monLen[July] )%7);
  85. monWeeks[September] = ((monWeeks[August] +monLen[August] )%7);
  86. monWeeks[October] = ((monWeeks[September] +monLen[September] )%7);
  87. monWeeks[November] = ((monWeeks[October] +monLen[October] )%7);
  88. monWeeks[December] = ((monWeeks[November] +monLen[November] )%7);

  89. int i;
  90. for(i=January; i<=December; ++i)
  91. {
  92. printf("\n-------------------------------------------------\n");
  93. printf(" %d, %d \n",y,i);
  94. printf("-------------------------------------------------\n");
  95. printMonth(monWeeks[i],monLen[i]);
  96. printf("\n");
  97. }

  98. return;
  99. }


  100. int main(void)
  101. {

  102. int y;
  103. int quit=0;

  104. do
  105. {
  106. printf("Please enter which Year to Print For You (0 to quit): ");
  107. scanf("%d",&y);
  108. printf("\n");

  109. if(y==0)
  110. quit = 1;
  111. else
  112. printYear(y);

  113. }while(!quit);

  114. return 0;
  115. }
复制代码
输出

Please enter which Year to Print For You (0 to quit): 1973



-------------------------------------------------

                     1946, 1                     

-------------------------------------------------

    Sun    Mon    Jue    Wed    Thu    Fri    Sat

                    1      2      3      4      5

      6      7      8      9     10     11     12

     13     14     15     16     17     18     19

     20     21     22     23     24     25     26

     27     28     29     30     31





-------------------------------------------------

                     1946, 2                     

-------------------------------------------------

    Sun    Mon    Jue    Wed    Thu    Fri    Sat

                                         1      2

      3      4      5      6      7      8      9

     10     11     12     13     14     15     16

     17     18     19     20     21     22     23

     24     25     26     27     28





-------------------------------------------------

                     1946, 3                     

-------------------------------------------------

    Sun    Mon    Jue    Wed    Thu    Fri    Sat

                                         1      2

      3      4      5      6      7      8      9

     10     11     12     13     14     15     16

     17     18     19     20     21     22     23

     24     25     26     27     28     29     30

     31





-------------------------------------------------

                     1946, 4                     

-------------------------------------------------

    Sun    Mon    Jue    Wed    Thu    Fri    Sat

             1      2      3      4      5      6

      7      8      9     10     11     12     13

     14     15     16     17     18     19     20

     21     22     23     24     25     26     27

     28     29     30





-------------------------------------------------

                     1946, 5                     

-------------------------------------------------

    Sun    Mon    Jue    Wed    Thu    Fri    Sat

                           1      2      3      4

      5      6      7      8      9     10     11

     12     13     14     15     16     17     18

     19     20     21     22     23     24     25

     26     27     28     29     30     31





-------------------------------------------------

                     1946, 6                     

-------------------------------------------------

    Sun    Mon    Jue    Wed    Thu    Fri    Sat

                                                1

      2      3      4      5      6      7      8

      9     10     11     12     13     14     15

     16     17     18     19     20     21     22

     23     24     25     26     27     28     29

     30





-------------------------------------------------

                     1946, 7                     

-------------------------------------------------

    Sun    Mon    Jue    Wed    Thu    Fri    Sat

             1      2      3      4      5      6

      7      8      9     10     11     12     13

     14     15     16     17     18     19     20

     21     22     23     24     25     26     27

     28     29     30     31





-------------------------------------------------

                     1946, 8                     

-------------------------------------------------

    Sun    Mon    Jue    Wed    Thu    Fri    Sat

                                  1      2      3

      4      5      6      7      8      9     10

     11     12     13     14     15     16     17

     18     19     20     21     22     23     24

     25     26     27     28     29     30     31







-------------------------------------------------

                     1946, 9                     

-------------------------------------------------

    Sun    Mon    Jue    Wed    Thu    Fri    Sat

      1      2      3      4      5      6      7

      8      9     10     11     12     13     14

     15     16     17     18     19     20     21

     22     23     24     25     26     27     28

     29     30





-------------------------------------------------

                     1946, 10                     

-------------------------------------------------

    Sun    Mon    Jue    Wed    Thu    Fri    Sat

                    1      2      3      4      5

      6      7      8      9     10     11     12

     13     14     15     16     17     18     19

     20     21     22     23     24     25     26

     27     28     29     30     31





-------------------------------------------------

                     1946, 11                     

-------------------------------------------------

    Sun    Mon    Jue    Wed    Thu    Fri    Sat

                                         1      2

      3      4      5      6      7      8      9

     10     11     12     13     14     15     16

     17     18     19     20     21     22     23

     24     25     26     27     28     29     30







-------------------------------------------------

                     1946, 12                     

-------------------------------------------------

    Sun    Mon    Jue    Wed    Thu    Fri    Sat

      1      2      3      4      5      6      7

      8      9     10     11     12     13     14

     15     16     17     18     19     20     21

     22     23     24     25     26     27     28

     29     30     31



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/asiainfolf/archive/2010/08/29/5847101.aspx

作者: sohu2000000   发布时间: 2010-08-29

类似于cal命令吗?

作者: ecjtubaowp   发布时间: 2010-08-29

话说你这样一个个赋值很累的啊…………
还有你的程序竟然没有缩进…………

作者: daybreakcx   发布时间: 2010-08-29