基于Python实现万年历的详细过程是什么
Admin 2022-08-23 群英技术资讯 343 次浏览
A:先输出提示语句,并接受用户输入的年、月。
B:根据用户输入的年,先判断是否是闰年。
C:根据用户输入的月来判断月的天数。
D:用循环计算用户输入的年份距1900年1月1日的总天数。
E:用循环计算用户输入的月份距输入的年份的1月1日共有多少天。
F:相加D与E的天数,得到总天数。
G:用总天数来计算输入月的第一天的星期数。
H:根据G的值,格式化输出这个月的日历!
根据题目的八个要求,可以看出有些功能是重复或者说需要相互调用的,所以可以用模块的思想将每个要求封装成函数;
①判断是否是闰年函数
根据闰年的判断规则,如果年是4的倍数,但不是100的倍数则是闰年或者是400的整数倍也是闰年,所以函数需要传入一个参数(年份)
#判断闰年 def B(year): if year % 4 == 0 and year % 100 != 0 or year % 400 == 0: return True return False
②判断输入月的天数的函数
除了2月份会根据平年和闰年发生变化以外, 每月的天数是已经确定好的;所以此时需要调用已经定义好的判断闰年的函数才能确定二月的天数;所以函数需要传入两个参数(月份和年份)
此时有两个小技巧,一个是判断月份是那月,最开始用的是用相等加上or去判断是否满足条件,其实可以将大月或者小月的月份写到一个列表中,然后再通过in去判断;第二个是在确定天数时,可以先定义好一个常用值,然后根据月份去修改其值,最后返回常用值即可,这样就少了几行的赋值以及返回的代码
def C(year,month): days = 31 #31天居多,设置为默认值 if month == 2 : #2月份要判断是否是闰年 if B(year): days=29 else: days=28; elif month in [4,6,9,11]: #判断小月,只有30天 days=30 return days
③计算年份距离1900的总天数的函数
因为平年跟闰年的天数不一样,所以要调用判断闰年的函数,确定其一年的总天数;
总天数也就是相当于求每年的天数之和即可;所以需要去遍历每年的天数求其总和即为结果;所以函数需要传入一个参数(年份)
#某年到1900年的天数 def D(year:int): day = 0 for i in range(1900,year): if B(i): day +=366 else: day +=365 return day
④ 月份距离1月1日的天数的函数
距离1月1日的天数也就是每月天数的总和,此时就先需要确定其每月的天数,也就是需要调用之前定义的函数,还需要知道的是其年份判断是否闰年,所以函数需要传入两个参数(年份和月份)
遍历每月的天数(通过调用函数而来),然后将其求和,得到的就是需要的结果
#某月到1月1号的天数 def E(year:int,month:int): days = 0 for i in range(1,month): days += C(year,i) return days
⑤确定星期几的函数
首先通过调用求年份距离的天数和月份的天数得到其天数总和,所以函数需要传入两个参数(月份和年份)
然后将总和加一(因为得到的是月份,而算天数时要奖当日计算再内),然后对7求余即为星期几
#确定星期几 def G(year:int,month:int): total_day = D(year) + E(year,month) + 1 week = total_day % 7 return week
⑥格式化输出日历函数
输出有两种格式,一种是星期日在第一天,一种是星期日在最后一天;
第一种方式:星期日在第一天,根据得到的星期几函数(也就是当月1号的星期几函数),可以确定第一天的位置(也就是1的位置);
日历也就是输出1到总天数(根据月份确定)在对应的位置(星期几),由于1号的位置已经确定,而一号前面的则为空,所以单独遍历输出空格,然后再输出日历;
一周对应的是七天,也就是每七天进行一次换行,所以还需要定义一个计数器
第二种方式:也就是星期日在最后一天,其他逻辑都是一样的,只是在确定1号的位置不一样;
本来周日的位置为第一个,但是现在变成了最后一个,也就是位置向后移了6位,所以只需要计算位置的时候先将其加上,然后再求余即可
#格式化输出 def my_print(total:int): # iCount = 0 # print("日\t一\t二\t三\t四\t五\t六") # for i in range((G(year, month) % 7)): # print(end='\t') # iCount += 1 # for i in range(1, C(year, month) + 1): # print(i, end='\t') # iCount += 1 # if iCount % 7 == 0: # print('') iCount = 0 print('一\t二\t三\t四\t五\t六\t日\t') for i in range(((G(year,month) + 6) % 7)): print(end='\t') iCount +=1 for i in range(1,C(year,month) + 1): print(i,end='\t') iCount +=1 if iCount % 7 == 0: print('')
# -*- coding: utf-8 -*- from datetime import date import calendar # def B(year): # if year/4==0 and year/400 !=0: # return True # elif year/100 == 0 and year/400 ==0 : # return True # else: # return False #判断闰年 def B(year): if year % 4 == 0 and year % 100 != 0 or year % 400 == 0: return True return False # def C(year:int,month:int): # days = 30 # if month in [1,3,5,7,8,10,12]: # days = 31 # elif month == 2: # if B(year): # days = 29 # else: # days = 28 # return days #每月的天数 def C(year,month): days = 31 #31天居多,设置为默认值 if month == 2 : #2月份要判断是否是闰年 if B(year): days=29 else: days=28; elif month in [4,6,9,11]: #判断小月,只有30天 days=30 return days #某年到1900年的天数 def D(year:int): day = 0 for i in range(1900,year): if B(i): day +=366 else: day +=365 return day #某月到1月1号的天数 def E(year:int,month:int): days = 0 for i in range(1,month): days += C(year,i) return days #确定星期几 def G(year:int,month:int): total_day = D(year) + E(year,month) + 1 week = total_day % 7 return week #格式化输出 def my_print(total:int): # iCount = 0 # print("日\t一\t二\t三\t四\t五\t六") # for i in range((G(year, month) % 7)): # print(end='\t') # iCount += 1 # for i in range(1, C(year, month) + 1): # print(i, end='\t') # iCount += 1 # if iCount % 7 == 0: # print('') iCount = 0 print('一\t二\t三\t四\t五\t六\t日\t') for i in range(((G(year,month) + 6) % 7)): print(end='\t') iCount +=1 for i in range(1,C(year,month) + 1): print(i,end='\t') iCount +=1 if iCount % 7 == 0: print('') if __name__ == '__main__': year = int(input('请输入年:')) month = int(input('请输入月')) my_print(G(year,month))
因为函数多,而且计算的结果不方便去口头的验算其结果,也就是说当结果不对时不知道是那出现的问题时,系统提供的
from datetime import date import calendar
两个模块中有方法可以得出其天数以及星期几的结果,这样就可以查找到底是哪一步出现的问题了;也可以通过print去验证单个的函数是否正确;
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要为大家介绍了python数字图像处理实现图像的形变与缩放示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
Python如何优雅地对数据进行分组?一些朋友可能会遇到这方面的问题,对此在下文小编向大家来讲解一下,内容详细,易于理解,希望大家阅读完这篇能有收获哦,有需要的朋友就往下看吧!
这篇文章主要介绍了Python flask框架,主要以对flask 微web框架优势特点、demo web应用程序程序步骤以及对flask模块中路由和模版两个功能进行基本了解。具有一定的参考价值,需要的朋友可以参考一下
pip 是一个现代的、通用的安装和管理 Python 包的工具,这意味着它是一个工具,允许你安装和管理不属于标准库的其他库和依赖。
pytest有丰富的命令行选项,以满足不同的需要,下面这篇文章主要给大家介绍了关于Python教程之pytest命令行方式运行的相关资料,需要的朋友可以参考下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008