标签:
假定输入的年份合法正确。
刚开始毫无思路,觉得很难,写着写着就有灵感了。其实不难,只要掌握好循环控制就好了。写完之后,感觉其实没什么想法。就直接粘代码吧。
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