【实战】打印万年历

判断闰年:

y%400==0 or y%4==0 and y%100!=0

y可以被400整除,或y可以被4整除,但不能被100整初。满足条件则为闰年;

求一个月份的最大天数:

由于2月份的天数不同,判断是否闰年决定取28还是29;

计算某一天是该年的第几天:

    days=d
    if m>=2:
        days+=31
    if m>=3:
        days+=29 if isLeap(y) else 28
    if m>=4:
        days+=31
    if m>=5:
        days+=30
    if m>=6:
        days+=31
    if m>=7:
        days+=30
    if m>=8:
        days+=31
    if m>=9:
        days+=31
    if m>=10:
        days+=30
    if m>=11:
        days+=31
    if m>=12:
        days+=30
    return days

  

d的值再加上前面所有月份天数的总和

根据公式计算这一天是星期几:

    w=(y-1)+(y-1)//400+(y-1)//4-(y-1)//100+countDays(y,m,1)
    return w%7

最后就是打印了,依此打印出每个月。

end=""

  设置不换行,当w%7==0,即日期为星期日时换行

预览效果:

 

代码如下:

 1 def isLeap(y): #判断闰年
 2     return y%400==0 or y%4==0 and y%100!=0
 3 
 4 def maxDays(y,m): #求某月的最大天数
 5     d=30
 6     if m==1 or m==3 or m==5 or m==7 or m==8 or m==10 or m==12:
 7         d=31
 8     elif m==2:
 9         d=29 if isLeap(y) else 28
10     return d
11 
12 def countDays(y,m,d): #计算某一天是这一年的第几天
13     days=d
14     if m>=2:
15         days+=31
16     if m>=3:
17         days+=29 if isLeap(y) else 28
18     if m>=4:
19         days+=31
20     if m>=5:
21         days+=30
22     if m>=6:
23         days+=31
24     if m>=7:
25         days+=30
26     if m>=8:
27         days+=31
28     if m>=9:
29         days+=31
30     if m>=10:
31         days+=30
32     if m>=11:
33         days+=31
34     if m>=12:
35         days+=30
36     return days
37 def countWeek(y,m): #计算这一天是星期几
38     w=(y-1)+(y-1)//400+(y-1)//4-(y-1)//100+countDays(y,m,1)
39     return w%7
40 def printMonth(y,m):
41     w=countWeek(y,m)
42     md=maxDays(y,m)
43     print("%-6s%-6s%-6s%-6s%-6s%-6s%-6s"%("Sum","Mon","Tue","Wed","Thu","Fri","Sat"))
44     for i in range(w): #打印一个月的日历
45         print("%-6s" % "",end="")
46     for d in range(1,md+1):
47         print("%-6d" % d,end="")
48         w=w+1
49         if w%7==0:
50             print()
51 y=input("输入年份")
52 y=int(y)
53 for m in range (1,13):
54     print()
55     print("- - - - -",y,"",m,"月- - - - -")
56     printMonth(y,m)
57     print()

 

转载于:https://www.cnblogs.com/yj920/p/9969487.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值