Java语言程序设计
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.2 分支语句

分支语句在程序中的作用是使程序更灵活,它允许程序根据不同的情况、不同的条件等采取不同的动作、进行不同的操作,实现选择结构。在Java语言中使用的分支语句有if -else语句和switch语句。

3.2.1 if - else语句

1.用单个if语句实现单选、双选结构

用一个if - else语句可实现根据一个关系或逻辑表达式的值是true还是false两种情况下

进行不同操作的程序结构,它的语法结构如下:

              if(布尔表达式)
                语句1
              [else
                语句2]

执行到本语句,首先要计算布尔表达式,若值为真,则执行语句1,否则(值为假时)执行语句2(实现双选结构)。语句1和语句2都可以是复合语句。

if - else语句的else语句2部分可省略,省略时,若布尔表达式的值为假,则不执行任何语句(实现单选结构)。

【例3.2】用Math类的random()方法产生一个字符,若该字符是一个大写英文字母,则输出“Yes!”,否则输出“No!”。

random()方法产生的随机数在0.0和1.0之间,乘以128后,其值在0.0和128.0之间,将它转换为char类型后,用if来判断是否在'A'和'Z'之间。程序如下:

              class IsUpper{
                public static void main(String args[]){
                  char ch;
                  ch=(char)(Math.random()*128);
                  if(ch >= 'A' && ch <= 'Z')
                    System.out.println(ch + "是大写字母。");
                  else
                    System.out.println(ch + "不是大写字母。");
                }
              }

程序的一次运行结果如下:

              e不是大写字母。

2.用多个if语句实现多选结构

(1)if语句并列

在多个if语句中可书写多个条件,若这些if并列,且这些条件包含了所有的情况无一遗漏也不重复,就可以实现多选结构。

【例3.3】对任意三个存放在变量a,b,c中的int类型数据,按从小到大的顺序输出它们。

下面程序的设计思想是:将最小数据存入变量a中,这需要将a与b、c比较两次;然后,将b,c中的小者存入变量b中,这需要b与c比较1次,共需比较3次。用3个并列if实现。

              class Sort3{
                public static void main(String args[]){
                  int a = 10,b = 8,c = 12,t;
                  if(a > b){t = a;a = b;b = t;}
                  if(a > c){t = a;a = c;c = t;}
                  if(b > c){t = b;b = c;c = t;}
                  System.out.println(a + " " + b + " " + c);
                }
              }

程序运行结果如下:

              8 10 12

在本例中,程序运行前,数据a,b,c中的值是无序的,程序运行后,a,b,c已经按从小到大的顺序排序。

(2)if语句嵌套

在if - else语句中,若语句1或语句2又是if - else语句时,就构成了if语句的嵌套。采用if嵌套的程序设计方法也可实现多选操作。

【例3.4】检查用random()方法产生的一个字符,判断是否为英文大写字母、小写字母、数字、空格或是其他符号,并输出相应信息。

程序要根据5 种不同的字符情况输出不同的信息。这属于多分支的程序设计,采用if嵌套的方法。程序如下:

              class Letter{
                public static void main(String args[]){
                  char ch;
                  ch=(char)(Math.random()*128);
                  if(ch < ' ')
                    System.out.println("是不可显示字符!");
                  else if(ch >= 'a' && ch <= 'z')
                    System.out.println(ch + " 是小写字母!");
                  else if(ch >= 'A' && ch <= 'Z')
                    System.out.println(ch + " 是大写字母!");
                  else if(ch >= '0' && ch <= '9')
                    System.out.println(ch + " 是数字!");
                  else
                    System.out.println(ch + " 是其他符号!");
                }
              }

需要注意的是,Java编译器总是将else与其最近未配对的if配对。因为if - else语句允许else部分省略,会出现if的个数多于else个数的情况,此时要注意if和else的配对,否则可能发生逻辑错误。例如:

              if(x > 5)
                if(y > 10)
                  System.out.println("x大于5并且y大于10。");
                else
                  System.out.println("x不大于5。");

