Java入门5:分支结构程序

我们都知道Java应用程序是从main方法开始执行的。到目前为止,我们所写所有程序执行时,都是从main方法的第一条语句开始执行,按照语句的书写顺序依次往下执行,直到main方法的结束,整个程序运行结束。这种程序我们称之为顺序结构的程序。

本节内容我们介绍分支结构的程序实现,下一节内容我们介绍循环结构(或称迭代结构)的程序实现。

分支结构(又称选择结构)的程序使得我们可以根据某个条件的成立与否,来有选择性的执行某段程序。在介绍分支结构语句之前,我们先来了解Java中条件是如何表示的。

一、关系运算符

关系运算主要是用来进行数据大小或是否相等的比较的。运算结果是一个boolean类型的值true或false。运算符有:

  • >    :3>6结果为false
  • >=  :7>=6结果为true
  • <    :3<6结果为true
  • <=  :7<=6结果为false
  • ==  :(注意是两个连续的“=”,要与赋值号区分开)7==8结果为false,7==7结果为true
  • !=   :7!=8结果为true,7!=7结果为false

二、逻辑运算符

逻辑运算符一般是用来连接多个关系表达式或逻辑表达式的。逻辑运算的结果依然是一个boolean类型的值true或false。逻辑运算符有:

  • && :与运算,表示并且的关系,其格式为OP1&&OP2,当OP1和OP2的值都为true时,表达式的值为true,表示条件成立;否则值为false,条件不成立
  • ||    :或运算,表示或者的关系,其格式为OP1||OP2,当OP1或者OP1的值有一个为true时,表达式的值为true,表示条件成立;否则值为false,条件不成立
  • !     :非运算,表示结果的另一面,其格式为!OP,若OP的值为true,则表达式的值为false;反之若OP的值为false,则表达式的值为true

三、条件的表示

条件就是有逻辑运算符、关系运算符及其它运算相连接的一个表达式。如:

【例1】用a、b、c表示三条线段长度,能够构成三角形的条件。

根据几何知识我们知道任何两边长度之和大于第3边长度,则这样的三条边可以构成三角形。

因此有三个条件:a+b>c、a+c>b、b+c>a,并且这三个条件同时成立(并且的关系)的时候a、b、c三边才能构成三角形,因此我们得到构成三角形的条件是:

( a+b > c ) && ( a+c>b ) && ( b+c>a )

【例2】判断a(假定a为整数)是0~100之间的偶数。

根据数学知识我们知道:a是0~100之间的偶数首先必须满足100≥a≥0,其次要满足a能被2整除,即a%2==0。因此条件表达式为:

( a%2==0 ) && ( a>=0 ) && ( a <=100 )

注意:100≥a≥0不能写成100>=a>=0。原因很简单,计算时按从左到右的顺序进行,首先计算100>=a,得到一个boolean类型的结果true或false,然后该结果再与0进行比较,显然没办法比较(一个是boolean类型,另一个是数值)。

【例3】判断a(假定a为整数)是0~100之间的奇数。

分析同【例2】,很容易得到条件表达式为:( a%2 != 0 ) && ( a>=0 ) && ( a <=100 ) 或写成 ( a%2==1 ) && ( a>=0 ) &&  ( a <=100 )

由于一个整数不是偶数,则一定是奇数,因此条件表达式也可写成:!( a%2==0 ) && ( a>=0 ) && ( a <=100 )

可以看出,同一个条件,写出的条件表达式并不唯一。

四、再谈运算符优先级

一个表达式中可以同时出现算术运算、关系运算、逻辑运算和赋值运算(“=”也是一种运算符),则其优先级从高到低依次为:

(高)⇒ ( )  ⇒ ++ 、-- 、! ⇒ new 、( type ) ⇒ * 、/ 、% ⇒ + 、- ⇒ < 、>  、>=、<= == 、!= && 、|| ⇒ =

整体而言,圆括号最高,单目运算优先级次之,算术运算比关系运算优先级高,关系运算比逻辑运算优先级高,赋值运算优先级最低。所谓单目运算指参加运算数据只要一个,如++、--和!。类似的,参加运算的数据需要2个的,则称为双目运算,如+、- 、*等。

new为创建对象运算,( type )为数据类型的强制转换运算,各位还记得吗?

有了运算符的优先级规定,对于上面【例1】中表达式中的圆括号就可以去掉,当然加上圆括号,逻辑上更清晰些。那么【例2】和【例3】呢?

