简单万年历

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <windows.h>  
  4.   
  5. //判断每个月的第一天是星期几,  
  6. int judgeFirstDate(int year, int m, int q)  
  7. {  
  8.     if(m == 1 || m == 2)  
  9.     {  
  10.         m += 12;//如果月份为1,2,则表示为去年的13,14月,年份也改为去年  
  11.         --year;  
  12.     }  
  13.     int j = year / 100;//j表示世纪  
  14.     int k = year % 100;//k表示本世纪的第几年  
  15.     int h = (q + 26*(m+1)/10 + k + k/4 + j/4 + 5*j) % 7;//h=0为周六,h=1为周日,依次类推  
  16.     return h;  
  17. }  
  18.   
  19. //处理周几,把h=0为周六改为h=0为周日,把h=1为周日改为h=1为周一,依次类推  
  20. int judgeWeek(int week)  
  21. {  
  22.     if(!week)  
  23.         return 6;  
  24.     else  
  25.         return --week;  
  26. }  
  27.   
  28. //把输入的字符串转换为数字年份  
  29. void input(char* cTime, int* year, int* month, int* day)  
  30. {  
  31.     int len = strlen(cTime);  
  32.     if(cTime[0] == '+')  
  33.     {  
  34.         ++(*month);  
  35.         return;  
  36.     }  
  37.     else if(cTime[0] == '-')  
  38.     {  
  39.         --(*month);  
  40.         return ;  
  41.     }  
  42.     *year = *month = *day = 0;  
  43.     *year = atoi(cTime);  
  44.     if(len >= 6)  
  45.         *month = atoi(cTime+5);  
  46.     if(len >= 8)  
  47.         *day = atoi(cTime+7);  
  48. }  
  49.   
  50. //判断是不是闰年  
  51. int isLeapYear(int year)  
  52. {  
  53.     if((year%400 == 0) || (year%4 == 0 && year%100 != 0))  
  54.         return 1;  
  55.     return 0;  
  56. }  
  57.   
  58. //输出月份最上边的哪个导航  
  59. void outputWeek()  
  60. {  
  61.     printf("Sunday    Monday    Tuesday   Wednesday Thursday  Friday    Saturday\n");  
  62. }  
  63.   
  64. //判断某年某个月份有几天  
  65. int monthDay(int year, int month)  
  66. {  
  67.     int judge = isLeapYear(year);  
  68.     switch(month)  
  69.     {  
  70.     case 1: case 3: case 5: case 7: case 8: case 10: case 12:  
  71.         return 31; break;  
  72.     case 4: case 6: case 9: case 11:  
  73.         return 30; break;  
  74.     case 2:  
  75.         return judge == 1 ? 29 : 28;  
  76.         break;  
  77.     }  
  78.     return 0;  
  79. }  
  80.   
  81. //输出某年的某个月  
  82. void outputOneMonth(int year, int month, int day)  
  83. {  
  84.     int i;  
  85.     int dayNum = monthDay(year,month);  
  86.     int week = judgeFirstDate(year,month,1);  
  87.     week = judgeWeek(week);  
  88.     outputWeek();  
  89.     for(i = 0; i < week; ++i)  
  90.         printf("          ");  
  91.     for(i = 1; i <= dayNum; ++i)  
  92.     {  
  93.         if(day == i) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),  
  94.                                              FOREGROUND_GREEN | FOREGROUND_INTENSITY);  
  95.         printf("%-10d",i);  
  96.         if(day == i) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),  
  97.                         FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);  
  98.         if((week+1)%7 == 0)  
  99.             printf("\n");  
  100.         ++week;  
  101.     }  
  102.     if(week %7 != 0)  
  103.         printf("\n");  
  104. }  
  105.   
  106. //输出一年的所有月份  
  107. void outputAllMonth(int year)  
  108. {  
  109.     int i;  
  110.     for(i = 1; i <= 12; ++i)  
  111.     {  
  112.         outputOneMonth(year,i,0);  
  113.         printf("\n");  
  114.     }  
  115. }  
  116.   
  117. int main()  
  118. {  
  119.     int year,month,day;  
  120.     char cTime[11];  
  121.     while(fgets(cTime,11,stdin))  
  122.     {  
  123.         //读入数据  
  124.         input(cTime,&year,&month,&day);  
  125.         printf("%d",year);  
  126.         if(month == 0)  
  127.         {  
  128.             printf("\n");  
  129.             //输出一年的所有月份  
  130.             outputAllMonth(year);  
  131.         }  
  132.         else  
  133.         {  
  134.             printf(".%d",month);  
  135.             if(day != 0)  
  136.                 printf(".%d",day);  
  137.             printf("\n");  
  138.             //输出某个月份  
  139.             outputOneMonth(year,month,day);  
  140.         }  
  141.         printf("+:last month\n-:next month\n");  
  142.     }  
  143.     return 0;  
  144. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值