三天打渔,两天晒网

有俗语说,一位老者家住河边,打渔三天,晒网两天,问自2010年1月1日起,以后的某一天是打渔还是晒网。
首先,这个问题实现起来有三个重要的点需要注意
1.a年b月c日至2010年1月1日有多少天
2.计算出天数差与周期求余
3.余数是1,2,3,则打渔;余数是0,4,则晒网

流程图如下:
在这里插入图片描述

问题一:怎么求天数差呢?
说到天数,如果用户输入天数在2010年1月1日之前,也要有相应的处理方式,接下来一个小菜鸟的程序来了。

if(year < 0||month < 1||month >12){
            System.out.println("请输入合法日期");
            System.exit(0);
        }else{
            if(isLeapYear(year)&&month == 2){
                Month_Days[month] = 29;
            }
            if(day == 0||day > Month_Days[month]){
                System.out.println("请输入合法日期");
                System.exit(0);
            }
        }

天数差的求解过程:
闰年、平年问题,闰年一年有366天,平年一年有365天,即闰年的2月有29天
1.年:某年-2010-1:算出整年的天数,其中要注意闰年
2.月:如果a年是闰年并且b月月数大于2,要多加一天
3.日:输入的日子c
公式:天数差 = 年+月+日
小菜鸟的代码在下面呢
1.闰年的判断程序

/**
     * @param: [year]
     * @return: boolean
     * @Description:判断year是否是闰年
     */
    public boolean isLeapYear(int year){

        if(year%400 == 0||(year%4 == 0&&year%100 != 0)){
            return true;
        }else{
            return false;
        }
    }

2.获取天数差的代码:

/**
     * @param: []
     * @return: int
     * @Description:获取输入日期至2010年1月1日的天数差
     */
    public int getAllDays(){

        int days = 0;
        int startYear = 2010;
        if(year > startYear){
            for(;startYear<year;startYear++){
                if(isLeapYear(startYear)){
                    days += 366;
                }else{
                    days += 365;
                }
            }
        }
        for(int i=1;i<month;i++) {
            days += Month_Days[i];
            if(isLeapYear(year)&&month > 2){
                days++;
            }
        }
        days += day;
        return days;
    }

问题二:得到了天数差,接下来就是打渔Or晒网判断啦。。。
天数差%5 = 1 或 2 或 3--------->打渔
天数差%5 = 0 或 4---------------->晒网
接下来就是代码实现了
这段代码中有在out.txt中显示的方法哦

/**
     * @param: []
     * @return: void
     * @Description:判断这天是打渔Or晒网,并在out.txt中显示
     */
    public void isFishing() throws IOException{
        FileWriter writer = new FileWriter("out.txt");
        BufferedWriter bw = new BufferedWriter(writer);
            int result = getAllDays() % 5;
            if (result == 0 || result == 4) {
                System.out.println("晒网");
                bw.write("晒网");
            } else {
                System.out.println("打渔");
                bw.write("打渔");
            }
        bw.close();
    }

问题三:从in.txt中读取日期的程序去哪了?
我找找哈,嗒嗒嗒,在这里:
从in.txt中读取,把字符型数据转换成整型数据
Integer.parseInt(String)的作用就是将String字符类型数据转换为Integer整型数据。

        BufferedReader br = new BufferedReader(new FileReader("in.txt"));
        String line = br.readLine();
        year = Integer.parseInt(line.substring(0, 4));
        month = Integer.parseInt(line.substring(4, 6));
        day = Integer.parseInt(line.substring(6, 8));

基本问题结束,放一个测试图
保存了一个合法的日期
在这里插入图片描述
显示结果:在这里插入图片描述
但是,程序还是有一个问题,就是当你在in.txt中换行输入两个日期时,out.txt中只会显示第一个日期干的事情
为了这个问题查阅了一些代码,还是没有解决,下来我会继续学习,等下一次更博客时,这个问题会继续完善的。

猜你喜欢

转载自blog.csdn.net/weixin_44369212/article/details/88078466