/(ㄒ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)
网友评论