五、if 语句的使用

1、基本if 语句结构

if (  boolean_expression ) {
                 code_block ;
        }

执行过程:(1)计算boolean_expression的值;(2)若boolean_expression的值为true,则表示条件成立,执行一对“{ }”中的code_block ;若boolean_expression的值为false,则表示条件不成立,跳过code_block ,执行“}”后面其它语句。

【例4】命令行输入小时数,若在8点~12点之间,则显示“Drink Coffee”。

 

【例5】从命令行输入百分制成绩,若成绩在90分以上,则显示“A”。

2、双分支if 语句结构

if (boolean_expression) {
                 code_block1;
        }
        else {
                code_block2;
        }

执行过程:(1)计算boolean_expression的值;(2)若boolean_expression的值为true,则表示条件成立,执行code_block1 ;若boolean_expression的值为false,则表示条件不成立,跳过code_block1 ,执行“else”后面的code_block2。

【例6】从命令行输入小时数,若在8点~12点之间,则显示“Drink Coffee”,否则显示“Drink tea”。

 

若hour的值为9,则第6行 if 的条件成立(即hour>=8 && hour <12的结果为true),执行7、8、9行语句,显示“Drink coffee”,执行完后,转而执行13行“}”之后的其它语句。

若hour的值为14,则第6行 if 的条件不成立(即hour>=8 && hour <12的结果为false),执行11、12、13行语句,显示“Drink tea”,执行完后,转而执行13行“}”之后的其它语句。

【例7】从命令行输入百分制成绩,若成绩在90分以上,则显示“A”,否则显示“Not an A”。

 

【说明】code_block可以是一条语句,也可以是多条语句,如果是一条语句,则其前后的“{”和“}”可以去掉,但若是多条语句,则绝对不能去掉。因此【例4】~【例7】对应“{}”可去掉,程序逻辑依然正确。

3、if 语句的嵌套使用

如果前面1、2结构中的code_block本身又是一个if 或 if-else,或者code_block对应的多条语句中含有if 或 if - else,则形成if 的嵌套使用,此时,应该把内部的if 或 if - else 看成一个整体。

【例8】从命令行输入小时数,若在8点~12点之间,则显示“Drink Coffee”,若在12点~17点之间,则显示“Drink tea”,其它时间显示“Drink water”。

 1.        public   class  Coffee {
 2.                 public static  void  main( String [ ] args ) {
 3.                          int  hour = Integer.parseInt ( args[0] );
 4.                          if ( hour>=8 && hour <12 )
 5.                                  System.out.println( "Drink  coffee" );
 6.                          else  if( hour>=12 && hour <17 )
 7.                                  System.out.println( "Drink  tea" );
 8.                          else
 9.                                  System.out.println( "Drink  water" );
10.                  }
11.         }

程序中,阴影部分的if-else语句可以看成是双分支if结构中的code_block2部分。

程序执行时,若hour的值为16,第4行if 条件不成立,则跳到第6行执行else后的语句,即阴影部分的if -else语句。第6行的if 条件成立,执行第7行语句,显示“Drink tea”,之后执行第10行语句,第8、9行被跳过。若hour的值为20,第4行if 条件不成立,则跳到第6行执行else后的语句,即阴影部分的if -else语句。第6行的if 条件也不成立,程序跳到第8行执行else后的语句,即第9行语句,显示“Drink water”,之后执行第10行语句。

【例9】从命令行输入一个月份,显示该月份的天数。 

01        public class  IfDaysInMonth {
02                 public static void main ( String args[ ] ) {
03                         int month =Integer.parseInt(args[0]);
04                         if (month==1||month==3||month==5||month==7||
05                                  month==8||month==10||month==12)  {
06                                  System.out.println("There are 31 days in that month.");
07                         }
08                         else if(month==2)  {
09                                 
System.out.println("There are 28 days in that month.");
10                         }
11                         else if(month==4||month==6||month==9||month==11)  {
12                                  System.out.println("There are 30 days in that month.");
13                         }
14                         else  {
15                                  System.out.println("Invalid month.");
16                         }
17                 }
18         }
 

六、字符串的比较

 两个字符串是否相同(相等)的比较,不能使用“==”运算,因为字符串是类(引用类型),不是基本类型;同样其它非基本类型数据的比较也不能用“==”。

