Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1455674
  • 博文数量: 704
  • 博客积分: 10140
  • 博客等级: 上将
  • 技术积分: 6230
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-15 20:41
文章分类

全部博文(704)

文章存档

2013年(1)

2012年(16)

2011年(536)

2010年(151)

分类: C/C++

2011-01-17 19:51:45


  1. /*
  2.  * File : calender.c
  3.  * ----------------------
  4.  * This program is used to generate a calender for a year entered by user.
  5.  */

  6. #include <stdio.h>

  7. /*
  8.  * Constants:
  9.  * -----------
  10.  * Days of the week are represented by the integers 0-6.
  11.  * Month of the year are identified by the integers 1-12.
  12.  */

  13. #define Sunday 0
  14. #define Monday 1
  15. #define Tuesday 2
  16. #define Wednesday 3
  17. #define Thursday 4
  18. #define Friday 5
  19. #define Saturday 6

  20. #define IsALeapYear(year) ((year % 4 == 0) && (year % 100 !=0)) || (year % 400 == 0) 

  21. /* Fuction prototypes */

  22. void GiveInstructions();
  23. int GetYear();
  24. void PrintCalender(int year);
  25. void PrintCalenderMonth(int year,int month);
  26. char * MonthName(int month);
  27. int FirstDayOfMonth(int year,int month);
  28. int MonthDays(int year,int month);
  29. void IndentFirstLine(int weekday);


  30. /* Main Program */

  31. void main()
  32. {
  33.     int year;

  34.     GiveInstructions();
  35.     year = GetYear();
  36.     PrintCalender(year);
  37. }


  38. /*
  39.  * Function: GiveInstructions
  40.  * Usage: GiveInstructions();
  41.  * ------------------------------------
  42.  * This program prints out instructions to user.
  43.  */

  44. void GiveInstructions()
  45. {
  46.     printf("\n\n----------This program displays a calender for a full year.----------\n\n\n");
  47. }


  48. /*
  49.  * Function: GetYear
  50.  * Usage: year = GetYear();
  51.  * -----------------------------------
  52.  * This program will get a year from user.
  53.  */

  54. int GetYear()
  55. {
  56.     int year;

  57.     printf("-----Please input a year:");
  58.     scanf("%d",&year);
  59.     printf("\n");
  60.     return (year);
  61. }


  62. /*
  63.  * Fuction: PrintCalender
  64.  * Usage: PrintCalender(year);
  65.  * ---------------------------------------
  66.  * This program will print out a calender for a entire year.
  67.  */

  68. void PrintCalender(int year)
  69. {
  70.     int month;

  71.     for (month = 1; month <= 12; month++) {
  72.         PrintCalenderMonth(year, month);
  73.     }
  74. }


  75. /*
  76.  * Function: PrintCalenderMonth
  77.  * Usage: PrintCalenderMonth(int year, int month)
  78.  * -------------------------------------------------------------
  79.  * This program will print out a calender for a entire month.
  80.  */

  81. void PrintCalenderMonth(int year, int month)
  82. {
  83.     int nDays,weekday,i;

  84.     printf(" %s %d\n",MonthName(month),year);
  85.     printf(" Su Mo Tu We Th Fr Sa\n");

  86.     nDays = MonthDays(year,month);
  87.     weekday = FirstDayOfMonth(year,month);

  88.     IndentFirstLine (weekday);
  89.     for (= 1; i <= nDays; i++) {
  90.         printf(" %2d",i);
  91.         if (weekday == Saturday) printf("\n");
  92.         weekday = (weekday + 1) % 7;
  93.     }
  94.     if (weekday != Sunday) printf("\n");
  95. }


  96. /*
  97.  * Function: MonthName
  98.  * Usage: char * MonthName(month)
  99.  * ------------------------------------------
  100.  * This program prints out the monthname.
  101.  */

  102. char * MonthName(int month)
  103. {
  104.     switch (month) {
  105.         case 1: return ("January");
  106.         case 2: return ("February");
  107.         case 3: return ("March");
  108.         case 4: return ("April");
  109.         case 5: return ("May");
  110.         case 6: return ("June");
  111.         case 7: return ("July");
  112.         case 8: return ("August");
  113.         case 9: return ("September");
  114.         case 10: return ("October");
  115.         case 11: return ("November");
  116.         case 12: return ("December");
  117.         defualt: return ("Illegal month");
  118.     }
  119. }


  120. /*
  121.  * Function: FirstDayOfMonth
  122.  * Usage: weekday = FirstDayOfMonth(year,month)
  123.  * -------------------------------------------------------
  124.  * This program returns the weekday of a month.
  125.  */

  126. int FirstDayOfMonth(int year,int month)
  127. {
  128.     int i,weekday,nDays;
  129.     weekday = Monday;

  130.     if (year > 1900) {
  131.         for (= 1900; i < year; i++) {
  132.             weekday = (weekday + 365) % 7;
  133.             if (IsALeapYear(i)) weekday = (weekday + 1) % 7;
  134.         }
  135.         for (= 1; i < month; i++) {
  136.             nDays = MonthDays(year,i);
  137.             weekday = (weekday + nDays) % 7;
  138.         }
  139.     }
  140.     else{
  141.         for (= 1900; i > year; i--) {
  142.             weekday = (weekday - 365 + 7 * 53 ) % 7;
  143.             if (IsALeapYear(i)) weekday = (weekday + 6) % 7;
  144.         }
  145.         for (= 1; i < month; i++) {
  146.             nDays = MonthDays(year,i);
  147.             weekday = (weekday + nDays) % 7;
  148.         }
  149.     }
  150.     return (weekday);
  151. }


  152. /*
  153.  * Function: MonthDays
  154.  * Usage: nDays = MonthDays(year,month)
  155.  * -----------------------------------------------------
  156.  * This program returns the number of days for a month.
  157.  */

  158. int MonthDays(int year,int month)
  159. {
  160.     switch (month) {
  161.         case 2:
  162.         if (IsALeapYear(year)) return (29);
  163.         return (28);
  164.         case 4:case 6:case 9:case 11:
  165.         return (30);
  166.         default : return (31);
  167.     }
  168. }


  169. /*
  170.  * Function: IndentFirstLine
  171.  * Usage: IndentFirstLine(weekday)
  172.  * --------------------------------------
  173.  * This program prints out some blank spaces for the calender.
  174.  */ 

  175. void IndentFirstLine(int weekday)
  176. {
  177.     int i;

  178.     for (= 0; i < weekday; i++)
  179.     {
  180.         printf(" ");
  181.     }
  182. }


  183. /* 参考《C语言的科学与艺术》*/
阅读(452) | 评论(0) | 转发(0) |
0

上一篇:Linux 网络栈剖析

下一篇:狂人C

给主人留下些什么吧!~~