用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 1:s2+=31;
            case 2://闰年时需要加29天
                if(year%4==0&&year%100!=0||year%400==0)
                s2+=29;
                else s2+=28;
            case 3:s2+=31;
            case 4:s2+=30;
            case 5:s2+=31;
            case 6:s2+=30;
            case 7:s2+=31;
            case 8:s2+=31;
            case 9:s2+=30;
            case 10:s2+=31;
            case 11:s2+=30;
            case 12: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.总结:解决将从读取到的文件中的字符串转换为可计算的整型值时一开始的思路为将整个字符串全部转换为整型值后再分离出年月日,但对特殊数据可操作性小,后改为先截取字符串在转换为整型值。
整体设计步骤为先设计计算天数的算法确定运行正确后加入字符流来向文件中进行读取和写入操作。
————————————————

原文链接:https://blog.csdn.net/weixin_45970047/article/details/115056038

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容