日撸Java三百行(day04:闰年的计算)

一、if语句的嵌套

在实际开发中,我们经常会面临多重判断和选择的情况,这种时候就需要用到if语句的嵌套。if语句的嵌套是指在if语句块或者else语句块中,又包含了另外一个或多个if语句,其一般形式如下:

if (表达式1) {
   if(表达式2) {
      语句块1;
   } else {
      语句块2;
   }
} else {
   if(表达式3) {
      语句块3;
   } else {
      语句块4;
   }
}

使用if语句的嵌套,可将判断的条件进行细化,从而实现更复杂的判断和操作。其中,if语句、if-else语句、else-if语句可以根据实际需要,互相进行嵌套。

例如:小明参加java的期末考试,得分为88分,请根据如下的等级划分规则判断他的考试等级。

90~100:优秀                80~89:良好               60~79:及格               60以下:不及格

package basic;
public class JavaTestLevel {
    public static void main(String[] args) {
        int score;

        score = 88;

        if (score >= 90 && score <= 100) {
            System.out.println("优秀");
        } else if (score >= 80 && score <= 89) {
            System.out.println("良好");
        } else if (score >= 60 && score <= 79) {
            System.out.println("及格");
        } else
            System.out.println("不及格");
        } // of if
} // of class JavaTestLevel

二、布尔类型

1.布尔类型的基本概念

在java中,布尔类型boolean用来表示逻辑值,一般用于程序流程控制,包括:if条件控制语句、while循环控制语句、do-while循环控制语句、for循环控制语句等。布尔类型boolean只有两个取值,即true和false,没有null。

2.boolean关键字

在java中,布尔类型用关键字boolean来定义,例如:

boolean isRain = true;
boolean isStudent = false;

下面,我们再用一段代码来验证布尔类型boolean是否用1和0代替true和false。

package basic;
   public class Boolean {
       public static void main(String[] args) {
           boolean flag = 1;
           boolean success = 0;
       }
   }

根据运行结果给出的提示,我们可以知道在java中,布尔类型boolean只有true和false两个取值,不能用1和0来代替true和false。

3.逻辑运算

在java中,逻辑运算符主要有三个,分别是与(&&)、或(||)、非(!),这三者的运算结果都为布尔类型,并且与(&&)、或(||)要求左右两边的表达式也为布尔类型。

3.1与(&&)

逻辑运算中的与(&&)相当于数学运算中的“且”,满足“全真才真,一假即假”。

(表达式1)&&(表达式2)的相关结果如下表:

表达式1表达式2运算结果

3.2或(||)

逻辑运算中的或(||)相当于数学运算中的“或”,满足“全假才假,一真即真”。

(表达式1)||(表达式2)的相关结果如下表:

表达式1表达式2运算结果

3.3非(!)

逻辑运算中的非(!)满足“真变假,假变真”。

!(表达式)的相关结果如下表:

表达式运算结果

3.4短路取值

对于(表达式1)&&(表达式2),如果表达式1 的值是false,那么最后的结果就是false,就不会继续判断表达式2。

对于(表达式1)||(表达式2),如果表达式1 的值是true,那么最后的结果就是true,就不会继续判断表达式2。

三、闰年的判断

1.判断思路

要判断闰年,首先我们需要知道到底什么才是闰年?查阅相关资料可知,闰年分为两种,一种是普通闰年(公历年份是4的倍数,且不是100的倍数,例如:2004年、2020年),另一种是世纪闰年(公历年份整百数的,且是400的倍数,例如:2000年)。

1.1用逻辑运算语句判断是否为闰年

1.1.1抽象为逻辑运算语句

普通闰年用逻辑运算符可表示为如下代码,当结果为true时,就是普通闰年。

(paraYear % 4 == 0) && (paraYear % 100 != 0)

世纪闰年用逻辑运算符可表示为如下代码,当结果为true时,就是世纪闰年。

(paraYear % 100 == 0) && (paraYear % 400 == 0)

综合两种闰年,当如下代码的结果为true时,就是闰年。

(paraYear % 4 == 0) && (paraYear % 100 != 0) || (paraYear % 400 == 0)
1.1.2定义逻辑运算语句的方法

再定义用逻辑运算符判断闰年的方法,如下:

    /**
	 *********************
	 *Is the given year leap?
	 *
	 * @param paraYear The given year.
	 *********************
	 */
	public static boolean isLeapYear(int paraYear) {
		if((paraYear % 4 == 0) && (paraYear % 100 != 0) || (paraYear % 400 == 0)) {
			return true;
	    } else {
	    	return false;
	    } // of if
    } // of isLeapYear

