一;题目要求:
根据“三天打鱼两天晒网”的俗语,用Java语言计算出从2010-01-01开始后的任意一天,是在打渔还是在晒网?
二;算法设计:
1:题目分析:
该题目关键是求得目标时间到2010-01-01的具体天数,然后用所得天数与5相除(三天打鱼两天晒网共五天),若余数为1或2,则为打渔;余数为3或4或0则为晒网
2:具体算法:
1):首先我用while循环嵌套if-else语句来对年份和月份的正确性进行判断,,若正确则进行下一步骤,否则便继续循环输入,直至正确为止。
(2):其次利用switch语句判断输入日期的正确性,此时注意与平年不同,闰年的二月有29天,所以在对二月的日期进行判断时运用if-else语句
(3):在计算输入日期与目标日期2010-01-01的相差天数时,我最开始运用“暴力相加法”,即通过循环语句计算相隔年份天数,将天数直接相加。随后发现Java语句中通过SimpleDateFormat可直接求两确定日期间相差天数
(4):最后利用if-else语句对年份进行运算,通过余数最终得出打渔或者晒网。
三;
具体代码:
检测年份输入是否正确
int y; //定义输入年份
while(true) { //利用while循环语句判断输入年份是否正确,否则提示重新输入
System.out.println("请输入年份");
y=s.nextInt();
if(y<2010) { //利用if-else语句判断,若年份正确则break跳出循环,否则继续输入年份
System.out.println("年份输入错误,请重新输入!");
}else {break; //错误则继续循环,正确则break跳出循环
}
}
检测月份输入是否正确
int m; //定义输入月份
while (true) { //while循环语句判断月份输入是否正确,否则重新提示输入
System.out.println("请输入月份");
m = s.nextInt();
if(m<=0||m>=13) { //if-else语句判断月份输入是否正确,否则重新输入
System.out.println("月份输入错误,请重新输入!");
}else {break; //错误则继续循环,正确则break跳出循环
}
}
判断日期是否正确
int d; //定义输入天数
System.out.println("请输入日期");
d=s.nextInt();
DateFormat sdf;
switch(d) { //利用switch语句对12个月日期进行定义,判断输入日期是否正确
case 1:while(true) {
System.out.println("请输入日期");
d=s.nextInt();
if(d<1||d>31) { //判断一月输入日期是否正确,否则重新输入
System.out.println("日期输入错误,请重新输入!");
}else{break;}
}
case 2: //利用if-else语句判断是否为闰年,然后对2月输入日期进行判断
if(y%4==0&&y%400!=0||y%400==0) {
if(d<1||d>29) {
System.out.println("日期输入错误,请重新输入!");
}
}else {
if(d<1||d>28) {
System.out.println("日期输入错误,请重新输入!");
}
}
case 3://判断三月输入日期是否正确,否则重新输入
if(d<1||d>31) {
System.out.println("日期输入错误,请重新输入!");
}break;
case 4://判断四月输入日期是否正确,否则重新输入
if(d<1||d>30) {
System.out.println("日期输入错误,请重新输入!");
return;}break;
case 5://判断五月输入日期是否正确,否则重新输入
if(d<1||d>31) {
System.out.println("日期输入错误,请重新输入!");
return;}else{break;}
case 6://判断六月输入日期是否正确,否则重新输入
if(d<1||d>30) {
System.out.println("日期输入错误,请重新输入!");
return;}break;
case 7://判断七月输入日期是否正确,否则重新输入
if(d<1||d>31) {
System.out.println("日期输入错误,请重新输入!");
return;}break;
case 8://判断八月输入日期是否正确,否则重新输入
if(d<1||d>31) {
System.out.println("日期输入错误,请重新输入!");
return;}break;
case 9://判断九月输入日期是否正确,否则重新输入
if(d<1||d>30) {
System.out.println("ÈÕÆÚÊäÈë´íÎó£¬ÇëÖØÐÂÊäÈ룡");
return;}break;
case 10://判断十月输入日期是否正确,否则重新输入
if(d<1||d>31) {
System.out.println("ÈÕÆÚÊäÈë´íÎó£¬ÇëÖØÐÂÊäÈ룡");
return;}break;
case 11://判断十一月输入日期是否正确,否则重新输入
if(d<1||d>30) {
System.out.println("ÈÕÆÚÊäÈë´íÎó£¬ÇëÖØÐÂÊäÈ룡");
return;}break;
case 12://判断十二月输入日期是否正确,否则重新输入
if(d<1||d>31) {
System.out.println("ÈÕÆÚÊäÈë´íÎó£¬ÇëÖØÐÂÊäÈ룡");
return;}break;
}
计算所给日期与目标日期相差天数,与五相除根据余数判断打鱼还是晒网
String tardate = y+"-"+m+"-"+d;//将整形日期强制转换为字符型
String date1="2010-01-01";
SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd");//利用SimpleDateFormat计算两日期间相差天数
Date d2=sdf1.parse(tardate);
Date d1=sdf1.parse(date1);
long daysBetween=(d2.getTime()-d1.getTime())/(3600*24*1000);
System.out.println("该日距2010-01-01相差"+daysBetween+"天");
if((y-2005)%5==1||(y-2005%5)==2||(y-2005%5==3)) {//利用if-else语句,令天数与5相除,若余数为1,2,3则打鱼
System.out.println("该日打鱼");
}else{if((y-2005)%5==0||(y-2005)%5==4) {
System.out.println("该日晒网"); //否则晒网
}
s.close();//调用析构函数清除s
}
}