用Java语言解决三天打渔,两天晒网问题

问题描述:

中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言实现程序解决问题。
基本要求:1.程序风格良好(使用自定义注释模板),提供友好的输入输出。
提高要求:1.输入数据的正确性验证。
2.使用文件进行数据测试。如将日期 20100101 20111214 等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件。


问题分析:

根据题意可以将解题过程分为三步:
1.计算从2010年1月1日开始至指定日期共有多少天;
2.由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除;
3.根据余数判断他是在“打渔”还是在“晒网”;若余数为1,2,3,则他是在“打渔”否则是在“晒网”。
其中要判断经历年份中是否有闰年,二月为29天,平年为28天。
判断是否为闰年的语句应为(year%40&&year%100!=0||year%4000)
写入以及输出文本时使用I/O流中的字符流,写入文本后使用str.substring()截取字符串后Integer,parseInt()转换为int数据类型后便可进行后续计算。


流程图:

在这里插入图片描述

1.代码如下:

package dayushaiwang;
import java.io.*;
public class zuoye {
    public static void main(String[] args) throws Exception{
        //创建一个字符输入缓冲流对象
        BufferedReader br = new BufferedReader (new FileReader("in.dat"));
        //创建数组存放读取到的字符
        char[] duqu = new char[1024];
        int len =0;
        String str1 =null;
        //使用循环读取文本
        while((len=br.read(duqu))!=-1){
            str1 =new String(duqu,0,len);
        }
        //创建一个字符存放截取到的字符
        String str2;
        //使用str.substring()截取字符,下同
        str2=str1.substring(0,4);
        //将读取到的字符型转换为int型方便后续计算,下同
        int year =Integer.parseInt(str2);
        str2=str1.substring(4,6);
        int month =Integer.parseInt(str2);
        str2=str1.substring(6,8);
        int day =Integer.parseInt(str2);
        System.out.println("读取到的日期为"+year+"年"+month+"月"+day+"日");
        //创建一个字符输出缓冲流对象
        BufferedWriter bw = new BufferedWriter (new FileWriter("out.txt"));
        //声明一个字符串变量str
        String str=null;
        //分别排除年月日输入错误的情况
        if(year<2010){
            System.out.println("你输入的年份错误。");
            return;
        }
        if(month>12) {
            System.out.println("你输入的月份错误。");
            return;
        }
        if(day>31){
            System.out.println("你输入的日期错误。");
            return;
        }
        //定义变量,其中s代表总日期,s1,s2,s3分别表示年月日的天数
        int s,s1=0,s2=0,s3;
        int yue;
        //定义新变量yue替代month在switch语句中进行减一操作
        yue=month;
        //将day的值赋给s3
        s3=day;
        //使用switch可以方便的加上每个月的日期数,比if else语句更加简洁
        switch(yue-1)
        {
            case 12:s2+=31;
            case 11:s2+=30;
            case 10:s2+=31;
            case 9:s2+=30;
            case 8:s2+=31;
            case 7:s2+=31;
            case 6:s2+=30;
            case 5:s2+=31;
            case 4:s2+=30;
            case 3:s2+=31;
            case 2:if(year%4==0&&year%100!=0||year%400==0)
                s2+=29;                else s2+=28;
            case 1:s2+=31;
        }//最后一年的月份的所有日期全部加在了变量s2中
        //将s2与s3加在变量s中
        s=s2+s3;
        if(year==2010){
            //若为2010年,只需减去1月1日当天
            s=s-1;
        }
        else if(year>2010){
            for(int i=2011;i<year;i++){
                //判断闰年,闰年为366天
                if(i%4==0&&i%100!=0||i%400==0)
                    s1+=366;
                else s1+=365;
            }
            s1=364+s1;
            s=s1+s2+s3;
        }
        if(s%5==1||s%5==2||s%5==0){
            str="在"+year+"年"+month+"月"+day+"日此人在打渔";
            //通过缓冲流对象写入文件
            bw.write(str);
            System.out.println("在"+year+"年"+month+"月"+day+"日此人在打渔");
            System.out.println("结果已写入文件!请前往out.txt查看!");
        }
         else {
            str="在"+year+"年"+month+"月"+day+"日此人在晒网";
            //通过缓冲流对象写入文件
            bw.write(str);
            System.out.println("在"+year+"年"+month+"月"+day+"日此人在晒网");
            System.out.println("结果已写入文件!请前往out.txt查看!");
       }
        //关闭流
         bw.close();
         br.close();
}
}


2.(1.)测试用例:2021年3月21日
结果:此人在打渔
在这里插入图片描述
(2).测试用例:2010年1月10日
结果:此人在晒网
在这里插入图片描述
3.总结:解决将从读取到的文件中的字符串转换为可计算的整型值时一开始的思路为将整个字符串全部转换为整型值后再分离出年月日,但对特殊数据可操作性小,后改为先截取字符串在转换为整型值。
整体设计步骤为先设计计算天数的算法确定运行正确后加入字符流来向文件中进行读取和写入操作。

  • 49
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 37
    评论
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

希望小党永远开心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值