三天打鱼两天晒网(python)

三天打鱼两天晒网

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

 

输入:键盘输入数据或者文件输入测试数据

输出:判断的结果

要求:输入日期的正确性验证,文件测试数据

 

解题思路:核心思路就是得到给定的日期和给定的最开始的日期之间相隔的天数,然后以天数除以5,得到余数,通过判断余数是大于3还是小于三,大于三则是晒网,小于三则是打鱼。(python)

程序流程图:

 

 

代码编写:

代码的编写注重流程,根据本题的解题思路,第一个要解决的就是解决两个日期之间的时间差天数,但是对于一个输入的日期,首先要把字符类型转化成日期类型,然后通过日期类型之间的相互计算得到时间差。

 

通过时间差除以打鱼晒网的周期,得到的一个余数即是这天在这五天中所处的哪一天,通过数学知识很容易得到这天在进行的动作。也就是天数除以5取余,如果结果大于3,则表示在晒网,如果结果小于3,则表示在打鱼。

 

1,首先先解决计算天数的问题

通过调用datetime模块中datetime中的方法strptime(),来将符合格式要求的字符串的数据转化成日期类型的数据,最后输出其中的间隔天数。

本模块中遇到的问题则是函数的选择,以及从俩个datetime类型的数据装化成整形的数据对象类型。

 

2,其次解决的是计算的问题

传入相应的参数,其中的第一个参数是相隔的天数,第二个参数是输入的日期数据,分别用来判断和写入文件中来扩大自己的out.txt文件。本模块遇到的问题是输出文件的格式,于是在检查的同时加上换行符得到换行的文件,更容易观察。

 

到此最基本的输入输出问题判断等核心问题已经解决。

3,文件测试

文件测试通过逐行的读取输入,调用第一点的方法来获取天数,调用获取结果的方法,来获得每条的结果,然后写入文件之中,利用循环,当读取到最后的时候直接结束。

 

4,判断数据的有效性

调用time模块中的strptime()方法,使用try机制获得数据是否满足日期的格式要求,测试如下:

 

5,主测试的方法

过程中采用输入数据测试和文件测试混合的办法,于是每次输入数据就会有一个输入正确性的检测,数据不合格就继续输入。

重点是利用输入的数据去扩大in.txt文件,在扩大过程中,遇到了一系列的问题。首先,in.txt文件的产生必须满足文件测试方法的运行。

由于当文件in.txt为空的时候,或者首行为空行的时候,就会出现文件测试方法的报错。

而对于in.txt文件,必须满足数据输入进去必须换行。 那么就是文件为空时,不需要换行。本来想到的是直接在每条记录的后面换行,但是一旦一个文件最开始的时候里卖弄存有数据,那么我们第一条记录肯定与最后一条记录同行,所以需要一个检测和在记录前换行。比如这种数据:

最终通过os.path.getsize()获取文件的大小,满足以上需求,最终结果为:

 

 

总结:

本次的代码编写过程中,循序渐进的编写。首先通过分析题目得出题目解法的核心思路,然后第一步就是通过利用核心思路去解决我们这个问题需要解决的核心问题。也就是利用python里面相关的模块,来得到用户输入的天数与最开始的天数的差,得到天数,再计算得到具体的结果。

然后再基于我们对核心问题的解,去扩展得到满足更多要求的解法,最终满足整个的基本要求和提高要求。满足文件测试的需求,满足输入数据检测的需求,满足扩大文件的需求。

总的来说就是循序渐进,一步一步的解决一个要求很多的问题。

 

附完整代码如下:

from datetime import datetime
import time
import os

# date input with the keyboard
def get_days(date_input):
    # get the days
    date_base = '2010-01-01'
    # date_input = input('please input the date you want to test with the form xxxx-xx-xx:')
    # check its form and work out the answer
    date_input = datetime.strptime(date_input, '%Y-%m-%d')
    date_base = datetime.strptime(date_base, '%Y-%m-%d')
    date_days = (date_input - date_base).days
    return date_days

# to work out the result into the file out.txt
def work_result(date_days,date_input):
    mod_day = date_days % 5
    # date_input = datetime.strptime(date_input, '%Y-%m-%d')
    with open('out.txt', 'a') as file_out:
        if mod_day <= 3:
            file_out.write(date_input + '  fishing\n')
            print(date_input + '  fishing')
        else:
            file_out.write(date_input + '  webbing\n')
            print(date_input + '  webbing')
    file_out.close()

# test the aoolication with file date
def file_date_test():
    print('the following is file test')
    with open('in.txt') as file:
        context_line = file.readline()
        while context_line:
            # remove the  character '\n'
            context_line = context_line.rstrip('\n')
            # get the days
            days_in_file = get_days(context_line)
            # work out into the file out.txt
            work_result(days_in_file,context_line)
            context_line = file.readline()
    file.close()

# check the date
def isVaildDate(date):
    try:
        time.strptime(date, "%Y-%m-%d")
        return True
    except:
        return False

if __name__ == "__main__":
    date_input = input('please input the date you want to test with the form xxxx-xx-xx:')
    while not isVaildDate(date_input):
        date_input =input('date is illegal,please check and input it again:')

    # expand ths test file use the input
    with open('in.txt', 'a') as file_input:
        size = os.path.getsize('in.txt')
        if size==0:
            file_input.write(date_input)
        else:
            file_input.write('\n'+ date_input)
    file_input.close()

    # test the application
    date_days = get_days(date_input)
    work_result(date_days,date_input)
    # test the file input and output
    file_date_test()
  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值