三天打鱼两天晒网

三天打鱼两天晒网

利用java写的判断打鱼还是晒网的一段代码,具有良好的输入输出,,支持文件的输入与写出,对输入的数据以及文件可以较好的判断其正确性

源代码:

public class tsetFish {
    public static void main(String[] args) throws Exception {
        boolean legal = false;// *设置关键字,标示输入日期是否合法*
        String time1 = "2010-1-1";
        tsetFish test = new tsetFish();// *实例化该类的一个对象*
        while (true) {//*使用户循环查询,当用户不需要时,break退出循环*
            System.out.println("选择输入或文件,1输入日期,2输入文件,输入3结束使用");  

            try{
                Scanner sc = new Scanner(System.in);//*实例化Scanner类从键盘接收输入*
                int op = sc.nextInt();//*从键盘接收*
                if (op == 1) {//*接收1时,则单独从键盘接收,并判断*
                    inPutDate(test);
                } else if (op == 2) {//*接收2时,则单独从文件输入*
                    System.out.println("请输入文件地址,输入文件中每行只有一条日期");
                    System.out.println(" 日期格式为2013-2-4   输出结果将在e:/out.txt文件中");
                    Scanner x = new Scanner(System.in);
                    String input= x.nextLine();//*接收输入文件地址*
                     test.receivefile(input);//*将文件地传给*
                } else if(op==3){//*选择退出查询*
                    System.out.println("欢迎您下次使用");
                    break;
                }
                else {
                    System.out.println("您的输入不正确,请重新输入");
                }
            }catch(Exception e){
                System.out.println("你的输入格式不正确,请重新输入");
            }


        }
    }
    /*
     * 从键盘接收字符串的函数
     */
    public static void inPutDate(tsetFish test) throws Exception {//当用户选择1时,调用此函数
        System.out.println("请输入在2010-1-1以后的时间查询,比如2010-5-21");
        Scanner sc = new Scanner(System.in);
        String date= sc.nextLine();//*键盘接收,返回接收的字符串date*
        boolean legal = test.timelegal(date);//*调用timelegal函数,判断接收的字符串是否合法,如果合法则返回true*
        if (legal) {
            test.judge(test.dates("2010-01-01", date));//*首先调用dates函数,目的是计算天数并返回。然后将返回的天数传给judge函数,判断此刻渔夫在做什么。*
        }
    }

这部分是接受文件与输出文件的函数

