第一次程序设计方法学作业“三天打渔 两天晒网”

作业说明:
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言/java/python实现程序解决问题。
解决“三天打渔 两天晒网”的过程,:
1.计算从2010年1月1日开始至指定日期共有多少天。
2.由于“打渔”和“晒网”的周期为5天,所以将计算出的天数用5去除。
如果余数是0,1,2,则是“打渔”,否则为“晒网”。
而要计算指定日期到2010年的天数,首先要搞清楚每一月有几天,当闰年时2月的天数也不同,因此要判断指定日期是否是闰年和月份。
如果指定日期是2010以后的日期,用364+到指定日期前一年经过的天数+指定日期当年的经过的天数。
判断闰年的方法:
1、能整除4且不能整除100
2、能整除400
刚开始我用键盘输入年月日,是分开输入的,没有判定输入日期正确与否,可以判断打渔或是晒网。
后面我用文件读入时遇到了几个问题。
1.读入的数字是一连串的日期,没有年月日之分。所以我用了一个集合来接收数据,并用了substring函数来分割其中的数字赋值给年月日。

2.文件读入后不知道怎么输出文件,因为判定judge函数里的返回值是true和false,我打印时不知道该输出什么,后面我把返回值改成string类型,并返回“打渔”或是“晒网”。

3.文件输出时,只输出了一个日期的结果,后面调试过程中发现是我没有写close函数,并且还要写对位置,写在用完文件输入和输出之后。

最后我添加上了判断日期是否正确的判断:
输入数据的几种错误类型:
1.输入2010年以前的年份
2.输入月份超过12月
3.输入1,3,5,7,8,10,12月时日期超过31
4.输入4,6,9,11月时日期超过30
5.输入2月时若是闰年日期超过29,非闰年日期超过28

但因为在if语句里我不会嵌套进是否是闰年的2月,所以程序有一个缺陷,不能判断2月时输入28到30日的正确与否。

下面是代码:

package homework1;

/**
 * @author Lemon
 * @time 2018-8-29 
 * */
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;


public class Homework1 {
    public static void main (String [] args) {

        File f1=new File("D:\\in.txt");
        File f2=new File("D:\\out.txt");
        PrintWriter pw=null;             //用文件写入数据
        Scanner sc=null;
        try {
            sc = new Scanner(f1);
            pw = new PrintWriter(f2);

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();

        }

        List<String> list=new ArrayList<String>();  //创建一个集合用来接收文件中读入的数据

        while (sc.hasNextLine()) {                    
            list.add(sc.nextLine());               //当有下一行时,给集合中添加一个元素
        }
        System.out.println(list);

        for(String i:list){                         //循环定义年月日
        //Scanner s =new Scanner (System.in);
        //System.out.println("请输入年份");
        int year = Integer.parseInt(i.substring(0,4));
        //System.out.println("请输入月份");
        int month =Integer.parseInt(i.substring(4,6));
        //System.out.println("请输入日期");
        int day= Integer.parseInt(i.substring(6,8));
        //判断输入日期是否合法
        if (year <2010||month>12||month<1||day<1||day>31||(month==4||month==6||month==9)&&day>30){
        System.out.println("您输入的日期不合法");                    
        }

        else{ judge(getAllDays(year, month, day));
        pw.println(judge(getAllDays(year, month, day)));
            }
        }
         pw.close();
         sc.close();
    }
    //判断所输入年份是否为闰年
    public static boolean runNian(int year){               
        if(year%4==0 && year%100!=0 || year%400==0){        //判断闰年的方法:1、能整除4且不能整除100 2、能整除400 
            return true;
        }
            return false;
    }    

    //判断是打渔还是晒网
    public static String judge(int days){
        int x = days%5;
        if (x==0||x==1||x==2) {            //将相差的天数除以5取余,如果相差0,1,2天都是在打渔,3,4则为晒网
            return "打渔";
            }           
        else 
        {
            return "晒网";
        }

    }
    //计算总共有多少天
    public static int getAllDays(int year,int month,int day){
        int  sum=0;
        for(int i=2010;i<year;i++){              //判断指定年份-1到2010年有多少天
            if(runNian(year)){
                sum+=366;
            }
            else sum+=365;
        }

        // 再计算本年内有多少天
        sum += getBeforeDays(year,month,day);
        return sum;
    }
    //计算本年内还有多少天的方法
    public static int getBeforeDays(int year,int month,int day){
        int sum=0;
        for(int i=1;i<month;i++){
            sum+=getDays(year, i);
        }
        return sum;
    }
    //计算每个月有多少天
    public static int getDays (int year,int month){      
        int days=0;
        switch (month){
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            days=31;
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            days=30;
            break;
        case 2:
            if (runNian(year)){
                days=29;    
            }
            else {
                days=28;
            }
            break;      
        }
        return days;    
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章