一、题目:中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是 "晒网”。用C或C++语言/java/python实现程序解决问题
二、基本要求: 1.程序风格良好(使用自定义注释模板),提供友好的输入输出。
三、思路:
*问题分析与算法设计
根据题意可以将解题过程分为三步:
1)计算从2010年1月1日开始至指定日期共有多少天;
2)由于“打鱼"和“晒网"的周期为5天,所以将计算出的天数用5去除;
四、程序流程图:
五、代码:
/**
* FileName:Judge.java
* Description:中国有句俗语叫“三天打鱼两天晒网”,某人从2010年1月1日开始起“三天打鱼两天晒网”
* 问这个人在以后的某一天中是“打鱼”,还是“晒网”
* History:
* 版本号 作者 日期 简要操作以及相关介绍
* 1.0 陈茜 2018-08-29 判断是打渔还是晒网的相关方法
*/
package exercise.judge.domain;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 测试目标日期是打渔还是晒网
* @author ChenXi
* @version 1.0
* @see Jdk1.9 API
* */
public class Judge {
/**
* 把日期字符串转成Date的方法
* @param source 要转换的日期字符串
* @param pattern 要转换的格式,这里必须和日期字符串的格式一样
* @return 解析后的日期对象
* @throws ParseException 如果格式不一致,将抛出解析异常
* */
public static Date stringToDate(String source) throws ParseException{
String pattern = "yyyy-MM-dd";//将字符串日期解析为Date类型的规则
return new SimpleDateFormat(pattern).parse(source);
}
/**
* 求两个日期的之间的天数
* @param ms测试日期到指定日期的毫秒数
* @param days测试日期到指定日期的天使
* @param num天数模5的值
* */
public static long toDays(Date testDate,Date start) {
return (testDate.getTime()-start.getTime())/1000/60/60/24;
}
/**
* 判断是打渔还是晒网
* @param s 用来记录是打渔还是晒网
* */
public static String dayuOrShaiwang(long days) {
long num = (days)%5;//得到余数
String s = null;
if (days>=0) {
if (num==0||num==1||num==2) {
s = "打渔";
}
if(num==3||num==4){
s = "晒网";
}
}else {
s = "日期不合法无法计算是打渔还是晒网";
}
return s;
}
}
/**
* FileName:JudgeTest.java
* Description:中国有句俗语叫“三天打鱼两天晒网”,某人从2010年1月1日开始起“三天打鱼两天晒网”
* 问这个人在以后的某一天中是“打鱼”,还是“晒网”
* History:
* 版本号 作者 日期 简要操作以及相关介绍
* 1.0 陈茜 2018-08-29 Judge的测试类
*/
package exercise.judge.test;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.text.ParseException;
import java.util.Date;
import exercise.judge.domain.Judge;
public class JudgeTest {
public static void main(String[] args) throws IOException, ParseException {
// TODO Auto-generated method stub
//设置开始打渔的日期
String start = "2010-01-01";
BufferedReader bf = new BufferedReader(new FileReader("D:\\javaProgram\\exercise\\bin\\exercise\\judge\\testDate\\in.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\javaProgram\\exercise\\bin\\exercise\\judge\\testDate\\out.txt",true));
while(bf.ready()) {
//读入第一个测试日期
String test = bf.readLine();
//把开始日期转化为Date类的对象
Date startDate = Judge.stringToDate(start);
//把测试日期转化为Date类的对象
Date testDate = Judge.stringToDate(test);
//计算测试日期与开始日期之间相隔的天数
long days = Judge.toDays(testDate,startDate);
//判断是打渔还是晒网
String result = Judge.dayuOrShaiwang(days);
//把结果写入out.txt文件
bw.write(test+" "+result);
//写入换行符
bw.newLine();
//刷新文件
bw.flush();
}
//关闭输入流
bf.close();
//关闭输出流
bw.close();
}
}
六、程序调过程:
Error1:Date类通过造方法设置时间的方法已经被弃用,java虚拟机在编译时不会保存,但是运行的时候会报错。
调试:开始时间在测试类设置,调用将字符串转换为Date对象的方法进行后续操作。运行结果不会报错,程序运行后的out.txt文件如图所示
反思:虽然程序运行通过但是有不足之处,写入的文件是很长很长一行,也不便于结果检验和阅读。
调试:写入换行符