1. if 选择结构
1.1为什么需要if 选择结构
前面提到,在生活中我们经常需要做判断,然后才能够决定是否做某件事情。例如,如果妈妈今天过生曰,你将送给妈妈一份礼物;如果地球上没有了水,人类将濒临灭绝。
现在就用 Java 程序解决下面的问题。
问题:如果张浩的 Java 考试成绩大于 98 分,那么张浩就能获得一个 MP4 作为奖励。
分析:现在已经知道如何编写 “Hello World” 的程序,但是有时需要先判断一下条件,条件满足则输出,条件不满足则不输出。这个问题就需要先判断张浩的 Java 成绩,他的 Java成绩大于 98 分时,才有奖励。对于这种 “需要先判断条件,条件满足后执行” 的程序,需要 if 选择结构来实现。
1.2 什么是if选择结构
if 选择结构是根据条件判断之后再做处理的一种语法结构。下面看一下最基本的 if 选择结构的语法。
语法:
if ( 条件 ) {
代码块 //条件成立后要执行的代码,可以是一条语句,也可以是一组语句
}f 选择结构流程图
是代码的图形化表示,称为流程图。结合流程图来看, if 选择结构的含义和执行过程就一目了然了。图中带箭头的线条表示的是流程线,也就是程序执行的过程。首先,对条件进行判断。如果结果是真,则执行代码块;否则,执行代码块后面的部分。
因此,关键字 if 后小括号里的条件是一个表达式,而且表达式的值必须为 true 或 false。
程序执行时,先判断条件。当结果为 true 时,程序先执行大括号里的代码块,再执行 if 结构(即部分)后面的代码。当结果为 false 时,不执行大括号里的代码块,而直接执行 if 结构后面的代码。
下面看一看如下程序如何执行。
public class excample {
public static void main(String[] args) {
//语句1;
//语句2;
if (条件) {
//语句3;
}
//语句4;
}
}
回想第1章和第2章所编写的程序,main()是程序的入口,main()中的语句将逐条顺序地执行,所有的语句都执行完毕后程序结束。因此,程序开始执行后,首先执行语句1和语句2,然后对条件进行判断。如果条件成立,则执行语句3,然后跳出if结构块执行语句4;如果不成立,则语句3不执行,直接执行语句4。
经验:当if关键字后的一对大括号里只有一个语句时,可以省略大括号。但是为了避免有多个语句时遗忘大括号,以及保持程序整体风格一致,建议不要省略if结构块的大括号。
解释:流程图:逐步解决指定问题的步骤和方法的一种图形化表示方法。流程图直观、清晰地帮助我们分析问题或设计解决方案,是程序开发人员的好帮手。流程图使用一组预定义的符号来说明如何执行特定的任务。表3-1为符号汇总。
1.3 如何使用 if 选择结构
1. 使用基本的 if 选择结构
使用基本的 if 选择结构解决 3.1.1 节中的问题,代码如示例 1 所示。
示例1
package cn.jbit.ifdemo;
import java.util.Scanner;
public class GetPrize {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("输入张浩的Java成绩: "); //提示要输入Java成绩
int score = input.nextInt(); //从控制台获取Java成绩
if ( score > 90 ) { //判断是否大于90分
System.out.println("老师说:不错,奖励一个MP4!");
}
}
}
这里输入张浩的成绩后,通过判断得知是否大于98分。若大于98,则会输出"老师说:不错,奖励一个MP4!",如图3.2所示;否则,不会输出这句话。通过这个简单的例子,可体会if选择结构先判断后执行的方式。
2.使用复杂条件下的if选择结构
问题:如果张浩的 Java 成绩大于 98 分,而且音乐成绩大于 80 分,则老师奖励他;或者如果其Java 成绩等于 100 分,音乐成绩大于 70 分,老师也可以奖励他。
分析:这个问题需要判断的条件比较多,因此需要将多个条件连接起来, Java 中可以使用
现在考虑一下怎么连接问题中的条件,首先抽取问题中的条件。
张浩Java成绩〉98分 并且 张浩音乐成绩〉80分
或者
张浩Java成绩= = 100分 并且 张浩音乐成绩〉70分
提取出了条件,是否可以这样编写条件呢?
第一种写法:
score1>98 && score2>80 || score1==100 && score2>70
第二种写法:
(score1>98 && score2>80) || (score1==100 && score2>70)
其中, scorel 表示张浩的 Java 成绩, score2 表示张浩的音乐成绩。显然第二种写法更清晰地描述了上述问题的条件。
经验:当运算符比较多,无法确定运算符执行的顺序时,可以使用小括号控制。
上述问题的完整代码如示例 2 所示。
示例2
package cn.jbit.ifdemo;
public class GetPrize2 {
public static void main(String[] args) {
int score1 = 100; //张浩的Java成绩
int score2 = 72; //张浩的音乐成绩
if ((score1>98 && score2>80) || (score1==100 && score2>70)) {
System.out.println("老师说:不错,奖励一个MP4!");
}
3.使用if-else选择结构
问题:如果张浩的 Java 成绩大于 98 分,那么老师奖励他一个MP4; 否则老师罚他编码。
分析:与上面的 if 选择结构不同的是,除了要实现条件成立执行的操作以外,还要实现条件不成立时执行的操作。
当然,这个问题可以用两个 if 选择结构来实现,如示例 3 所示。
示例3
package cn.jbit.ifdemo;
public class SimpleIf2 {
public static void main(String[] args) {
int socre = 91; //张浩的Java成绩
if (score > 98) {
System.out.println("老师说:不错,奖励一个MP4!");
}
if (score <= 98) {
System.out.println("老师说:惩罚进行编码!");
}
}
}
使用两个 if 选择结构看起来冗长,实际上有一种语法结构可以更好地解决这个问题,就是 if-else选择结构,表示"如果xx, 就xx; 否则,就xx"。这看起来很像小学时候的造句。使用 Java程序语言编写程序的过程,就是造句的过程,只是不是用汉语造句,而是用 Java 语言造句。
if-else 选择结构的语法如下。
语法:
if (条件){
//代码块1
}else {
//代码块2
}
图 3.4 形象地展示了 if-else 选择结构的执行过程。
画出流程图来分析要解决的问题,如图 3.5 所示。
结合流程图,使用 if-else 选择结构进行编程。改写示例 3 中的代码,如示例 4 所示。
示例4
package cn.jbit.ifdemo;
public class SimpleIf3 {
public static void main(String[] args) {
int score = 91;
if (score > 98) {
System.out.println("老师说:奖励一个MP4!");
} else {
System.out.println("老师说:惩罚进行代码!");
}
}
}
程序运行结果如图3.6所示。
图 3 6 示例 4 的运行结果
小结:到此为止,需要掌握的 if 选择结构如下:基本的 if 选择结构,只有一个 if 块; if-else 选择结构 , 有 if 块和 else 块。
2. 技术内容
2.1 为什么使用 switch 选择结构
问题:韩嫣参加计算机编程大赛:
如果获得第一名,将参加麻省理工大学组织的一个月夏令营;
如果获得第二名,将奖励惠普笔记本电脑一部;
如果获得第三名,将奖励移动硬盘一个;
否则,没有任何奖励。
分析:这个问题可以用多重 if 选择结构来解决。的确,使用多重 if 选择结构完全可以解决,代码如示例 1 所示。
示例1:
package cn.jbit.ifdemo;
public class Complete {
public static void main(String[] args) {
int mingCi = 3; //名次
if (mingCi == 1) {
System.out.println("参加麻省理工大学计算机学院组织1个月夏令营");
} else if (mingCi == 2) {
System.out.println("奖励hp笔记本一部");
} else if (mingCi == 3) {
System.out.println("奖励移动硬盘一部");
} else {
System.out.println("没有任何奖励");
}
}
}
示例 1 解决了这个问题,可是看上去很烦琐。这个问题跟前面的问题比起来有什么不同?显然,这个问题是等值的判断,之前的问题是区间判断。对此 Java 提供了另一种结构,可以方便地解决等值判断问题,这就是 switch 选择结构。
2.2 什么是 switch 选择结构
switch 选择结构可以更好地解决等值判断问题。
语法:
switch (表达式) {
case 常量1:
//代码块1;
break;
case 常量2:
//代码块2;
break;
……
default:
//代码块n;
break;
}
这里switch、case、default、break都是Java的关键字。
解释:switch 选择结构用到了四个关键字,下面将——介绍。
switch:表示“开关”,这个开关就是switch关键字后面小括号里表达式的值,JDK1.7后,switch语句小括号里可以是int、short、byte、char、枚举类型、String类型表达式。
case:表示“情况、情形”,case后可以是int、short、byte、char、枚举、String类型,通常是一个固定的值。case块可以有多个,顺序可以改变,但是每个case后常量的值必须各不相同。
default:表示“默认”,即其他情况都不满足。default后要紧跟冒号。default块和case块的先后顺序可以变动,不会影响程序执行的结果。通常,default块放在末尾,也可以省略。
break:表示“停止”,即跳出当前结构。
知道了switch 选择结构的语法,那么它的执行过程是怎样的呢?具体如下所述。
先计算并获得 switch 后面小括号里的表达式或变量的值,然后将计算结果顺序与每个 case 后的常量比较,当二者相等时,执行这个 case 块中的代码;当遇到 break 时,就跳出 switch 选择结构,执行 switch 选择结构之后的代码。如果没有任何一个 case 后的常量与 switch 后的小括号中的值相等,则执行 switch 末尾部分的default 块中的代码。
2.3 如何使用 switch 选择结构
了解了 switch 选择结构的语法及它的执行过程之后,下面就来用 switch 选择结构解决等值判断的问题,具体代码如示例 2 所示。
示例2
package cn.jbit.ifdemo;
public class Complete2 {
public static void main(String[] args) {
int mingCi = 1; //名次
switch (mingCi){
case 1:
System.out.println("参观麻省理工大学计算机学院组织1个月夏令营");
break;
case 2:
System.out.println("奖励hp笔记本一部");
break;
case 3:
System.out.println("奖励移动硬盘一部");
break;
default:
System.out.println("没有任何奖励");
break;
}
}
}
程序运行结果如图 4.1 所示。
可见,括号中的 mingCi 的值为 1 , 与第一个 case 块中的常量值匹配,因此执行它后面的代码,输出"参加麻省理工大学组织的 1 个月夏令营",然后执行语句 "break;", 执行结果是跳出整个 switch选择结构。
与示例 1 比起来,示例 2 看起来更清晰一些,它们完成的功能其实是完全一样的。但是,并非所有的多重 if 选择结构都可以用 switch 选择结构代替。通过观察,可以看出, switch 选择结构的条件只能是等值的判断,而且只能是整型或字符型的等值判断。也就是说, switch 选择结构只能用于判断一个整型变量或表达式是否等于某个整数值的情况,或者一个字符型变量或表达式是否等于某个字符的情况,并且每一个 case 后面的常量值都不同。而多重 if 选择结构既可以用于判断条件是等值的情况,也可以用于判断条件是区间的情况。
如果这里省略了break,结果会怎样呢?运行示例 3, 观察结果。
示例3
package cn.jbit.ifdemo;
public class Complete3 {
public static void main(String[] args) {
int mingCi = 1;
switch (mingCi){
case 1:
System.out.println("参观麻省理工大学计算机学院组织1个月夏令营");
case 2:
System.out.println("奖励hp笔记本一部");
case 3:
System.out.println("奖励移动硬盘一部");
default:
System.out.println("没有任何奖励");
}
}
}
程序运行结果如图 4.2 所示。
图 4.1 示例 2 的运行结果 图 4.2 示例 3 的运行结果
虽然 break 语句是可以省略的,但是省略后会带来一些问题。省略 break 的后果如下:当某个 case后的常量值与 switch 后小括号中的值相匹配时,执行该 case 块的代码,后面的 case 就不再进行条件判断,而直接执行后面所有 case 块中的代码,直到遇到 break 结束。所以在编写 switch 选择结构时不要忘记在每个 case 块后加上一个 “break;”, 用来跳出 switch 选择结构。
注意:
每个case后的代码块可以有多个语句,即可以有一组语句,而且不需要用“括起来。case和default后都有一个冒号,不能漏写,否则编译不通过。对于每个case的结尾,都要想一想是否需要从这里跳出整个switch选择结构。如果需要,一定不要忘记写“break;”。
在case后面的代码块中,break语句是可以省略的,还可以让多个case执行同一语句。例如,在下面的代码中,当变量day的值为1、3、5时,都将输出“奇数!”;当变量day的值为2、4、6时,都将输出“偶数!”。
int day = 1;
switch (day){
case 1:
case 3:
case 5:
System.out.println("奇数!");
break;
case 2:
case 4:
case 6:
System.out.println("偶数!");
break;
}
小结:到此,大家会发现多重 if 选择结构和 switch 选择结构很相似,它们都是用来处理多分支条件的结构,但是 switch 选择结构只能用于等值条件判断的情况。