1.2用if语句的嵌套判断是否为闰年

1.2.1思路流程图和盒图

我们得到一个公历年份y后,首先判断y是不是4的倍数(即y能否被4整除),如果y不是4的倍数,那么就已经可以判断y不是闰年;如果y是4的倍数,再继续判断y是不是100的倍数,如果y不是100的倍数,那么可以得知y是闰年;如果y是100的倍数,就再判断y是不是400的倍数,如果y不是400的倍数,那么y就不是闰年,如果y是400的倍数,那么y就是闰年。

将以上文字用图解表示如下:

1.2.2定义if语句嵌套的方法
    /**
	 *********************
	 *Is the given year leap? Replace the complex condition with a number of if.
	 *
	 * @param paraYear The given year.
	 *********************
	 */
	public static boolean isLeapYearV2(int paraYear) {
		if(paraYear % 4 != 0) {
			return false;
		} else if (paraYear % 400 == 0) {
			return true;
		} else if (paraYear % 100 == 0) {
			return false;
		} else {
			return true;
		} // of if
	} // of isLeapYearV2

2.LeapYear.java

程序代码:

package basic;

/**
 *The complex usage of the if statement.
 *
 *@auther Xin Lin 3101540094@qq.com.
 */

public class LeapYear {

	/**
	 *********************
	 *The entrance of the program.
	 *
	 * @param args Not used now.
	 *********************
	 */
	public static void main(String[] args) {
		// Test isLeapYear
		int tempYear = 2021;
		
		System.out.print("" + tempYear + " is ");
		if(!isLeapYear(tempYear)) {
			System.out.print("NOT ");
		} // of if
		System.out.println("a leap year.");
		
		tempYear = 2000;
		
		System.out.print("" + tempYear + " is ");
		if(!isLeapYear(tempYear)) {
			System.out.print("NOT ");
		} // of if
		System.out.println("a leap year.");
		
		tempYear = 2100;
		
		System.out.print("" + tempYear + " is ");
		if(!isLeapYear(tempYear)) {
			System.out.print("NOT ");
		} // of if
		System.out.println("a leap year.");
		
		tempYear = 2004;
		
		System.out.print("" + tempYear + " is ");
		if(!isLeapYear(tempYear)) {
			System.out.print("NOT ");
		} // of if
		System.out.println("a leap year.");
		
		// Test isLeapYearV2
		System.out.println("Now use the second version.");
		tempYear = 2021;
		
		System.out.print("" + tempYear + " is ");
		if(!isLeapYearV2(tempYear)) {
			System.out.print("NOT ");
		} // of if
		System.out.println("a leap year.");
		
		tempYear = 2000;
		
		System.out.print("" + tempYear + " is ");
		if(!isLeapYearV2(tempYear)) {
			System.out.print("NOT ");
		} // of if
		System.out.println("a leap year.");
		
		tempYear = 2100;
		
		System.out.print("" + tempYear + " is ");
		if(!isLeapYearV2(tempYear)) {
			System.out.print("NOT ");
		} // of if
		System.out.println("a leap year.");
		
		tempYear = 2004;
		
		System.out.print("" + tempYear + " is ");
		if(!isLeapYearV2(tempYear)) {
			System.out.print("NOT ");
		} // of if
		System.out.println("a leap year.");
	} // of main
	
	/**
	 *********************
	 *Is the given year leap?
	 *
	 * @param paraYear The given year.
	 *********************
	 */
	public static boolean isLeapYear(int paraYear) {
		if((paraYear % 4 == 0) && (paraYear % 100 != 0) || (paraYear % 400 == 0)) {
			return true;
	    } else {
	    	return false;
	    } // of if
    } // of isLeapYear
	
	/**
	 *********************
	 *Is the given year leap? Replace the complex condition with a number of if.
	 *
	 * @param paraYear The given year.
	 *********************
	 */
	public static boolean isLeapYearV2(int paraYear) {
		if(paraYear % 4 != 0) {
			return false;
		} else if (paraYear % 400 == 0) {
			return true;
		} else if (paraYear % 100 == 0) {
			return false;
		} else {
			return true;
		} // of if
	} // of isLeapYearV2

} // of class LeapYear

运行结果:


总结

1.不管学习哪种语言,闰年的判断都是一个非常经典的问题,可以很好的反映程序语言的逻辑性。

2.在复杂的if语句嵌套中,一定要注意if与else的配对情况,else总是与其前面距离最近且未配对的if进行配对,即满足就近原则。

3.布尔类型boolean的取值只有true和false,不能用1和0代替。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值