程序员想实现x是否大于5输出不同字符串的本意,但Java编译器却理解为:当x大于5且y大于10时输出第一个字符串,当x大于5且y不大于10时输出第二个字符串。两个字符串均在x大于5时输出,当x不大于5时,什么也不输出,此时出现了逻辑错误。

为避免嵌套时if和else配对时逻辑出错,可用下面的方法之一来解决。

(1)在用if嵌套方法进行多分支程序设计时,将if语句嵌套在else部分。例如,上述例子中的逻辑关系可改写为:

              if(x <= 5)
                System.out.println("x不大于5。");
              else
                if(y > 10)
                  System.out.println("x大于5并且y大于10。");

(2)若需要在if - else语句的语句1部分嵌套if语句,则将内层的if语句用括号括起来,指明正确的if与else的配对组合。例如,上述例子中的逻辑关系可改写为:

              if(x > 5){
                if(y > 10)
                  System.out.println("x大于5并且y大于10。");
                }
              else
                System.out.println("x不大于5。");

3.2.2 switch语句

switch多分支语句结构实际上也是一种if - else结构,不过它使得在编码时很容易写出判断条件,特别是条件有很多选项而且比较简单的时候。switch的语法结构如下:

              switch(表达式){
                case值1: 语句1;break;
                case值2: 语句2;break;
                ...
                case值N: 语句N;break;
                default: 语句N+1;break;
              }

执行switch语句时,首先计算表达式的值(其类型是整型或字符型,并与各个case之后的常量值类型相同),然后将该值同每个case后的值做恒等比较:若相等,则程序流程转入该值后的语句;若表达式的值与任何一个case后的值都不相同,则执行default后的语句(若没有default子句,则什么都不执行)。

使用switch语句时,需要注意的是:

(1)各个case后的常量值应各不相同。

(2)通常在每一种case情况后都应使用break语句,否则,遇到第一个相等情况后,下面break前的所有语句都会被执行(包括default后面的语句,若有的话)。可以试着分别加上或去掉break语句来执行例3.4。

(3)语句1至语句N+1可以是一条或多条语句,不必使用复合语句。

(4)不同case后的语句相同时,可以合并多个case子句。

(5)switch语句在用表达式的值比较每一个case后的值时,是从前往后顺序进行的。

若各个值互不相同,则case子句的顺序可任意。通常default子句放在switch结构的最后,使得switch语句最后执行default子句。

【例3.5】查看五级分制的成绩对应的百分制成绩的范围。设百分制与五级分制成绩的对应关系为:

                    A:90~100
                    B:80~89
                    C:70~79
                    D:60~69
                    E: 60以下
              class SwitchTest{
                public static void main(String args[])throws java.io.IOException{
                  char a;
                  System.out.println("请输入大写字母A ~ E:");
                  a=(char)System.in.read();
                  switch(a){
                    case 'A':System.out.println("范围90~100!");break;
                    case 'B':System.out.println("范围80~89!");break;
                    case 'C':System.out.println("范围70~79!");break;
                    case 'D':System.out.println("范围60~69!");break;
                    case 'E':System.out.println("60分以下!");break;
                    default: System.out.println("重新输入!");
                  }
                }
              }

在代码中加break语句后,应明确知道程序将会发生的变化,并要确认程序没有转移到不想执行的代码上。

【例3.6】输入一个小写字母,判断是元音还是辅音。

因为元音有5 个,都需要执行相同的语句,为避免重复,只需写出最后一个值后的语句和break语句即可。

              class EmptyCase {
                public static void main(String args[])throws java.io.IOException{
                  // 从键盘输入一个小写字母
                  char ch =(char)System.in.read();
                  // 确定是元音还是辅音
                  switch(ch) {
                    case 'a':
                    case 'e':
                    case 'i':
                    case 'o':
                    case 'u':System.out.println(ch + " 是元音");break;
                    default:System.out.println(ch + " 是辅音");
                  }
                }
              }