用java解决"三天打渔两天晒网"问题

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

这个问题可以分为三步解决:①计算从2010年1月至指定日期之间间隔的天数;

                                                          ②“打渔”和“晒网”的最小周期为5天,所以用计算出的天数除以5;

                                                          ③根据余数判断他是在“打渔”还是在“晒网”  ,若余数为0、1、2则他在打渔,否则在晒网

具体实现:首先,用字符输入缓冲流(BufferedReader)从文件读入数据;其次,用SimpleDateFormat类来处理日期,包括解析日期,判断日期是否合理(关闭日期自动转换即setLenient(false)),由数据格式或不合理日期(比如13月,或者2月30号)引起的程序异常,不要直接抛出,catch起来作为一个结果(输入信息有误)输出;然后,对数据进行计算处理,用getTime()方法得到1970年1月1日8:00到两个日期的毫秒数后相减再除以一天的毫秒数,得到两个日期的相隔天数,要注意一点,当指定日期在2010年1月1日之前时,也就是说还没有开始“三天打鱼两天晒网”活动,这种情况也可以当做信息输入错误来处理;最后,用字符输出缓冲流(BufferedWriter)输出结果到指定文件。

程序代码(含注释): 

/**
 * @Package: com.cyh.fishing 
 * @author: cyh   
 * @date: 2018年8月29日 下午7:33:58
 */
package com.cyh.fishing;
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.text.SimpleDateFormat;
import java.util.Date;
/**
 * @ClassName: fishing
 * @Description: 解决"三天打渔两天晒网"问题
 * @author: cyh
 * @date: 2018年8月29日 下午7:34:26
 */
public class Fishing {
    /**
     * @Fields beginDate : 开始日期
     */
    Date beginDate;
    /**
     * @Fields endDate : 终止日期
     */
    Date endDate;
    /**
     * @Title: precess
     * @Description: 对数据进行计算处理并返回打印信息
     * @return String
     * @author cyh
     * @date 2018年8月29日 下午8:25:15
     */
    public String precess() {
        int days; // 开始日期与终止日期之间相隔的天数
        days = (int) ((endDate.getTime() - beginDate.getTime()) / (1000 * 60 * 60 * 24)); // 计算相隔的天数
        if (days < 0) { // 终止日期在开始日期之前,相隔天数为负
            return "输入信息有误!";
        }
        switch (days % 5) { // 打渔晒网一个周期为5天,利用间隔天数除以5判断打渔还是晒网
        case 0:
        case 1:
        case 2:
            System.out.println("days:" + days); // 在控制台输出间隔天数便于调试(可删除)
            System.out.println("输出结果:打渔!"); // 在控制台输出结果(可删除)
            return "打渔!";
        default:
            System.out.println("days:" + days); // 在控制台输出间隔天数便于调试(可删除)
            System.out.println("输出结果:晒网!"); // 在控制台输出结果(可删除)
            return "晒网!";
        }
    }
    /**
     * @Title: ioput
     * @Description: 进行文件输入输出操作
     * @author cyh
     * @date 2018年8月29日 下午10:17:51
     */
    public void ioput() {
        String input; // 接收从文件读入的数据
        FileReader reader; // 创建字符输入流对象
        FileWriter writer; // 创建字符输出流对象
        BufferedReader br; // 创建字符缓冲输入流对象
        BufferedWriter bw; // 创建字符缓冲输出流对象
        SimpleDateFormat sdf; // 创建SimpleDateFormat对象来处理要输入的日期
        sdf = new SimpleDateFormat("yyyyMMdd"); // 初始化SimpleDateFormat对象并设置解析日期格式
        sdf.setLenient(false); // 给setLenient方法传入false,禁止解析日期时将不合法的日期自动计算转换为合法的日期
        try {
            reader = new FileReader("in.txt"); // 路径默认在工程文件夹下,若想指定路径,可改用绝对路径
            br = new BufferedReader(reader);
            writer = new FileWriter("out.txt");
            bw = new BufferedWriter(writer);
            while ((input = br.readLine()) != null) { // 一次读取文件中的一行数据赋给input,为空时结束循环
                System.out.println("读入的数据为:" + input); // 在控制台输出从文件读入的数据便于调试(可删除)
                try {
                    beginDate = sdf.parse("20100101"); // 用parse方法直接解析出日期
                    endDate = sdf.parse(input);
                } catch (ParseException e) { // 若输入的信息有误,则无法解析,打印错误信息
                    System.out.println("输出结果:输入信息有误!");
                    bw.write("输入信息有误!");
                    bw.newLine();
                    continue; // 打印完错误信息后,跳出本次循环,进入下次循环,避免执行下面的操作打印错误的结果
                }
                bw.write(precess()); // 在文件里输出precess()方法返回的结果
                bw.newLine(); // 换行
            }
            br.close(); // 关闭流通道
            bw.close();
        } catch (IOException e) {
            System.out.println("IO异常!");
        }
    }
    /**
     * @Title: main
     * @Description: 主方法(程序入口)
     * @param args void
     * @author cyh
     * @date 2018年8月29日 下午7:37:35
     */
    public static void main(String[] args) {
        Fishing fish = new Fishing();
        fish.ioput();
    }
}

输入的数据(in.txt)和输出的结果(out.txt):

用java解决用java解决

你可能感兴趣的:(java,IO流)