码迷,mamicode.com
首页 > 其他好文 > 详细

输入一个年份,输出该年份的日历

时间:2015-03-10 00:09:15      阅读:535      评论:0      收藏:0      [点我收藏+]

标签:

假定输入的年份合法正确。

刚开始毫无思路,觉得很难,写着写着就有灵感了。其实不难,只要掌握好循环控制就好了。写完之后,感觉其实没什么想法。就直接粘代码吧。

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 void printf_cal(unsigned);
  5 int is_leap_year(unsigned y);
  6 unsigned days_in_year(unsigned y, unsigned m, unsigned d);
  7 void swap(unsigned *m, unsigned *n);
  8 int days(unsigned y1, unsigned m1, unsigned d1);
  9 int week(unsigned, unsigned, unsigned);
 10 
 11 int main(int argc, char *argv[])
 12 {
 13     unsigned year;
 14 
 15     printf("请输入年份: ");
 16     scanf("%u", &year);
 17     printf_cal(year);
 18     system("pause");
 19     return 0;
 20 }
 21 
 22 int days(unsigned y2, unsigned m2, unsigned d2)
 23 {
 24     unsigned y1, m1, d1, i, n = 0;
 25     int flag = 0;
 26 
 27     y1 = 2015;
 28     m1 = 3;
 29     d1 = 9;
 30     if ( y1 > y2 || (y1 == y2 && m1 > m2) || (y1 == y2 && m1 == m2 && d1 > d2))
 31     {
 32         flag = 1;
 33         swap(&y1, &y2);
 34         swap(&m1, &m2);
 35         swap(&d1, &d2);
 36     }
 37     if (y1 != y2)
 38     {
 39         if (is_leap_year(y1))
 40             n += 366 - days_in_year(y1, m1, d1);
 41         else 
 42             n += 365 - days_in_year(y1, m1, d1);
 43         for ( i = y1 + 1; i < y2; i++)
 44         {
 45             if( is_leap_year(i) )
 46                 n += 366;
 47             else
 48                 n += 365;
 49         }
 50         n += days_in_year(y2, m2, d2);
 51     }
 52     else
 53         n = days_in_year(y2, m2, d2) - days_in_year(y1, m1, d1);
 54     if (flag) n = -n;
 55     return n;
 56 }
 57 
 58 unsigned days_in_year(unsigned y, unsigned m, unsigned d)
 59 {
 60     unsigned n = 0, i;
 61     unsigned months[13] = {0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 62 
 63     if(is_leap_year(y))
 64         months[2] = 29;
 65     else 
 66         months[2] = 28;
 67     for ( i = 1; i < m; i++)
 68         n += months[i];
 69     n += d;
 70     return n;
 71 }
 72 
 73 int is_leap_year(unsigned y)
 74 {
 75     if((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
 76         return 1;
 77     else 
 78         return 0;
 79 }
 80 
 81 void printf_cal(unsigned year)
 82 {
 83     unsigned m[3], d[3];
 84     int i, j, k, n = 1;
 85     int flag[3];
 86     unsigned months[13] = {0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 87 
 88     if (is_leap_year(year))
 89         months[2] = 29;
 90                                                 
 91     printf("                          \t        公元%d年日历       \t                          \n\n", year);
 92     while ( n < 13)
 93     {
 94         for(i = 0; i < 3; i++)
 95         {                       
 96             printf((i == 2) ? "            %d月           \n" : "            %d月           \t", n);
 97             d[i] = 1;
 98             m[i] = n++;
 99             flag[i] = 0;
100         }
101 
102         for(i = 0; i < 3; i++)                     
103             printf((i == 2) ? "SUN MON TUE WED THU PRI SAT\n" : "SUN MON TUE WED THU PRI SAT\t", n);
104 
105         while(!(flag[0] && flag[1] && flag[2]))
106         {
107             for(i = 0; i< 3; i++)
108             {
109                 j = week(year, m[i], d[i]);
110                 for (k = 0; k < j; k++)
111                     printf("    ");
112                 for (;j < 7; j++)
113                 {
114                     if (d[i] <= months[m[i]])
115                     {
116                         printf((d[i] < 10) ? "  %d " : " %d ",d[i]);
117                         d[i]++;
118                     }
119                     else
120                     {
121                         printf("    ");
122                         flag[i] = 1;
123                     }
124                 }
125                 printf("\t");
126             }
127             printf(" \n");
128         }
129         printf("\n");
130     }
131 }
132 
133 void swap(unsigned *m, unsigned *n)
134 {
135     unsigned tmp;
136     tmp = *m;
137     *m = *n;
138     *n = tmp;
139 }
140 
141 
142 int week(unsigned y, unsigned m, unsigned d)
143 {
144     int n;
145 
146     n = days(y, m, d);
147     n %= 7;
148     n = (n + 8) % 7 ;
149     return n;
150 }

 

输入一个年份,输出该年份的日历

标签:

原文地址:http://www.cnblogs.com/RookieSuperman/p/4324814.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!