    /*
     *              接收文件的函数
     */
    public void receivefile( String input) throws IOException, Exception  {
        boolean legal = false;// *设置关键字,标示文件中的输入日期是否合法*
        String date = null;/*/声明时间字符串date*
        tsetFish test = new tsetFish();// *实例化该类的一个对象*
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(new File(input))));//*创建字符缓冲流(文件输入流)*
            FileOutputStream fos = new FileOutputStream("e:/out.txt");//*创建文件输出流*
            while ((date = in.readLine()) != null) {//*如果读取的文件内容不为空,则一直查询*

                    legal = test.timelegal(date.trim());// *如果接收到字符串则进行判断该字符串是否合法*
                    if (legal) {/*/如果合法,则进行以下计算*
                        String str = test.judge(test.dates("2010-01-01", date.trim()));// *调用计算天数的函数,并将返回值返回给判断函数,判断此刻在捕鱼还是在晒网*
                        str=date.trim()+str;//*写入文件时,将日期与对应结果共同输入*
                        fos.write(str.getBytes());/*/将判断结果输出到out.txt文件中*
                        fos.write("\r\n".getBytes());//*换行*
                    }
            }
            System.out.print("文件为空了\r\n");
            fos.close();//*关闭流*
            in.close();
        } catch (FileNotFoundException e) {
            System.out.print("找不到文件");//*找不到文件异常*
        }
    }

用来判断输入的日期是否合法

    /*
     * 判断输入日期是否合法的函数
     */
    public boolean timelegal(String time2) {
        boolean legal = false;// *设置关键字,标示输入日期是否合法*
        DateFormat format = new SimpleDateFormat("yyyy-mm-dd");// *设置将字符串解析为时间的模板*
        try {
            Date date2 = format.parse(time2);// *将输入的字符串解析为时间,检查输入的时间格式是否正确*
        } catch (ParseException e) {
            System.out.print("您输入的格式不正确     ");
            return legal;
        }
        String[] time2Array = time2.split("-");// *输入的时间格式正确,分割输入的字符串,将接收的日期字符串按—分割,存入数组time2Array*
        int year = Integer.valueOf(time2Array[0]);// *time2Array[0]代表年数year*
        int month = Integer.valueOf(time2Array[1]);// *time2Array[1]代表月数month*
        int day = Integer.valueOf(time2Array[2]);// *time2Array[2]代表天数day*
        if (((month == 4) || (month == 6) || (month == 9) || (month == 11)) && (day < 31)) {// *判断当为4,6,9,11月是,天数是否合法*
            legal = true;
        } else if (((month == 1) || (month == 3) || (month == 7) || (month == 8) || (month == 10) || (month == 12))
                && day < 32) {// *判断当为1,3,7,8,10,12月是,天数是否合法*
            legal = true;
        } else if ((month == 2)) {
            if ((year % 4 == 0 & year % 100 != 0) || year % 400 == 0) {// *判断是否是闰年*
                if (day < 30) {// *判断当为闰年时,二月的天数是否合法*
                    legal = true;
                } else {
                    System.out.println("您输入的日期不合法");
                }
            } else {// *判断当不是闰年时,二月的天数是否合法*
                if (day < 29) {
                    legal = true;
                } else {
                    System.out.println("您输入的日期不合法");
                }
            }
        } else {
            System.out.println("您输入的日期不合法");
        }
        return legal;// 返回关键字
    }

计算相隔的天数

    /*
     * 计算日期天数函数,返回天数
     */
    public int dates(String time1, String time2) {
        int days = 0;
        Date date1 = null;
        Date date2 = null;
        DateFormat format = new SimpleDateFormat("yyyy-mm-dd");// *设置将字符串解析为时间的模板*
        try {
            date2 = format.parse(time2);// *将输入的字符串解析为时间*
            date1 = format.parse(time1);// *将2010-1-1解析为时间*
            long day2 = date2.getTime();// *计算输入时间相对时间戳的毫秒数*
            long day1 = date1.getTime();// *计算2010-1-1相对时间戳的毫秒数*
            days = (int) ((day2 - day1) / (1000 * 3600 * 24));// *计算毫秒数相差,并换算为天数*
        } catch (ParseException e) {
            return -1;
        }
        return days+1;//*返回天数*
    }

利用周期判断打鱼还是晒网函数

    /*
     * 判断在打鱼还是在晒网函数
     * 
     */
    public String judge(int days) throws Exception {
        String str = null;
        if (days >= 0) {// *判断天数是否为正数,如果是则计算天数,否则天数过早*
            int y = (days % 5);// *天数对周期数取模,*
            if (y == 1 || y == 2 || y == 3) {// *如果模为1,2,3则在打鱼,否则在晒网*
                str = "主人正在打鱼,改天请你吃鱼";
            } else {
                str = "最近正在晒网,改天带你去打鱼";
            }
        } else {
            System.out.println("您输入的日期过早了");
        }
        System.out.println(str);
        return str;
    }
}

程序流程图

这里写图片描述

主要方法:

1:文件输入与输出方法receivefile(String input)

目前只做到了,逐行输入,且每行只有一条信息。从键盘输入文件地址,判断文件是否存在。若不存在,则重新输入。若存在,逐行的读取信息,并判断日期格式是否正确然后计算天数得出结果,将结果输出到文件,知道读取完或文件为空为止。

2:字符串判断方法timelegal(String time2)

首先利用format判断字符串格式是否正确,若错误则重新输入,若正确,则判断日期是否合法,如是否符合实际,包括闰年与平年,若正确则继续,反之回到开始。

3:计算天数方法dates(String time1,String time2)

首先利用format.parse,将字符串解析为时间对象,然后调用getTime()方法,求得相对于同一个时间戳的毫秒数,并将其转化为天数

    date2 = format.parse(time2);// *将输入的字符串解析为时间*
    date1 = format.parse(time1);// *将2010-1-1解析为时间*
    long day2 = date2.getTime();// *计算输入时间相对时间戳的毫秒数*
    long day1 = date1.getTime();// *计算2010-1-1相对时间戳的毫秒数*
    days = (int) ((day2 - day1) / (1000 * 3600 * 24));// *计算毫秒数相差,并换算为天数*
4:判断打鱼或晒网方法judge( int dates)

首先判断,天数为正,然后对周期数5求模,当为1,2,3时在打鱼,否则在晒网。
if (days >= 0) {// 判断天数是否为正数,如果是则计算天数,否则天数过早
int y = (days % 5);// 天数对周期数取模,
if (y == 1 || y == 2 || y == 3) {// 如果模为1,2,3则在打鱼,否则在晒网
str = “主人正在打鱼,改天请你吃鱼”;
} else {
str = “最近正在晒网,改天带你去打鱼”;
}
} else {
System.out.println(“您输入的日期过早了”);
}

心得

虽然这道题很简单,但在写的过程中,让我有了很大的收获。我深刻的理解到,任何一个细小的点,都是至关重要的,特别在输入的检查过中,我思考了很多,感觉了其中的乐趣。经过不断的测试与修改,这段代码已经基本符合要求,可以较好的对用户的输入进行检查,并且具有文件输入输出的功能,而且,也可以检查文件的内容是否正确。不过还有缺陷,那就是文件中的日期只能按行读取。感谢老师的要求,这是我第一次写博客,但让自己感觉很充实,我决心坚持下去,以后经常写下自己平时所学习的东西,激励自己。本人水平有限,还在不断学习中,如果文章有错误,欢迎提出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值