Java语言程序设计(第3版)
上QQ阅读APP看书,第一时间看更新

3.1 选择

结构化程序设计有三种基本结构:顺序结构、选择结构和循环结构。顺序结构比较简单,程序按语句的顺序依次执行。本节介绍选择结构,下节介绍循环结构。

Java有几种类型的选择语句:单分支if语句、双分支if-else语句、嵌套if语句、多分支if-else语句、switch语句和条件表达式。

3.1.1 单分支if语句

单分支的if结构的一般格式如下:

图3-1 单分支结构

其中condition为布尔表达式,它的值为true或false。布尔表达式应该使用括号括住。程序执行的流程是:首先计算condition表达式的值,若其值为true,则执行statements语句序列,否则转去执行if结构后面的语句,如图3-1所示。

编写程序,从键盘上读取一个整数,检查该数是否能同时被5和6整除,是否能被5或被6整除,是否只能被5或只能被6整除。

程序3.1 CheckNumber.java

下面是程序运行的一个结果:

在if语句中,如果大括号内只有一条语句,则可以省略大括号。

与下面代码等价。

注意:省略大括号可以使代码更整洁,但也容易产生错误。将来需要为代码块增加语句时,容易忘记加上括号。这是初学者常犯的错误。

3.1.2 双分支if-else语句

if-else语句是最常用的选择结构,它根据条件是真是假,决定执行的路径。if-else结构的一般格式如下:

图3-2 双分支结构

该结构的执行流程是:首先计算condition的值,如果为true,则执行statements1语句序列,否则执行statements2语句序列,如图3-2所示。

例如:

上述代码实现只有当半径值大于等于0时才计算圆的面积;否则,当半径值小于0时,程序给出错误提示。

当if或else部分只有一条语句时,大括号可以省略,但推荐使用大括号。

假设要开发一个让一年级学生练习一位数加法的程序。程序开始运行随机生成两个一位数,显示题目让学生输入计算结果,程序给出结果是否正确。

可以使用Math.random()方法产生一个0.0~1.0的随机double型值,不包括1.0。要生成一个一位数,使用下面的表达式:

程序3.2 AdditionQuiz.java

下面是程序的一次运行结果:

3.1.3 嵌套的if语句和多分支的if-else语句

if或if-else结构中语句可以是任意合法的Java语句,甚至可以是其他的if或if-else结构。内层的if结构称为嵌套在外层的if结构中。内层的if结构还可以包含其他的if结构。嵌套的深度没有限制。例如,下面就是一个嵌套的if结构,其功能是求a、b和c中最大值并将其保存到max中。

注意:把每个else同与它匹配的if对齐排列,这样做很容易辨别嵌套层次。

如果程序逻辑需要多个选择,可以在if语句中使用一系列的else if语句,这种结构有时称为阶梯式if-else结构。

下面程序要求输入学生的百分制成绩,打印输出等级的成绩。等级规定为,90分(包括)以上为“优秀”,80分(包括)以上为“良好”,70分(包括)以上为“中等”,60分(包括)以上为“及格”,60分以下为“不及格”。

程序3.3 ScoreLevel.java

下面是程序的一次运行结果:

3.1.4 条件运算符

条件运算符(conditional operator)的格式如下:

因为有三个操作数,又称为三元运算符。这里condition为关系或逻辑表达式,其计算结果为布尔值。如果该值为true,则计算表达式expression1的值,并将计算结果作为条件表达式的结果;如果该值为false,则计算表达式expression2的值,并将计算结果作为条件表达式的结果。

条件运算符可以实现if-else结构。例如,若max, a, b是int型变量,下面结构:

用条件运算符表示为:

从上面可以看到使用条件运算符会使代码简洁,但是不容易理解。现代的编程,程序的可读性变得越来越重要,因此推荐使用if-else结构。

3.1.5 switch语句结构

如果需要从多个选项选择其中一个,可以使用switch语句。switch语句主要实现多分支结构,一般格式如下:

其中expression是一个表达式,它的值必须是byte、short、int、char、enum类型或String类型。case子句用来设定每一种情况,后面的值必须与表达式值类型相容。程序进入switch结构,首先计算expression的值,然后用该值依次与每个case中的常量(或常量表达式)的值进行比较,如果等于某个值,则执行该case子句中后面的语句,直到遇到break语句为止。

break语句的功能是退出switch结构。如果在某个情况处理结束后就离开switch结构,则必须在该case结构的后面加上break语句。

default子句是可选的,当表达式的值与每个case子句中的值都不匹配时,就执行default后的语句。如果表达式的值与每个case子句中的值都不匹配,且又没有default子句,则程序不执行任何操作,而是直接跳出switch结构,执行后面的语句。

编写程序,从键盘输入一个年份(如2000年)和一个月份(如2月),输出该月的天数(29)。

程序3.4 SwitchDemo.java

下面是程序的一次运行结果:

从Java SE 7开始,可以在switch语句的表达式中使用String对象,下面代码根据英文月份的字符串名称输出数字月份。

程序3.5 StringSwitchDemo.java

程序中month.toLowerCase()是将字符串转换成小写字符串。switch表达式中的字符串与每个case中的字符串进行比较。