python系列练习第4题
说明:
练习题来自 RUNOOB.COM网站中的python练习100例。
题目:
输入某年某月某日,判断这一天是这一年的第几天?
程序分析:
以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于2时需考虑多加一天:
以下是给出的答案
year = int(input('year:\n'))#输入年
month = int(input('month:\n'))#输入月
day = int(input('day:\n'))#输入日
months = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334)#按之前月份天数相加的和做一个列表。
if 0 < month <= 12:#判断月份输入是否正确
sum = months[month - 1]#通过输入的月份得出当前月份之前全部天数
else:
print('data error') #月份输入不在1-12月之间,提示错误
sum =sum + day #全部天数加上输入的天数
leap = 0
if (year % 400 == 0) or ((year % 4 == 0) and (year % 100 != 0)):
#普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1900年不是闰年)
#世纪年能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)
leap = 1#确定是否为闰年
if (leap == 1) and (month > 2):#如果是闰年并且输入的月份大于2月那就加一天
sum += 1
print('it is the %dth day.' % sum)
答案中有一个漏洞,就是可能存在输入的日期大于当前月份的最大日期。比如 3月共 31天,但日期输入时只要是整数都会被通过。可能会被输入100
自己解题1,在没有看答案的情况下。同样没有考虑日期和年份输入的问题
nian = int(input('输入年:'))#输入年
yue = int(input('输入月:'))#输入月
riqi = int(input('输入日:'))#输入日
i = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)#把每个月的天数用列表形式显示出来
x = 0#定义一个用来存放天数的变量
if 0 < yue <= 12:#判断当前输入的天数是否在1-12月之间
for z in range(1, yue):#通过循环找出输入月份之前所有月份的天数
x += i[z - 1]#将所有天数累加
if yue > 2 and ((nian % 400 == 0) or ((nian % 4 == 0) and (nian % 100 != 0))):
# 普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1900年不是闰年)
# #世纪年能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)
x = x + 1 + riqi#如果是闰年,那么就在累计天数之上加一天,并加上输入的天数
elif yue == 1:#判断输入的月份是不是1月
x = riqi#如果输入月份为1月,天数直接取输入日期
else:#输入的年不是闰年,同时也不是1月,执行下面命令
x = x + riqi#在累计天数上加日期
print(x)#输出结果
发现上面两个有漏洞也是在调试时,输入了一个小数点。使程序报错。下面是改进后防止输入错误的代码。
n = 0#存放年
y = 0#存放月
r = 0#存放日期
x = 0#累计天数
i = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)#把每个月的天数用列表形式显示出来
while True:#循环语句,
nian = input('输入年份:\n ') # 输入年
if nian.isdigit() == True:#判断输入的年是否为数字
n = int(nian)#如果都为数字,就将年转换成整数存入“n”中
break#跳出循环
else:#当判断条件不成立时
print('你输入的年份不对,请重新输入')#提示重新输入。
while True:
yue = input('输入月份:\n ') # 输入月
if yue.isdigit() == True:#判断输入的月是否为数字
y = int(yue)#如果都为数字,就将月转换成整数存入“y”中
if 0 < y <= 12:#判断输入的月是否在1-12月之间。
break#跳出循环
else:#不在1-12月之间,提示错误
print('你输入的月份不对,请重新输入')#提示重新输入
else:#不都是数字时提示错误
print('你输入的月份不对,请重新输入')#提示重新输入
while True:
riqi = input('输入日期:\n ') # 输入日期
if riqi.isdigit() == True:#判断输入的日期是否为数字
r = int(riqi)#如果都为数字,就将日期转换成整数存入“r”中
if r <= i[y-1]:#判断当前输入的日期是否超过当前输入月份的最大日期
break#跳出循环
else:#不都是数字时提示错误
print('你输入的日期不对,请重新输入')#提示重新输入
else:#不都是数字时提示错误
print('你输入的日期不对,请重新输入')#提示重新输入
for z in range(1,y):#通过循环找出输入月份之前所有月份的天数
x += i[z-1]#将所有天数累加
if y > 2 and ((n % 400 == 0) or ((n % 4 == 0) and (n % 100 != 0))):
# 普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1900年不是闰年)
# 世纪年能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)
x = x + 1 + r#如果是闰年,那么就在累计天数之上加一天,并加上输入的天数
elif y == 1:#判断输入的月份是不是1月
x = r#如果输入月份为1月,天数直接取输入日期
else:#输入的年不是闰年,同时也不是1月
x = x + r#在累计天数上加日期
print('当前为第:{}天'.format(x))#输出显示