作业说明:
中国有句俗语叫“三天打鱼两天晒网”。某人从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;
}
}