C语言编写万年历

上一次的万年历在后来的测试发现当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 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值