上一次的万年历在后来的测试发现当1号是周日时,无法正确输出,后来加了语句:
if(week == 0)
week=7;
并且在确定当前日期到1900年1月1日的方法进行改进,不在采用for循环来遍历1900年到当前年份之间闰年的个数,而是直接用(year - 1900)/4的方法。
这个程序经过了1900,1904,1905,2000,2003年的2,3,4,7月份测试
代码:
1 #include<stdio.h>
2 #include<stdlib.h>
3
4 int leap(int i)//判断是否是闰年
5 {
6 if(!(i%4)&&i%100||!(i%400))
7 return 1;//闰年
8 else
9 return 0;//不是闰年
10 }
11
12 int monthday(int i)//判断每月对应天数
13 {
14 switch(i)
15 {
16 case 1:case 3:case 5:case 7:case 8:case 10:case 12:
17 return 31;
18 break;
19 case 4:case 6:case 9:case 11:
20 return 30;
21 break;
22 case 2:
23 return 28;
24 break;
25 }
26 }
27
28 int monthcal(int i)
29 {
30 int m=0;
31 switch(i)
32 {
33 case 1:
34 m=0;
35 break;
36 case 2:
37 m=31;
38 break;
39 case 3:
40 m=59;
41 break;
42 case 4:
43 m=31+28+31;
44 break;
45 case 5:
46 m=31+28+31+30;
47 break;
48 case 6:
49 m=31+28+31+30+31;
50 break;
51 case 7:
52 m=31+28+31+30+31+30;
53 break;
54 case 8:
55 m=31+28+31+30+31+30+31;
56 break;
57 case 9:
58 m=31+28+31+30+31+30+31+31;
59 break;
60 case 10:
61 m=31+28+31+30+31+30+31+31+30;
62 break;
63 case 11:
64 m=31+28+31+30+31+30+31+31+30+31;
65 break;
66 case 12:
67 m=31+28+31+30+31+30+31+31+30+31+30;
68 break;
69 }
70 return m;
71 }
72
73
74 int main()
75 {
76 int year=0,month=0,i=0,j=0,day=0,week=0,m=0,n=0,md=0,k=1;
77 printf("Please input year and month:\n");
78 scanf("%d%d",&year,&month);
79 while(getchar()!='\n');//接收年月,并消除错误输入
80
81 if(year<1900||month<1||month>12)
82 {
83 printf("wrong input!!!\n");
84 exit(1);
85 }
86
87 if(leap(year))
88 if(month > 2)
89 day=(year - 1900) * 365 + (year - 1900) / 4 + monthcal(month);
90 else
91 day=(year - 1900) * 365 + (year - 1900 - 1) / 4 + monthcal(month);
92 else
93 day=(year - 1900) * 365 + (year - 1900) / 4 + monthcal(month);
94 printf("%d\n",day);
95 printf("%d\n",monthcal(month));
96 week=day%7 + 1;
97 if(week == 0)
98 week = 7;
99 printf("%d\n",week);
100
101 //输出至屏幕
102 printf(" %d年%d月 \n",year,month);
103 printf(" 一 二 三 四 五 六 日\n");
104 //打印第一行,先打印空格
105 for(m=0,n=0;n<week-1;n++)
106 printf(" ");
107 for(n=week-1;n<7;n++,++k)
108 printf("%3d",k);
109 printf("\n");
110 //确定打印天数
111 if(leap(year)>0)
112 {
113 if(2==month)
114 md=29;
115 else
116 md=monthday(month);
117
118 }
119 else
120 md=monthday(month);
121 //打印剩余天数
122 for(m=1;m<6;m++)
123 {
124 for(n=0;n<7;n++,++k)
125 {
126 if(k<=md)
127 printf("%3d",k);
128 }
129 printf("\n");
130 }//printf("%d",md);检查md的值
131
132 return 0;
133 }
C语言编写万年历
最新推荐文章于 2022-04-26 16:06:24 发布