python青苔计划(六)打印万年历

青苔计划

/(ㄒoㄒ)/~~

我这样的小白

万年历打完,感觉身体被掏空

请给我暖暖的拥抱 ╮(╯╰)╭

----------正经的分割线----------

任务要求

刚看到要打印万年历,我彻底懵逼了,从何打起?怎么打!特别是把农历和阳历搞混了,被农历中的闰月的概念折磨的死去活来,一番折磨后彭老师在学习群中再次强调要分拆目标(PS:分拆真的是一种能力)

目标分拆

  • 判断year是否为闰年(关系到2月的天数)
  • 判断month每个月的天数
    分为31天,30天,29天,28天四中(用于计算每年的总天数)
  • 判断每月1日对应的星期几(根据参考日期:1990年1月1日是星期一,计算某年某月万年历开始打印的位置)

1.判断是否为闰年

#判读是否为闰年
def yes_or_not_leap_year(year): #定义函数
    if year%4==0 and year%100!=0 or year%400==0:
        return True #返回值供计算2月天数使用
    else:
        return False

2.判断每个月的天数

#判断每个月的天数,并返回对应月的天数,供计算输入日期与1990年1月1日的天数差
def days_of_the_month(year,month):
    if month in [1,3,5,7,8,10,12]:
        return 31
    elif month in [4,6,9,11]:
        return 30
    elif yes_or_not_leap_year(year):#根据是否为闰年,返回2月对应的天数
        return 29
    else:
        return 28

3.计算查询的日期距离1990年1月1日相差多少天

#计算查询的日期距离1990年1月1日相差多少天
def days_between_to_19900101(year,month):
    sum_days=0
    for y in range(1990,year):#计算相差年份对应的天数
        if yes_or_not_leap_year(year):
            sum_days=sum_days+366
        else:
            sum_days=sum_days+365
    for m in range(1,month):将本年至查询日期的天数计入
        sum_days=sum_days+days_of_the_month(year,month)
    return sum_days

4.计算查询月1号对应的是星期几

#判断一个月的第一天是星期几,以1990年1月1日为时间参考
def the_firstday_of_month(year,month):
    return 1+days_between_to_19900101(year,month)%7

5.打印万年历QAQ~

def print_wannianli(year,month):
    print(year," ",month)
    print("   "'星期一'"     " '星期二'"     "'星期三'"     "'星期四'"     "'星期五'"     "'星期六'"     "'星期日')
    i=the_firstday_of_month(year,month)
    print(('     A     '*(i-1)),end="")
    for p in range(1,days_of_the_month(year,month)+1):
        if i%7!=0:
            if len(str(p))==1:
                print('     ',end="")
                print(p,end='')
                print('     ',end="")
            else:
                print('    ', end="")
                print(p, end='')
                print('     ', end="")
        else:
            print('     ',end="")
            print(p)
        i=i+1

6函数调用

year=int(input("请输入要查询的年份"))
month=int(input("请输入要查询的月份"))
print_wannianli(year,month)

泪和汗

  • 提前学些函数构建和调用,没时间写出来啦
  • 打印时文字间的距离全部用空格调整,调了好久,因为日期存在len(month)=1的,还有len(month)=2的,所以导致错位,最终引起蝴蝶效应放大了错位
第一次尝试

经彭老师提醒后,加入日期的判断,终于可以了,日期中关键的几个空格我用了“A”代替,为了只管看到输出,其实可以删去

修正后

完整代码:打印万年历

#打印万年历
#1.判断是否为闰年
#2.计算每种情况下,每个月份的天数
#3.由2计算每年的天数
#4.计算每月一日对应的星期,基于1990年1月1日是星期一


#判读是否为闰年
def yes_or_not_leap_year(year):
    if year%4==0 and year%100!=0 or year%400==0:
        return True
    else:
        return False

#判断每个月的天数
def days_of_the_month(year,month):
    if month in [1,3,5,7,8,10,12]:
        return 31
    elif month in [4,6,9,11]:
        return 30
    elif yes_or_not_leap_year(year):
        return 29
    else:
        return 28

#计算查询的日期距离1990年1月1日相差多少天
def days_between_to_19900101(year,month):
    sum_days=0
    for y in range(1990,year):
        if yes_or_not_leap_year(year):
            sum_days=sum_days+366
        else:
            sum_days=sum_days+365
    for m in range(1,month):
        sum_days=sum_days+days_of_the_month(year,month)
    return sum_days

#判断一个月的第一天是星期几
def the_firstday_of_month(year,month):
    return 1+days_between_to_19900101(year,month)%7
#打印日历
def print_wannianli(year,month):
    print(year," ",month)
    print("   "'星期一'"     " '星期二'"     "'星期三'"     "'星期四'"     "'星期五'"     "'星期六'"     "'星期日')
    i=the_firstday_of_month(year,month)
    print(('     A     '*(i-1)),end="")
    for p in range(1,days_of_the_month(year,month)+1):
        if i%7!=0:
            if len(str(p))==1:
                print('     ',end="")
                print(p,end='')
                print('     ',end="")
            else:
                print('    ', end="")
                print(p, end='')
                print('     ', end="")
        else:
            print('     ',end="")
            print(p)
        i=i+1

#输入及启动程序
year=int(input("请输入要查询的年份"))
month=int(input("请输入要查询的月份"))
print_wannianli(year,month)

第一周打卡成功

青苔计划一周记

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 0.linux启动的步骤 设备加电----》BIOS自检-----》grub引导启动-----》加载内核----》...
    萌面大叔2阅读 4,185评论 0 1
  • 万年历的主要难点: 算出当月一号是星期几 格式化输出字符串 思路: 先指定一个确定了星期几的日期作为参考日期。比如...
    chaosmind阅读 7,460评论 0 3
  • 打印三角形 之前计划一次打一行“*”,使用 的方法,但是这对下个任务“打印万年历”似乎没有什么帮助,毕竟同一行的每...
    请万万喝水阅读 8,239评论 0 0
  • 矛即盾,盾即矛。 无矛无以盾之说 无盾何来矛之言 矛之所向,盾之所向 矛之所愿,盾之所愿 矛以攻盾,是以取胜 盾以...
    SoloDoris阅读 3,693评论 2 2
  • 喜欢民谣并不是为了显示自己多有逼格,也不是为了让别人知道我是多么有故事的人。大家都说民谣特别穷,民谣是特别穷,...
    未晓儿阅读 5,414评论 0 1

友情链接更多精彩内容