Java入门5:分支结构程序
发布:hfhyt 日期:2008年10月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”。
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】从命令行输入一个月份,显示该月份的天数。
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则两字符串相等,否则两字符串不等。
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题。
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】在命令行输入月份后,就会显示出这个月的天数。
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)
上一篇
下一篇