每个字符串都是一个对象,可以通过equals( )方法进行是否相等比较,该方法的结果为boolean类型值true或false,若为true则两字符串相等,否则两字符串不等。  

01         public class SameName {
02                 public static void main (String args[ ])  {
03                         String name1;
04                         String name2;
05                         name1="David St. Hubbins";
06                         name2="Nigel Tufnel";
07                         if (name1.equals(name2))  {
08                                 System.out.println("Same name.");
09                         }
10                         else {
11                                 System.out.println("Different  name.");
12                         }
13                 }
14         }

上面程序运行结果显示:Different name.

因为字符串name1和name2的值不同,因此第07行if 条件为false,程序跳转至第10行执行else部分,显示“Different name.” 。

七、练习1

 1、编写一个名为Division的程序,完成下面这些功能:

  • 取三个命令行参数的值
  • 检查以确保第一个和第二个数不为零
  • 用第三个数除以第一个数,并显示结果
  • 用第三个数除以第二个数,并显示结果

2、编写一个名为DaysOfWeek的程序,其功能是根据在命令行上输入从1到7的数字来显示是星期几。

3、从命令行输入一个年份,判断该年份是否闰年。如输入的年份为2000,则显示:2000年是闰年。

 八、使用用switch

使用switch语句实现练习1中的第2题。

01         public class SameName {
02                 public static void main (String args[ ])  {
03                         int number  = Integer.parseInt( args[ 0 ] );
04                         String str ;
05                         switch( number ){
06                               case  1:  str = "星期日" ;  break;
07                               case  2:  str = "星期一" ;  break;
08                               case  3:  str = "星期二" ;  break;
09                               case  4:  str = "星期三" ;  break;
10                               case  5:  str = "星期四" ;  break;
11                               case  6:  str = "星期五" ;  break;
12                               case  7:  str = "星期六" ;  break;
13                         }
14                         System.out.println( str );
15                 }
16         }

可以看到使用switch实现的程序相对于if 的实现方式要简洁的多。

1、switch的语法结构

switch( variable ) {
            case literal_value:
                  code_block;
                  break; //break is typical but not required if you
                              //want to process subsequent statement.
            case  another_literal_value:
                  another_code_block;
                  break;
                  //any additional case labels, statements and breaks
        }

说明:

  • variable —— 变量(也可以是表达式)类型只能是char、byte、short或int
  • case —— 意思是“如果列在switch后面的变量等于”
  • case标记 —— 语句块的入口点
  • literal_value —— 必须是字面值,即常量值
  • code_block —— 要执行的操作,一条或多条语句
  • break —— 结束一个switch语句的执行
  • defaule —— 相当于if 结构中“else”,是可选的。当variable的值与所有的case后的常量值都不相等,如果switch中有default部分则执行default后的语句,如果没有default部分,则结束switch语句。
     

2、何时使用switch结构

当所有的boolean表达式符合下列条件时可使用switch:

  • 是等同性测试
  • 测试的值为int、short、byte或char类型 

【例8.1】在命令行输入月份后,就会显示出这个月的天数。

01        public class SwitchDaysInMonth  {
02             public static void main (String args[ ])  {
03                 int  month =Integer.parseInt( args[0] );
04                 switch(month)  {
05                      case 1:
06                      case 3:
07                      case 5:
08                      case 7:
09                      case 8:
10                      case 10:
11                      case 12:
12                            System.out.println("There are 31 days in that month.");
13                            break;
14                      case 2:
15                            System.out.println("There are 28 days in that month.");
16                            break;
17                      case 4:
18                      case 6:
19                      case 9:
20                      case 11:
21                            System.out.println("There are 30 days in that month.");
22                            break;
23                      default:
24                            System.out.println("Invalid month.");
25                            break;
26                 }
37           }
28      }
 

 九、练习2

  • 编写一个名为Month的程序,其功能是根据命令行输入的月份数1到12返回当前月份的名称。
  • 根据命令行输入的年份和月份,使用switch来判断一个月有多少天。

 

 

Tags: Java入门  
引用通告: 点击获取引用地址
相关文章:

Java入门4:运算符与类型转换  (2008-10-5 11:9:23)

Java入门3:类与对象的简单使用  (2008-10-4 17:9:3)

Java入门2:数据类型  (2008-10-4 10:20:46)

Java入门1:Java基础之基础  (2008-10-3 22:32:37)

评论: 0 | 引用: 0 | 浏览:
昵 称:
邮 箱:
网 站:
内 容:
   
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。