1、Liang, Introduction to Java Programming, Eighth Edition, (c) 2011 Pearson Education, Inc. All rights reserved. 0132130807,1,第3章 选 择,2,引言,如果给程序清单2.1 ComputeArea.java中的radius 赋一个负值,那么程序就会打印出一个非法结果。如果半径为负,那你肯定是不希望计算面积的。如何处理这个问题呢?,Liang, Introduction to Java Programming, Eighth Edition, (c) 2011 Pearson
2、 Education, Inc. All rights reserved. 0132130807,3,学习目标,声明 boolean类型以及使用比较运算符书写布尔表达式(第3.2节)。 使用布尔表达式编写程序 AdditionQuiz (第3.3节)。 使用单向if 语句实现选择控制 (第3.4节)。 使用单向if 语句编写游戏 GuessBirthday 的程序(第3.5节)。 使用双向if 语句实现选择控制(第3.6节)。 使用嵌套的if 语句实现选择控制(第3.7节)。 避免 if 语句中的常见错误 (第3.8节) 使用选择语句编程的不同种类的例子(BMI, ComputeTax, Su
3、btractionQuiz)(第3.9-3.11节)。 使用 Math.random() 方法产生随机数(第3.9节)。 使用逻辑运算符 (&、|和 !)对条件进行组合(第3.12)。 使用带组合条件的选择语句进行编程(LeapYear、Lottery)(第3.13-3.14节)。使用switch 语句实现选择控制 (第3.15节)。 使用条件运算符书写表达式 (第3.16节)。 使用 System.out.printf方法格式化输出和使用 String.format 方法格式化输出字符串 (第3.17节)。 检查控制运算符优先级和结合方向的规则 (第3.18节)。 (GUI)使用确认对话框获
4、取用户的确认信息 (第3.19节)。,4,boolean类型和运算符,通常在一个程序中需要对两个值进行比较, 例如: i 是否大于j。Java提供了六种比较运算符 (也被称作关系运算符)用于比较两个值的大小。比较的结果是一个 Boolean值:true( 真)或false(假)。 boolean b = (1 2);,5,比较运算符,运算符 名称 大于 = 大于或等于 = 等于 != 不等于,6,问题: 一个简单的数学学习工具,AdditionQuiz,Run,这个例子创建的程序就是让一年级学生练习加法。该程序随机产生两个一位整数 number1和number2, 然后显示给学一个像“What
5、 is 7 + 9?” 这样的问题。当学生在输入对话框中输入答案之后,程序显示一条消息,表明这个答案是真还是假。,7,单向if语句,if(布尔表达式) 语句(组); ,if (radius = 0) area = radius * radius * PI;System.out.println(“The area“ + “ for the circle of radius “ + radius + “ is “ + area); ,8,注意,9,简单的 if 演示,SimpleIfDemo,Run,编写一个程序提醒用户输入一个整数。如果这个数能被5整除就显示 HiFive,如果这个数能被2整除就
6、显示 HiEven。,10,问题:猜生日,GuessBirthday,这个程序可以猜出你的生日。运行来看看它是怎么工作的。,11,游戏的数学知识,19 的二进制是10011。7的二进制是111。23的二进制是11101。,12,双向if语句,if(布尔表达式) 布尔表达式为真时执行的语句(组) ; else 布尔表达式为假时执行的语句(组) ; ,13,if.else 例子,if (radius = 0) area = radius * radius * 3.14159;System.out.println(“The area for the “ + “circle of radius “ +
7、 radius + “ is “ + area); else System.out.println(“Negative input“); ,14,嵌套的 if 语句,15,跟踪if-else 语句的执行,if (score = 90.0)grade = A; else if (score = 80.0)grade = B; else if (score = 70.0)grade = C; else if (score = 60.0)grade = D; elsegrade = F;,假设分数score为 70.0,条件为 false,动画,16,跟踪if-else 语句的执行,if (scor
8、e = 90.0)grade = A; else if (score = 80.0)grade = B; else if (score = 70.0)grade = C; else if (score = 60.0)grade = D; elsegrade = F;,假设分数score为 70.0,条件为 false,动画,17,跟踪if-else 语句的执行,if (score = 90.0)grade = A; else if (score = 80.0)grade = B; else if (score = 70.0)grade = C; else if (score = 60.0)gr
9、ade = D; elsegrade = F;,假设分数score为 70.00,条件为 true,动画,18,跟踪if-else 语句的执行,if (score = 90.0)grade = A; else if (score = 80.0)grade = B; else if (score = 70.0)grade = C; else if (score = 60.0)grade = D; elsegrade = F;,假设分数score为 70.0,级别grade为 C,动画,19,跟踪if-else 语句的执行,if (score = 90.0)grade = A; else if (
10、score = 80.0)grade = B; else if (score = 70.0)grade = C; else if (score = 60.0)grade = D; elsegrade = F;,假设分数score为 70.0,退出 if 语句,动画,20,注意,else语句总是和跟它在同一块中离它最近的 if 匹配。,21,注意(续),前面的语句什么也不会输出。如果想让 else 子句匹配第一个if 子句,你必须加上一对花括号:int i = 1; int j = 2;int k = 3;if (i j) if (i k)System.out.println(“A“);else
11、 System.out.println(“B“);这条语句输出 B。,22,常见错误,在if 子句后面加一个分号是一种常见错误。 if (radius = 0); area = radius*radius*PI;System.out.println(“The area for the circle of radius “ +radius + “ is “ + area); 这个错误很难发现,因为它既不是编译错误也不是运行错误,而是一个逻辑错误。 使用下行风格时经常会犯这种错误。,错误,23,提 示,24,注 意,25,问题:一个改进的数学学习工具,这个例子创建程序来教授一年级学生如何学习减法。
12、这个程序随机产生两个一位整数number1和number2,这两个数满足 number1 number2。程序向学生显示像“What is 9 2?”这样的问题 。当学生在输入对话框输入答案之后,程序显示一条消息,表明答案是否正确。,SubtractionQuiz,26,问题:身体质量指数,身体质量指数(BMI)是关于体重的健康指标。通过测试将以千克为单位的体重除以以米为单位的身高的平方就得到BMI的值。针对16岁及以上年龄的人群,他们的BMI值说明如下所示:,ComputeBMI,27,问题: 计算税款,美国联邦个人收入所得税是基于纳税人登记的身份和可征税收入计算的。纳税人身份有四种: 单身
13、纳税人、已婚共同纳税人、已婚单独纳税人和家庭户主纳税人。2009 的税率如下所示:,28,问题:计算税款(续),ComputeTax,if (status = 0) / Compute tax for single filers else if (status = 1) / Compute tax for married file jointly else if (status = 2) / Compute tax for married file separately else if (status = 3) / Compute tax for head of household else
14、/ Display wrong status ,29,逻辑运算符,运算符 名称 ! 逻辑非 & 逻辑和 | 逻辑或 逻辑异或,30,运算符!的真值表,31,运算符&的真值表,32,运算符|的真值表,33,举 例,下面的程序检验一个数能否被2和3整除,能否被2或3整除, 以及能否只被2和3整除但不能被它俩同时整除。,TestBooleanOperators,Run,34,运算符!的真值表,35,运算符&的真值表,36,运算符|的真值表,37,运算符的真值表,38,举 例,System.out.println(“Is “ + number + “ divisible by 2 and 3? “ +
15、(number % 2 = 0) ,TestBooleanOperators,Run,39,运算符&和|,补充材料III.B, “运算符&和|”,配套网站,40,运算符 & 和 |,If x is 1, what is x after this expression? (x 1) & (x+ x) & ( 1 x+)How about (1 = x) | (10 x+)? (1 = x) | (10 x+)?,配套网站,41,问题:判定是否是闰年?,LeapYear,Run,这个程序首先提示用户输入一个代表年的整型值,然后判定它是不是闰年。 如果某年可以被4整除但不能被100整除,或者能被40
16、0整除,那么这一年就是闰年。(year % 4 = 0 & year % 100 != 0) | (year % 400 = 0),42,问题:彩票,编写程序让它随机产生一个两位数的彩票,提示用户输入一个两位数,然后按照下面规则判断用户是否能赢:,Lottery,如果用输入匹配彩票的实际顺序,奖金为 10000美元。 如果用户输入的所有数字匹配彩票的所有数字,奖金为美元3000。 如果用户输入的一个数字匹配彩票的一个数字,奖金为美元1000。,43,switch语句,switch (status) case 0: compute taxes for single filers;break;ca
17、se 1: compute taxes for married file jointly;break;case 2: compute taxes for married file separately;break;case 3: compute taxes for head of household;break;default: System.out.println(“Errors: invalid status“);System.exit(0); ,44,switch 语句流程图,45,Switch语句规则,switch (switch表达式) case value1:语句(组)1;brea
18、k;case value2: 语句(组)2;break;case valueN: 语句(组)N;break;default: 默认情况下执行的语句(组) ; ,46,switch 语句规则,关键字 break 是可选的,但是它应该用在每个case语句后面以终止 switch 语句的其它部分。 如果 break 语句不出现就会继续执行下一个 case 语句。,switch (switch表达式) case value1:语句(组)1;break;case value2: 语句t(组)2;break;case valueN: 语句(组)N;break;default: 默认情况下执行的语句(组)
19、; ,case语句是顺序执行的,但是这些case(包括默认情况)的顺序是不重要的。然而, 良好的程序设计风格就是遵从case的逻辑顺序排列,并且把默认情况放在最后。,default语句是可选的, 用来完成没有一个指定的case与switch表达式匹配时应该采取的操作。,47,跟踪switch语句的执行,switch (ch) case a: System.out.println(ch);case b: System.out.println(ch);case c: System.out.println(ch); ,假设 ch是 “a”:,动画,48,跟踪switch语句的执行,switch (c
20、h) case a: System.out.println(ch);case b: System.out.println(ch);case c: System.out.println(ch); ,ch是 “a”:,动画,49,跟踪switch语句的执行,switch (ch) case a: System.out.println(ch);case b: System.out.println(ch);case c: System.out.println(ch); ,执行这一行,动画,50,跟踪switch语句的执行,switch (ch) case a: System.out.println(c
21、h);case b: System.out.println(ch);case c: System.out.println(ch); ,执行这一行,动画,51,跟踪switch语句的执行,switch (ch) case a: System.out.println(ch);case b: System.out.println(ch);case c: System.out.println(ch); ,执行这一行,动画,52,跟踪switch语句的执行,switch (ch) case a: System.out.println(ch);case b: System.out.println(ch);
22、case c: System.out.println(ch); Next statement;,执行下一条语句,动画,53,跟踪switch语句的执行,switch (ch) case a: System.out.println(ch);break;case b: System.out.println(ch);break;case c: System.out.println(ch); ,假设 ch是 “a”:,动画,54,跟踪switch语句的执行,switch (ch) case a: System.out.println(ch);break;case b: System.out.print
23、ln(ch);break;case c: System.out.println(ch); ,ch 是“a”:,动画,55,switch (ch) case a: System.out.println(ch);break;case b: System.out.println(ch);break;case c: System.out.println(ch); ,执行这一行,动画,跟踪switch语句的执行,56,跟踪switch语句的执行,switch (ch) case a: System.out.println(ch);break;case b: System.out.println(ch);
24、break;case c: System.out.println(ch); ,执行这一行,动画,57,跟踪switch语句的执行,switch (ch) case a: System.out.println(ch);break;case b: System.out.println(ch);break;case c: System.out.println(ch); Next statement;,执行下一条语句,动画,58,条件运算符,if (x 0) y = 1 else y = -1;等价于y = (x 0) ? 1 : -1; (布尔表达式) ?表达式1 : 表达式2三目运算符 二元运算符
25、 一元运算符,59,条件运算符,if (num % 2 = 0)System.out.println(num + “is even”); else System.out.println(num + “is odd”);System.out.println(num % 2 = 0)? num + “is even” :num + “is odd”);,60,条件运算符(续),(布尔表达式)?表达式1 : 表达式2,61,格式化控制台输出,使用 printf 语句。System.out.printf(format, items); 这里的format是指多个子串和格式标识符构成的字符串。格式标识符
26、指定每个条目应该如何显示。这里的条目可以是数值、字符、布尔值或字符串。每个标识符都以百分号(%)开头。,62,常用的标识符,标识符 输出 举例 %b 布尔值 true or false %c 字符 a %d 十进制整数 200 %f 浮点数 45.460000 %e 标准科学计数法形式的数 4.556000e+01 %s 字符串 “Java is cool“,63,运算符的优先级,var+ 、var- + 、-(一元加号和一元减号)、+var 、-var (type) 类型转换 ! (非) * 、/ 、% (乘法、除法、求余运算) + 、- (二元加法和减法)、= (比较运算符) = 、!=
27、(相等运算符) (异或) & (条件与) 短路与 | (条件或) 短路或 = 、+= 、-= 、*= 、/= 、%= (赋值运算符),64,运算符优先级和结合方向,应该首先计算括号里的表达式。(括号可以嵌套,在嵌套的情况下,先计算里层括号的表达式。)当计算没有括号的表达式时,运算符会按照优先级规则和结合规则完成计算。如果相邻两个运算符优先级相同,那么它们的结合方向决定了它们的执行顺序。除了赋值运算符外,所有的二元运算符都是左结合的。,65,运算符结合方向,如果相邻两个运算符优先级相同, 则结合方向决定它的 执行顺序。除赋值运算符外,所有的二元运算符都是 左结合的。a b + c d 等价于 (
28、a b) + c) d 赋值运算符都是右结合的。因此,表达式a = b += c = 5 等价于 a = (b += (c = 5),66,举 例,应用运算符优先级规则和结合方向规则,表达式 3 + 4 * 4 5 * (4 + 3) - 1 如下这样计算:,67,运算符计算顺序,补充材料III.A,“JVM中是如何计算表达式的高级讨论”。,配套网站,68,(GUI) 确认对话框,int option = JOptionPane.showConfirmDialog(null, “Continue“);,69,问题:猜生日,GuessBirthDateUsingConfirmationDialog,这个程序能猜出你的生日,运行来看看它是怎么工作的。,