三天打鱼两天晒网
问题描述:中国有句俗语叫“三天打鱼两天晒网”。某人从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()