免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 15639 | 回复: 49
打印 上一主题 下一主题

[C] [原创] C语言实现:万年历 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-29 13:29 |只看该作者 |倒序浏览
经过近这几天的努力,终于写完了这个"万年历"的程序了,共享一下, 特别是同"勉"共享 {:3_193:}

[需求]

    请打印出任意年份的日历

[代码]

  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

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
2 [报告]
发表于 2010-08-29 13:53 |只看该作者
类似于cal命令吗?

论坛徽章:
0
3 [报告]
发表于 2010-08-29 13:55 |只看该作者
话说你这样一个个赋值很累的啊…………
还有你的程序竟然没有缩进…………

论坛徽章:
0
4 [报告]
发表于 2010-08-29 14:26 |只看该作者
回复 2# ecjtubaowp

类似于cal命令吗?
ecjtubaowp 发表于 2010-08-29 13:53



当时木有想那么多,只是做了个小程序玩玩

我没有使用time的API,自己写了个实现,但是我自己认为比起cal指令,应该还差得远着呢,  比如时间精确的粒度,跨时区的问题,都木有解决。多谢你的提醒,以后争取做得更完善点

论坛徽章:
0
5 [报告]
发表于 2010-08-29 14:32 |只看该作者
回复 3# daybreakcx


话说你这样一个个赋值很累的啊…………
还有你的程序竟然没有缩进…………
daybreakcx 发表于 2010-08-29 13:55


本来想在一个init的子程序中做初始化赋值的,后来是在是太困了,就偷了个懒,没有搞什么数组和指针的传递了,被你发现了,呵呵 下次注意了会
另外,缩进我也想,但是咱们这个版区的发帖子的内容里面的代码部分木有语法高亮的功能,偶黏贴进来的时候是有缩进滴~~~冤枉 {:3_199:}

论坛徽章:
0
6 [报告]
发表于 2010-08-29 14:38 |只看该作者
如果是整体复制过来,tab那些的也是保留的,自然是带缩进的

论坛徽章:
0
7 [报告]
发表于 2010-08-29 15:15 |只看该作者
回复 6# daybreakcx


   
如果是整体复制过来,tab那些的也是保留的,自然是带缩进的
daybreakcx 发表于 2010-08-29 14:38



    又给你发信了,汗 {:3_204:}

   其实不是整个黏贴过来滴,代码是我从原文件上写下来滴,只是最下面的那句"本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/asiainfolf/archive/2010/08/29/5847101.aspx"是我自己手工加上滴。。。 。。。 {:3_201:}

论坛徽章:
0
8 [报告]
发表于 2010-08-29 15:34 |只看该作者
学习了

论坛徽章:
0
9 [报告]
发表于 2010-08-29 16:11 |只看该作者
{:3_182:}好  要支持

论坛徽章:
0
10 [报告]
发表于 2010-08-29 17:35 |只看该作者
回复 8# youyou1986925


   
学习了
youyou1986925 发表于 2010-08-29 15:34


   {:3_193:}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP