第一种方法是大多数人能想到的,看起来比较笨重
import java.util.Scanner ;
public class Test1 {
public static void main ( String [ ] args ) {
Scanner scan = new Scanner ( System.in ) ;
int sum = 1 ;
while (true) {
System.out.println("**********************************************************************") ;
System.out.println("分别输入年份 月份 日") ;
int year = scan.nextInt ( ) ;
int month = scan.nextInt ( ) ;
int day = scan.nextInt ( ) ;
if ( year%4 ==0 ) {
System.out.println("该年份为闰年"+'\n') ;
switch(month){
case 1 :
sum = 0 ; break ;
case 2 :
sum = 31 ;break;
case 3 :
sum = 31+29 ; break;
case 4 :
sum = 31 +29+31 ;break ;
case 5 :
sum = 31*2+29+30 ;break ;
case 6 :
sum = 31*3 +29+30;break ;
case 7 :
sum = 31*3+29+30*2;break ;
case 8 :
sum = 31*4 + 29 + 30 * 2 ;break ;
case 9 :
sum = 31*4 + 29 + 30 * 3 ;break ;
case 10 :
sum = 31* 5 + 29 + 30 *3 ;break ;
case 11 :
sum = 31* 6 + 29 + 30 * 3 ;break ;
case 12 :
sum = 31 * 6 + 29 + 30 * 4 ;break ;
}
}
else {
System.out.println("这一年不是闰年"+'\n' );
switch(month){
case 1 :
sum = 0 ; break ;
case 2 :
sum = 31 ;break;
case 3 :
sum = 31+28 ; break;
case 4 :
sum = 31 +28+31 ;break ;
case 5 :
sum = 31*2+28+30 ;break ;
case 6 :
sum = 31*3 +28+30;break ;
case 7 :
sum = 31*3+28+30*2;break ;
case 8 :
sum = 31*4 + 28 + 30 * 2 ;break ;
case 9 :
sum = 31*4 + 28 + 30 * 3 ;break ;
case 10 :
sum = 31* 5 + 28 + 30 *3 ;break ;
case 11 :
sum = 31* 6 + 28 + 30 * 3 ;break ;
case 12 :
sum = 31 * 6 + 28 + 30 * 4 ;break ;
}
}
sum += day ;
System.out.println( "这一天是"+year+"年的第"+sum+"天"+'\n'+'\n'+'\n'+'\n' ) ;
System.out.println("**********************************************************************") ;
System.out.println("如果需要继续测试输入Y/y,如果需要结束测试输入X/x") ;
while(true){
String ctrl0= scan.next ( ) ;
char ctrl = ctrl0.charAt(0) ;
if (ctrl== 'Y' || ctrl =='y') break ;
if (ctrl== 'X' || ctrl =='x') System.exit(0);
else System.out.println("重新输入");
}
}
}
}
/*疑问:为什么不能写成
System.out.println("如果需要继续测试输入YY/yy,如果需要结束测试输入XX/xx") ;
while(sum>0){
String ctrl0= scan.next ( ) ;
char ctrl = ctrl0.charAt(0) ;
if (ctrl== "YY" || ctrl =="yy") break ;
if (ctrl== "XX" || ctrl =="yy") System.exit(0);
else System.out.println("重新输入");
ps:从equals的角度*/
第二种是利用swith case的执行特性,先定位到对应case,如果没有break,则一直往下执行每个遇到的case语句直至程序结束
import java.util.Scanner ;
public class Test1 {
public static void main ( String [ ] args ) {
Scanner scan = new Scanner ( System.in ) ;
int sum = 0 ;
/*设置一个计数器来表示是第几天*/
while (true) {
/*循环控制条件,保证一直可以循环,利用exit自行退出程序*/
System.out.println("**********************************************************************") ;
System.out.println("分别输入年份 月份 日") ;
int year = scan.nextInt ( ) ;
int month = scan.nextInt ( ) ;
int day = scan.nextInt ( ) ;
if ( year%4 ==0 ) {
System.out.println("该年份为闰年"+'\n') ;
switch(month){
/*利用swith case 语句的执行特点,可以倒写case*/
case 12 :
sum = 31 ;
case 11 :
sum += 30 ;
case 10 :
sum += 31 ;
case 9 :
sum += 30 ;
case 8 :
sum += 31 ;
case 7 :
sum += 30 ;
case 6 :
sum += 31 ;
case 5 :
sum += 30 ;
case 4 :
sum += 31 ;
case 3 :
sum += 29 ; //3月加的是2月的天数
case 2 :
sum += 31 ; //2月加的是1月的天数
case 1 :
sum += 0 ; break ;
}
}
else {
System.out.println("这一年不是闰年"+'\n' );
switch(month){
case 12 :
sum = 31 ;
case 11 :
sum += 30 ;
case 10 :
sum += 31 ;
case 9 :
sum += 30 ;
case 8 :
sum += 31 ;
case 7 :
sum += 30 ;
case 6 :
sum += 31 ;
case 5 :
sum += 30 ;
case 4 :
sum += 31 ;
case 3 :
sum += 28 ;
case 2 :
sum += 31 ;
case 1 :
sum += 0 ; break ;
}
}
sum += day ;
System.out.println( "这一天是"+year+"年的第"+sum+"天"+'\n'+'\n'+'\n'+'\n' ) ;
System.out.println("**********************************************************************") ;
System.out.println("如果需要继续测试输入Y/y,如果需要结束测试输入X/x") ;
while(true){
sum = 0 ;
/*这种多次输入问题,必须在此对计数器sum重置,不然会不停累加*/
String ctrl0= scan.next ( ) ;
char ctrl = ctrl0.charAt(0) ;
if (ctrl== 'Y' || ctrl =='y') break ;
if (ctrl== 'X' || ctrl =='x') System.exit(0);
/*break使程序回到上面的输入年月日循环体*/
/*exit直接退出程序*/
else System.out.println("重新输入");
}
}
}
}
值得注意的点是:
①sum必须初始化为0,不管在什么位置,每次循环执行都要重置。
②sum += 多少,由上一个月的天数决定。
③while(true)这种恒成立的循环体,必须自己设置一个出口。
运行结果