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

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

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

  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 }

 

你可能感兴趣的:(日历)