用Java解决“三天打渔两天晒网”的问题
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打渔两天晒网”,问这个人在以后的某一天中是“打渔”还是“晒网”。
基本要求:程序风格良好(使用自定义注释模板),提供友好的输入输出。
提高要求:
1.输入数据的正确性验证。
2.使用文件进行数据测试。如将日期 20100101 20111214 等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件。
这个问题经过分析后,我先定义了一个天数总和 int days=0,定义每个月份所对应的天数int m[]={31,28,31,30,31,30,31,31,30,31,30,31},设置初始的年月日,再输入所要查询的日期数,判断年份是否为闰年 若为闰年,将二月的天数更改为29天,而后判断所输入的日期是否正确(若正确,计算此人这天是在打渔还是晒网,若错误提示错误信息并重新输入)。
程序流程图如下:
源代码为:
package WorkOne;
/**
* @author Ray
*/
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
int days=0;
int m[]={31,28,31,30,31,30,31,31,30,31,30,31};//定义每个月份所对应的天数
int start_year=2010;//设置初始年份
int start_month=1;//设置初始月份
int start_day=1;//设置初始天数
System.out.println("想知道某人何时打渔何时晒网吗?");
while(true){
Scanner input=new Scanner(System.in);
System.out.println("请输入所要查询日期的年 月 日:(年月日之间用空格隔开)");
//输入年 月 日
int year=input.nextInt();
int month=input.nextInt();
int day=input.nextInt();
if(year%4==0&&year%100!=0||year%400==0){
m[1]=29;//判断年份是否为闰年 若为闰年 将二月的天数更改为29天
}
//判断所输入的日期是否正确(若正确 计算此日期的日程 若错误 提示信息 重新输入)
if((year>=2010)&&(month>=1&&month<=12)&&(day>=1&&(day<=m[month-1]))){
//累计年
for(int i=2010;i<year;i++){
days=days+365;
if(year%4==0&&year%100!=0||year%400==0){
days++;//若为闰年 天数加一
}
}
//累计月
for(int i=0;i<month-1;i++){
days=days+m[i];
}
//累计日
days=days+day;
//计算打渔还是晒网
if(days%5==1||days%5==2||days%5==3){
System.out.println("此人在这一天打渔。");
}//余数为1,2,3 则为打渔
else{
System.out.println("此人在这一天晒网。");
}//余数为4,0 则为晒网
break;
}else{
System.out.println("输入的日期错误!请重新输入!");
}
}
}
}
调试及测试截图:
在这里我实现了基本功能,完成了提高要求里面的的输入数据的正确性验证,但因个人学习还不到位,在文件功能的完成上有些困难,文件方面功能未能完全实现,在这里就先不写出,但我还会继续学习,下次更好地完成它的功能,希望各位能够督促我并一起学习。