三天打鱼,两天晒网Python版

问题概述:中国有句俗语叫“三天打鱼两天晒网”某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。

整体思路如下:

1)计算从2010年1月1日开始至指定日期共有多少天;

2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5取除;

3)根据余数判断他是在“打鱼”还是在“晒网”;

    若余数为1,2,3,则他是在“打鱼”

    否则是在“晒网”

    首先,我们要判断用户输入的日期是否正确,我在程序中规定日期的格式YYYYMMDD(年月日),并且只能为8位整数。采用INT(输入(XXX)即输入只能为整数,输入字符串时会产生异常,会提醒你输入整数。通过列表(STR(日期)),将输入的数字转为数组,方便之后提取年月日。也方便求输入的长度。通过LEN(日期)判断输入是否为8位。如果输入的不够八位数或者超过时也会产生异常,当输入正确的日期后,首先会数组提取日期,即数组0-3为年,4-5位月份,6-7为日。首先根据年份判断该日期是否在2010年之后,若不是则会产生异常。注意,Python中的异常采用尝试:...除了xxxError。

#输入现在的日期
try:  
    Date = int(input(‘请输入日期(以yyyymmdd):’))   #获取当前日期并规定输入格式只能为整数
    date = list(str(Date))
   
    try:
        if len(date) != 8:
            print("输入日期有误!")
        global year
        year = date[0] + date[1] + date[2] + date[3]
        year = int(year)         #将获取的年份从str类型转为int类型
        month = date[4] + date[5]
        month = int(month)       #将获取的月份从str类型转为int类型
        day = date[6] + date[7]
        day = int(day)           #将获取的天数从str类型转为int类型
        
        if year < 2010:
            print("请输入正确的日期!")
        sum = allDays(year,month,day)
        judge(sum)
        allDays(year,month,day)    
       
    except IndexError:      #当输入为整形时,但不是8位数时报错
        print("请输入八位整数")
except ValueError:     #当输入为非整型时报错
    print("请输入整数!")

接下来到了重点了!

获取到正确的输入日期信息以后就要来计算距离2010年1月1日的总天数了,为了锻炼自己的算法,和对问题分析能力。本人的程序中没有直接采用通过日期函数直接来获取并计算总天数。而是通过两部分来算,一部分是算距离2010年有多少年,闰年有366天,平年有365天,通过自定义函数runYear()来判断是否是闰年,函数如下图所示

#判断是不是闰年
def runYear(year):
    if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
        return True
    else:
        return False
           

接下来算用户输入日期这一年已经过了多少天,如果是闰年2会有29天,其他情况1。5。3。7。9月有31天4.6.9.11有30天。所以首先要判断每个月有多少天然后将这些月份的总天数相加,最后加上用户输入的“天”。

#判断每月有几天
def getDays(year,month):
    days = 0
    if month == 1 or month == 3 or month == 5 or month == 7 or month == 8 or month == 10 or month == 12:
        days = 31
    elif month == 4 or month == 6 or month == 9 or month == 11:
        days = 30
    elif month == 2:
        if runYear(year):
            days = 29
        else:
            days = 28
    return days
#计算该日期本年总天数
def thisYearDays(year,month,day):
    sum = 0
    i = 1
    while i < month:
        monthDay = getDays(year,month)
        sum += monthDay
        i += 1
    return sum + day

最后将这两部分相加就是用户输入的日期距离2010年1月1日的总天数,然后将其对5取余,根据余数判断为“打鱼”还是“晒网”

#计算距离输入日期的总天数
def allDays(year,month,day):
    sum = 0
    i = 2010
    while i < year:
        if runYear(i):
            sum += 366
        else:
            sum += 365
        i += 1
    s = thisYearDays(year,month,day)
    sum += s
    return sum

最后运行结果如下图所示

猜你喜欢

转载自blog.csdn.net/jackfjw/article/details/82191678