python制作万年历

最近进行python基础培训,课下作业制作万年历,之前没做过,感觉里面还是有很多需要学的。所谓万年历,就是咱们电脑或者手机的日期会记录每个月每天对应星期几。用python来制作万年历,就是从键盘输入年份和月份,然后输出对应的日历表。在制作过程中有如下问题需要思考:

  • 万年历的起始时间,也就是从哪一天算起?

  • 平年和闰年的天数不一样,同时,每个月的天数不一样,如何对输入日期距离起始日期的天数求和?

  • 如何打印出万年历的样子?

    针对这些问题进行思考,可以让逻辑更清楚。首先,万年历从1990年1月1日开始,对应星期一。求输入日期到1990年1月1日的天数可分为两部分,比如输入2019年9月,那么需要分别计算2018年12月31日到1990年1月1日的天数,以及2019年8月31号到2019年1月1号的天数,最后加1(关于加1这个还没懂,我的程序后面没有加1是对的,但是如果我加1,就错开一位了)。由于里面涉及到平年和闰年,所以需要先判断,同时之后求每个月天数时还要判断平年和闰年,所以直接写个判断函数。

#判断平年和闰年
def leap_year(year):
    if(year%4==0 and year%100==0) or (year%400==0):
        return True
    else:
        return False

下面需要计算每个月的天数 ,其中需要注意2月份要判断平年和闰年,调用leap_year()函数即可。

#计算每个月的天数
def monthdays(year,month):
   if month==2:
        if leap_year(year):
            days=29
        else:
            days=28
    elif month in[4,6,9,11]:
        days=30
    else:
        days=31
    return days

接下来我们计算输入年份year和月份month代表的日期,距离1990年1月1日的天数,如前面所说需要分成两部分,

#计算总天数
def totaldays(year,month):
    yearday=0
    for i in range(1990,year):#计算输入年份之前的
       if leap_year(i):
           yearday+=366
       else:
           yearday+=365
    for i in range(1,month):#注意不能包括该月份
        yearday+=monthdays(year,i)
    return yearday
    

完成现在准备工作之后,就进行显示函数,利用Input()函数从控制台输入,打印过程需要注意

#显示函数
year=int(input("请输入年"))
month=int(input("请输入月"))
week=(totaldays(year,month))%7  #计算该月第一天是周几
print('日\t一\t二\t三\t四\t五\t六\t')
for i in range(0,week):  #前面打印week个空格
    print("\t",end="")
for i in range(1,monthdays(year,month)+1):  #c从week+1的位置开始打印数字
    if (totaldays(year,month)+i)%7==0: #天数为7的倍数时,记住要换行
        print(i,end="\n")
    else:
        print(i,end="\t")

运行之后,结果如下:
在这里插入图片描述
不过我还是没弄懂,有些程序是求出总天数之后加1,然后去模7,但是我这个程序出来结果是对的,一直想不明白,如果有知道的,麻烦指点一下,对了,如果print出来的是一二三四五六日,这种程序需要稍微改动一下,这里就不说了,大家可以自己思考一下。

猜你喜欢

转载自blog.csdn.net/weixin_44460780/article/details/101013780