python系列练习第4题

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))#输出显示
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值