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

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

*问题分析与算法设计
根据题意可以将解题过程分为三步:
1)计算从2010年1月1日与指定日期相差多少天;
2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除;
3)根据余数判断他是在“打鱼”还是在“晒网”;
若 余数为0,1,2,则他是在“打鱼”
否则 是在“晒网”
在这三步中,关键是第一步。
求从2010年1月1日与指定日期相差多少天,要判断经历年份中是否有闰年,二月为29天,平年为28天。闰年的方法可以用伪语句描述如下:
如果 ((年能被4除尽 且 不能被100除尽)或 能被400除尽)
则 该年是闰年;
否则 不是闰年。

中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用java实现程序解决问题。_第1张图片


/*
 * @author 徐於敏
 * 三天打渔,两天晒网问题
 */

import java.util.Scanner;
import java.io.*;

public class Week1 {
    public static void main(String[] args) throws Exception {
         //创建一个文件字节输出流
         FileOutputStream fos = new FileOutputStream("D:\\JAVA程序\\homework\\out.txt");
         String result;
         /*
          * 从键盘中输入年月日
          */
         Scanner n=new Scanner(System.in);
         System.out.println("请输入年:");
         int year=n.nextInt();
         System.out.println("请输入月份:");
         int month=n.nextInt();
         System.out.println("请输入日:");
         int day=n.nextInt();
         int sum=0;//记录相差的天数
         int sum1=0;//记录输入的日期在初始年过了多少天
         switch(month-1)
         {
         case 11: sum1+=30;
         case 10: sum1+=31;
         case 9: sum1+=30;
         case 8: sum1+=31;
         case 7: sum1+=31;
         case 6: sum1+=30;
         case 5: sum1+=31;
         case 4: sum1+=30;
         case 3: sum1+=31;
         case 2://判断是否为闰年
             if(year%4==0&&year%100!=0||year%400==0)
                 sum1+=29;
                 else
                     sum1+=28;
         case 1: sum1+=31;
         }
         sum1+=day;//在2010年1月1日到指定日期的总天数
         if(year<2010||month>12||day>31) {//判断输入的年月日是否正确
             System.out.println("输入的日期有误");
             return;
         } else if(year==2010) {//输入的年份是同一年
             sum=sum1-1;//减去1月1日后,得到的天数
         }else if(year>2010) {
             int sum2=364;//计算2010这一年除了1月1日后还剩几天,2010年为平年,还剩364天
             int sum3=0;//定义一个变量用来计算所输入的年份与2010年之间有几年
             for(int i=2011;i//计算输入年份与初始年份之间间隔年的天数,若没有间隔,则不执行
                 if(i%4==0&&i%100!=0||i%400==0) {//判断是否为闰年,是+366天
                     sum3+=366;
                 }else {//否则为平年,+365天
                     sum3+=365;
                 }
             }
             sum=sum1+sum2+sum3;//计算后相差的总天数
         }
         System.out.println("2010年1月1日与"+year+"年"+month+"月"+day+"日"+"相差的天数是:"+sum);
         /*
          * 若两个日期之间相差天数对5取余,余数为0,1,2为打渔,否则为晒网
          */
         if(sum%5==0||sum%5==1||sum%5==2) {
          result = year+"年"+month+"月"+day+"日"+"某人在打渔";
          System.out.println(result+":已经写入文件");
          fos.write(result.getBytes());//将结果写入out.txt
         }
         else {
         result = year+"年"+month+"月"+day+"日"+"某人在晒网";
         fos.write(result.getBytes());
         System.out.println(result+":已经写入文件");//将结果写入out.txt
         }
         fos.close();//关闭流
         n.close();
    }
}

运行截图:
1.成功运行
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用java实现程序解决问题。_第2张图片
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用java实现程序解决问题。_第3张图片
2.错误运行
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用java实现程序解决问题。_第4张图片

总结:本次作业是“三天打鱼两天晒网”,主要实现了2010年1月1日开始打渔,到输入的日期,该人是在打鱼还是晒网的功能,并识别错误日期的输入,输出两者相差的天数。
本次作业的主要问题就是闰年的判断和相差天数的计算,解决了这两个问题,整个程序就很清晰了。我在程序上添加了输入数据的正确性判断的功能,以及将程序的结果输出到out.txt中。程序写的过程中还是有许多小错误的,例如循环的条件老是出错,没有处理异常,但最终还是一一解决了,这时,我体会到了自己写出一个正确的程序的喜悦。遗憾的是,还有一部分功能没有实现,但我相信以后经过自己的学习,能够写出更好的程序。。

你可能感兴趣的:(中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用java实现程序解决问题。)