《第四章 运算符、表达式和流程控制》由会员分享,可在线阅读,更多相关《第四章 运算符、表达式和流程控制(77页珍藏版)》请在金锄头文库上搜索。
1、Java语言程序设计安徽工业大学现代教育技术中心张小银 第四章 运算符、表达式和流程控制 本章学习目标1、运算符2、表达式3、分支语句4、循环语句5、递归运算符 1)算术运算符:+,-,*,/,%,+,-2)关系运算符:,=,5)赋值运算符:=6)扩展赋值运算符:+=,-=,*=,/=7)字符串连接运算符:+8)条件运算符:?:例4-1 使用取模运算符public class TestRemainderpublic static void main(String args)int i = 10 % 3;System.out.println(i);System.out.println(-10 %
2、 3);double d = 11 % 3.5;System.out.println(d);System.out.println(-11 % 3.5);运算结果:例4-2 使用关系运算符public class TestComparisonpublic static void main(String args)int a = 4;int b = 5;if(a = b)System.out.println(a等于b);if(a != b)System.out.println(a不等于b);if(a b)System.out.println(a大于b);if(a = b)System.out.pr
3、intln(a大于等于b);if(a = b)System.out.println(a小于等于b);运行结果:逻辑运算符1)逻辑运算符功能 !-逻辑非 &-逻辑与 |-逻辑或 -逻辑异或 &-短路与 |-短路或2)逻辑运算符功能说明:短路逻辑运算符使用短路逻辑运算符&和|可实现“短路”的“与”和“或”运算的功能-当根据第一个操作数的值已经能够确定整个表达式的结果时,将跳过对第二个操作数值的评估,直接得出最终结果。public void m1(int n) if(n31) System.out.println(“非法赋值”); 例4-3 使用短路的逻辑运算符 class Personprivat
4、e String name;private int age;public Person(String name,int age)this.name = name;this.age = age;public void setAge(int age)this.age = age;public int getAge()return age;public void setName(String name)this.name = name;public String getName()return name;public class TestShortCircuitingpublic static vo
5、id main(String args)Person p1 = null;if(p1 != null) & (p1.getAge()=10)System.out.println(可以学Java!);elseSystem.out.println(有问题,不能学Java!); 运行结果:有问题,不能学Java!位运算符 1)位运算符功能 取反 & 按位与 | 按位或 按位异或2)位运算符功能说明:Java整数二进制表示1)Java语言二进制数采用补码形式表示,数正负区分标志:符号位。2)正数进制转换 十进制-二进制:除2取余、除尽为止 二进制-十进制:累加求和3)负数进制转换 十进制-二进制: 1
6、、取绝对值 2、转换为二进制 3、逐位取反 4、加1 二进制-十进制: 1、减1 2、逐位取反 3、转换为十进制正数 4、乘-1例4-4 使用位运算符 public class TestBitwiseOperatorpublic static void main(String args)int a = 9 & 12;int b = 9 | 12;int c = 9 12;int d = 12;System.out.println(a);System.out.println(b);System.out.println(c);System.out.println(d); 输出结果: 8 13 5
7、-13移位运算符 1)移位运算符用于对整型数据的二进制位进行移位处理。用于图形图像等低层处理及科学计算上。2)左移: “ab;”将二进制形式的a逐位右移b位,最高位(左侧)空出的b位补原来的符号位;4)无符号右移 “ab;”将二进制形式的a逐位右移b位,最高位空出的b位补0。移位运算展示移位运算符性质1)适用数据类型:byte,short,char,int,long,对低于int型(32位)的操作数将先自动转换为int 型,再进行移位。2)对于int 型整数移位ab,系统先将b对32取模,得到的结果才是真正移位的位数。3)对于long型整数移位时ab,则先将移位位数b对64取模。使用移位运算符
8、public class Test public static void main(String args) int a=10; int j=a3; int k=a32; System.out.println(“j=”+j); System.out.println(“k=”+k); System.out.println(“m=”+m); 输出结果: j=1 k=80 m=10例4-5 实现二进制的屏蔽效果 public class TestMask /*获取指定整数num二进制表示从右侧数第n位的值 *n从1开始,到32结束 */public int getOneBit(int num,int
9、 n)int i = 1 (n-1);public static void main(String args)int x = 6;TestMask tm = new TestMask();System.out.print(tm.getOneBit(x,4);System.out.print(tm.getOneBit(x,3);System.out.print(tm.getOneBit(x,2);System.out.print(tm.getOneBit(x,1);输出结果:0110赋值运算符1)将等号右侧表达式的值赋给等号左侧的变量。2)赋值操作时遵循值传递原则。3)“=”左侧必须是一个已经声
10、明过的变量,而不允许是常量或复合表达式。 int i=5,j=6; /合法 j=i+10; /合法 10=i+j; /非法 i+j=10; /非法4)赋值运算符左右两侧的数据类型应保持一致,可以自动进行类型转换的情况除外。扩展赋值运算符将赋值运算符和其他的运算符结合起来可以组成扩展赋值运算符,以实现简化的运算标记效果。条件运算符1)语法格式:?:2)说明:其中必须是boolean类型,系统将首先广告牌的值,当其值为true时,则将的值作为整个表达式的最终结果,否则将的值作为整个表达式的最终结果。3)举例:int score=50;int result=x60?60:x;String type=
11、scope= 60) ?及格 : 不及格; System.out.println(result);自增/自减运算符1)+/-也称增量/减量运算符,用于对单个变量进行增1和减1操作。2)可以单独使用,也可用于复合表达式中;运算符可以位于变量之前,也可用于变量之后: 位于变量之前时,先进行变量的增量/减量运算,然后再取用变量的值计算整个表达式的结果; 位于变量之后时,先取用变量的值计算整个表达式的结果,然后才进行变量的增量/减量运算。例4-7 使用自增自减运算符public class TestIncrementpublic static void main(String args)int i =
12、 5,j;j = +i; /等价于j = i + 1;j = i;System.out.println(i= + i + tj= + j);j = i+; /等价于j = i;i = i + 1;System.out.println(i= + i + tj= + j);j = 4 * i-; /等价于j = 4 * i; i = i - 1;System.out.println(i= + i + tj= + j);运行结果:字符串连接运算符+ 1)“+”除用于算术加法运算外,还可用于对字符串进行连接操作。2)“+”运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操
13、作数转换为字符串然后再进行连接。例4-8 实现字符串连接操作public class TestConcatpublic static void main(String args)int i = 300 +5;String s = Hello, + world!;System.out.println(s); s = 你好, + i + 号;System.out.println(s); 运行结果:表达式1)表达式是符合一定语法规则的运算符和操作数的序列。2)表达式的类型和值 对表达式中操作数进行运算得到的结果称为表达式的值 表达式的值的类型即为表达式的类型3)表达式的运算顺序 首先应按照运算符的优
14、先级从高到低的顺序进行 优先级相同的运算符按照事先约定的结合方向进行4)运算符优先级/结合方向例4-9 特殊的表达式public class TestExpressionpublic static void main(String args)int i,j,k;i = j = k = 5 + 3; /等价于 i = (j = (k = 5);System.out.println(i + t + j + t + k); boolean b = false;if(b = true)/注意,这里只有一个=号System.out.println(ok!);elseSystem.out.println(
15、error!); A a = new A();a.ma(); /合法/System.out.println(a.ma(); /非法/int result = a.ma();/非法 class Apublic void ma()System.out.println(In method ma()!);运行结果:数值类型转换1)表达式运算中会出现将数值从一种类型转换为另外一种类型的情况。2)自动类型转换int n=35; long a=n;float f=n; double d=c; double e=3.14f;3)强制类型转换int i=(int)3.14;byte b=(byte)i;例4-1
16、0 数值的类型转换public class TestConversionpublic static void main(String args)int i1 = 1234567891;float f = i1; /合法,但仍然可能存在精度损失System.out.println(f);double d1 = i1;/合法,不存在精度损失System.out.println(d1);double d2 = 3.99;int i2 = (int)d2;System.out.println(i2);byte a = 37;/合法byte b = 112;/合法/byte c = 200;/非法,超出
17、表数范围/byte d = a + b; /非法,可能存在精度损失int e = a + b;/合法System.out.println(e);int k = 12;/byte b1 = k;/非法,可能存在精度损失运算结果:程序运行流程 按照运行流程来划分,程序可分为三种基本结构-顺序性结构、分支结构和循环结构。1)顺序性结构:按照语句出现的顺序依次执行的程序结构。2)分支结构:也称选择性结构,有条件地执行或跳过特定的语句或语句块,实现有选择的流程执行。3)循环结构:在一定的条件下重复执行特定的代码。if-else语句if-else语句用于实现分支结构,其中的else子句不是必须的,if语句
18、又可细分为三种形式:1)使用if语句实现单路分支结构 语法格式: if() 使用举例:例4-11 使用if语句实现单路分支结构 import java.util.*;public class TestIfpublic static void main(String args)Scanner sc = new Scanner(System.in);System.out.print(Input score:);int score = sc.nextInt();if(score 90)System.out.print(Input your name:);String name = sc.next()
19、;System.out.println(name: + name);运行结果:Input score:91score:91Input your name:张三name:张三2)使用if-else语句实现双路分支结构 语法结构: if() else 使用举例:例4-12 使用if语句实现双路分支结构 import java.util.*;public class TestIf_Elsepublic static void main(String args)Scanner sc = new Scanner(System.in);int a = sc.nextInt();int b = sc.nex
20、tInt();int max;if(a b)max = a;elsemax = b;System.out.println(max= + max);2345max=453)使用if-else语句实现多路分支结构 语法结构: if() else if(表达式2) else if(表达式n) else 使用举例:例4-13 使用if语句实现多路分支结构import java.util.*;public class TestScorepublic static void main(String args)Scanner sc = new Scanner(System.in);int score = s
21、c.nextInt();char grade; if (score = 90) grade = A; else if (score = 80) grade = B; else if (score = 70) grade = C; else if (score = 60) grade = D; else grade = F; System.out.println(Grade = + grade);例4-14 嵌套使用if语句public class TestNestIfpublic static void main(String args)TestNestIf tni = new TestNes
22、tIf();int result = tni.max(3,4,5);System.out.println(result); public int max(int a,int b,int c)int max;if(a b)if(a c)max = a;elsemax = c;elseif(b c)max = b;elsemax = c;return max;switch语句用于实现简单的多路分支结构,语法格式:例4-15 使用switch语句public class TestSwitchpublic static void main(String args)TestSwitch tni = ne
23、w TestSwitch();String s = tni.convert(4);System.out.println(s); public String convert(int n)String day = ;switch(n)case 1: day = 星期一;break;case 2: day = 星期二;break;case 3: day = 星期三;break;case 4: day = 星期四;break;case 5: day = 星期五;break;case 6: day = 星期六;break;case 0: day = 星期日;break;default:day = 非法;
24、break;return day;运行结果:星期四例4-16 计算指定月份的天数 public class TestSwitch2public static void main(String args)TestSwitch2 ts = new TestSwitch2();int days = ts.getDaysOfMonth(2008,2);System.out.println(days); public int getDaysOfMonth(int year,int month)int num = 0;switch(month)case 1: case 3: case 5: case 7:
25、 case 8: case 10: case 12: num = 31; break; case 4: case 6: case 9: case 11: num = 30; break; case 2: num = this.isLeapYear(year)?29:28; break; default: System.out.println(Invalid month.); break; return num;public boolean isLeapYear(int year)if(year%4 = 0) & (year%100 != 0)return true;else if(year%4
26、00 = 0)return true;elsereturn false;运行结果:29循环语句1)功能:在循环条件满足的情况下,反复执行特定代码。2)循环语句的四个组成部分部分初始化部分(init_statement)循环条件部分(test_exp )循环体部分(body_statement)迭代部分(alter_statement)3)循环语句分类 for循环 while循环 do-while循环 for-each循环for循环1)语法格式:For(;) 2)应用举例:例4-17 使用for循环语句实现数据累加求和 public class TestFor public static voi
27、d main(String args) int result = 0; for(int i=1;i=100;i+) result += i; System.out.println(result); 运行结果:5050for循环执行过程1)执行初始化表达式;2)计算循环条件表达式的值,如果其值为true,则继续执行第三步,否则结束循环;3)执行循环体语句;4)执行迭代表达式,然后返回到第二步继续执行。例4-18 在for循环中使用逗号表达式public class TestCommaExppublic static void main(String args)int i, j;for(i = 0
28、, j = 10; i = j; i+, j = j - 1)System.out.println(i= + i + ,tj= + j);运行结果:i=0,j=10i=1,j=9i=2,j=8i=3,j=7i=4,j=6i=5,j=5while循环1)语法格式:while() 2)应用举例:例4-19 在while循环中实现数据累加求和public class TestWhileLooppublic static void main(String args)int i = 1;int result = 0;while(i = 100)result += i;i +;System.out.pri
29、ntln(result);运行结果:5050do-while循环1)语法格式:do while()2)应用举例:例4-20 使用do-while循环实现数据累加求和 public class TestDoWhileLooppublic static void main(String args)int i = 1;int result = 0;doresult += i;i +;while(i = 100);System.out.println(result);运行结果:5050for-each循环1)功能:逐个处理(遍历)数组或集合中的所有元素。2)语法格式:for(;) 3)应用举例:例4-
30、21 使用for-each循环 public class TestForEachLooppublic static void main(String args)int a = 3,5,78,12;for(int k: a)System.out.println(k);/等价于:int k;for(int i=0; ia.length; i+)k = ai;System.out.println(k);运行结果:357812例4-22 使用嵌套循环计算1!+2!+.+n!public class TestNestedLooppublic static void main(String args)Te
31、stNestedLoop tn = new TestNestedLoop();int total = tn.m(4); /1! + 2! + 3! + 4! = 33System.out.println(total);public int m(int n)int result = 0;for(int i=1; i=n; i+)int temp = 1;for(int j=1; j=i; j+)temp *= j;result += temp;return result;运行结果:33循环用法总结1)对于同一问题,for、while、do_while三种循环可相互替代。2)for 循环功能强于w
32、hile、do_while。但若不是明显地给出循环变量初始值(或修改条件),则应用while、do_while循环以增强程序的结构化和可读性。3)除for-each以外,其它的循环结构要防止出现无限循环-死循环。4)循环过程中,也可以提前跳出本次循环或终止整个循环,这需要用到下述的特殊流程控制语句continue和break。break语句1)break语句的作用是终止所在的switch语句或循环语句的运行机制。2)语法格式:break; /终止其所在的单层(内层)循环的运行break; /在多层嵌套循环中,终止标签标记的外层循环的运行机制3)用法举例:例4-23 使用break语句终止单层循
33、环 public class TestBreakpublic static void main(String args)TestBreak tb = new TestBreak();boolean result = tb.isPrimeNumber(35); System.out.println(result);public boolean isPrimeNumber(int n)boolean flag = true;for(int i=2; in; i+)if(n % i = 0)flag = false;break;return flag;运行结果:false例4-24 使用break语
34、句终止嵌套循环import java.util.Scanner;public class TestBreakOuterpublic static void main(String args) Scanner scan = new Scanner(System.in); int i; outer: while(true)i = scan.nextInt();for(int j=2; ji; j+) if(i%j = 0) System.out.println(i + 不是素数,程序退出); break outer; System.out.println(i + 是素数,请继续!); 运行输出:3
35、131是素数,请继续!2929是素数,请继续!continue语句1)用于结束所在的循环语句的本次运行,即跳出其后的循环体语句,开始下一次循环。2)continue; /跳出其所在单层(内层)循环的本次运行3)continue ; /在嵌套循环中,跳过标签标记的外层循环的本次运行例4-25 使用continue语句跳过单层循环 public class TestContinuepublic static void main(String args)for (int i = 0; i 10; i+) if (i%3) =0)continue;System.out.print(i + t);运行结
36、果:124578例4-26 使用continue语句跳过嵌套循环 public class TestContinueOuter public static void main(String args) int n = 0; outer: for(int i=101;i200;i+=2) /外层循环for(int j=2; ji;j+) /内层循环 if(i%j=0)continue outer; /不能使用 break ,为什么?System.out.print(i + t);n+; if(n6 )continue;System.out.println(); /输出六个数据后换行n = 0;
37、运行结果:输出100到200之间的素数递归1)问题:求给定整数的阶乘,如何实现?2)解决方案:(两种)采用循环结构采用递归结构例4-27 递归方式计算整数阶乘public class Factorialpublic int f(int n)if(n = 1)return 1;elseint k = f(n-1);return n*k; public static void main(String args)Factorial fact = new Factorial();int result = fact.f(4);System.out.println(result);运行结果:24例4-28
38、 解决Fibonacy数列问题(采用循环和递归两种方法) public class Testpublic static void main(String args)Test t = new Test();System.out.println(t.m1(40);System.out.println(t.m2(40); public int m1(int n)int p1=1,p2=1,c=0;for(int i=3;i1,则分解成几步来处理/step1:将n-1个盘子从a搬到b,借助于cthis.hanoi(n-1,a,c,b);/step2:将第n个盘子从a搬到ctimes +;System.out.println(times + :t + 将p + n + 从 + a + 搬到 + c);/step3:将n-1个盘子从b搬到c,借助于athis.hanoi(n-1,b,a,c);运行结果: