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

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

算法设计:

  1. 计算从2010年1月1日开始至指定日期共有多少天;
  2. 由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去
  3. 根据余数判断他是在“打鱼”还是在“晒网”;

代码如下:

package dayu;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

/**
 * 
 * @author 
 *         中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”
 *         。
 *
 */

public class D {
    static int year, month, day;
    static String date;
    static int i, leap;
    static int[] commonYear = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };// 平年每月的天数
    static int[] leapYear = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };// 闰年每月的天数
    static final int sumCommon = 365; // 平年天数
    static final int sumLeap = 366; // 闰年天数

    /*
     * 检查输入的日期是否合法
     */
    boolean checkDate(int year, int month, int day) {
        if (year < 2010) { // 如果年份小于2010年
            System.out.println("日期不合法");
            return false;
        }

        if (month > 12 || month <= 0) { // 月份大于12或小于0
            System.out.println("日期不合法");
            return false;
        }
        if (day < 0 || day >31) {// 天数小于0天和天数大于31天
            System.out.println("日期不合法");
            return false;
        }
        return true;
    }

    // 判断是闰年还是平年
    boolean isLeapYear(int year) {
        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { // 是闰年
            return true;
        }
        return false;
    }

    // 计算从2010-01-01日起,至今的总天数
    int countDays(String date) throws Exception {
         /*
          * // Java中的 split函数是用于按指定字符(串)或正则去分割某个字符串,结果以字符串数组形式返回;
          * 方法介绍 
           (1)public String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串

           (2)public String[] split(String regex,int limit) 根据匹配给定的正则表达式来拆分此字符串
         */
        String[] date1 = date.split(",");
        year = Integer.parseInt(date1[0]);// parseInt(String a)函数将字符数组转换成十进制输出
        month = Integer.parseInt(date1[1]);
        day = Integer.parseInt(date1[2]);
        while (checkDate(year, month, day) == false)
            return -1;
        int days = 0; // 记录总天数
        int startYear = 2010;
        // 计算整年天数并相加
        for (int i = startYear; i < year; i++) {
            if (isLeapYear(i)) { // 如果是闰年
                days += sumLeap; // 加上闰年的天数366
            } else {
                days += sumCommon; // 加上平年的天数365
            }
        }

        boolean leap = isLeapYear(year); // 保存nowYear是否是闰年
        // 计算剩余的天数
        for (int i = 0; i < month; i++) {
            if (leap) { // nowYear是闰年
                days += leapYear[i];
            } else {
                days += commonYear[i];
            }
        }
        days += day;
        return days; // 返回总天数
    }

    public String result(String date) throws Exception {
        // 获得总天数
        int days = countDays(date);
        // 如果是异常日期返回非法日期
        if (-1 == days) {
            return "非法日期";
        }
        int remainder = days % 5;
        // 如果余数是1,2,3就返回打鱼,反之晒网
        if (remainder == 1 || remainder == 2 || remainder == 3) {
            return "打鱼";
        } else {
            return "晒网";
        }
    }

    public static void main(String[] args) throws Exception {

        D f = new D(); // 创建一个对象,用于结果判断
        try {
            FileInputStream in = new FileInputStream("in.txt");// 创建字节输入流
            InputStreamReader isr = new InputStreamReader(in);// 将字节输入流转换成字符输入流
            BufferedReader br = new BufferedReader(isr);// 将字符输入流对象进行包装
            FileOutputStream out = new FileOutputStream("out.txt");
            OutputStreamWriter osw = new OutputStreamWriter(out);
            BufferedWriter bw = new BufferedWriter(osw);
            String line = ""; // 保存读一行的数据
            String result = ""; // 保存计算的结果即是打鱼还是晒网还是非法日期
            // 循环读文件
            while (null != (line = br.readLine())) {
                result = f.result(line); // 将读出来的一行日期字符串进行结果判断
                bw.write(result); // 写入到结果文件中
                bw.newLine(); // 换行
            }
            bw.close();
            br.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("操作成功,程序没有语法错误");

    }

}

在in.txt中输入

运行结果为

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值