1、java概述课件-03-选择2引言 如果在前边程序中的radius赋一个负值,程序就会打印一个非法的结果。如果半径是一个负值,是不希望程序计算面积的,那么该如何计算这种情况呢?3学习目标F声明boolean类型以及使用 比较运算符书写布尔表达式(3.2节)。F使用布尔表达式编写程序AdditionQuize(3.3节)。F使用单向if语句实现选择控制(3.4节)。F使用单向if语句编写游戏GuessBirthday的程序(3.5节)。F使用双向if语句实现选择控制(3.6节)。F使用嵌套的if语句实现选择控制(3.7节)。F避免if语句中的常见错误(3.8节)。F使用选择语句编程的不同种类的例
2、子(SubstractionQuiz,BMI,ComputeTax)(3.9-3.11节)F使用Math.random()方法产生随机数(3.9节)。F使用逻辑运算符(&,|和!)对条件进行组合(3.12节)。F使用带组合条件的选择语句进行编程(LeapYear,Lottery)(3.13-3.14节)。F使用switch语句实现选择控制(3.15节)。F使用条件运算符书写表达式(3.16节)。F使用System.out.printf方法格式化输出(3.17节)。F检查控制运算符优先级和结合方向的规则(3.18节)。F(GUI)使用确定对话框获取用户的确认信息(3.19节)。4boolean数
3、据类型 往往在一个程序中我们需要比较两个值,如 i 是否大于 j。Java提供了六个比较运算符(也被称为关系操作符),可以用来比较两个值。比较的结果是一个布尔值:TRUE或FALSE。boolean b=(1 2);5比较运算符运算符 名称 小于 大于=大于等于=等于!=不等于6问题:一个简单的数学学习工具AdditionQuizRun 假设希望开发一个程序,让一年级学生练习加法。程序随机产生两个一位整数:number1和number2,然后显示给学生“What is 7+9?”,如实例运行所示。当学生在输入对话框中输入答案之后,程序显示一个消息,表明答案是真的还是假的。7单向if语句 Boo
4、lean Expression true Statement(s)false (radius=0)true area=radius*radius*PI;System.out.println(The area for the circle of +radius +radius+is +area);false(A)(B)if(布尔表达式)语句;if(radius=0)area=radius*radius*PI;System.out.println(The area +for the circle of radius +radius+is +area);8注意 if i 0 System.out.p
5、rintln(i is positive);(a)Wrong(b)Correct if(i 0)System.out.println(i is positive);if(i 0)System.out.println(i is positive);(a)Equivalent(b)if(i 0)System.out.println(i is positive);9问题:猜生日GuessBirthdayRun 该程序可以猜到你的出生日期。运行看它是如何工作的。16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Set1 8 9 10 11 12 13 14
6、 15 24 25 26 27 28 29 30 31 Set2 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 Set3 2 3 6 7 10 11 14 15 18 19 22 23 26 27 30 31 Set4 4 5 6 7 12 13 14 15 20 21 22 23 28 29 30 31 Set5+=19 10猜生日游戏的数学基础19 的二进制是10011。7的二进制是111。23的二进制是11101。16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Set1 8 9 10 11 12 13
7、 14 15 24 25 26 27 28 29 30 31 Set2 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 Set3 2 3 6 7 10 11 14 15 18 19 22 23 26 27 30 31 Set4 4 5 6 7 12 13 14 15 20 21 22 23 28 29 30 31 Set5+=19 10000 10 +1 10011 00110 10 +1 00111 19 7 10000 1000 100+1 11101 23 11简单if演示SimpleIfDemoRun 程序提示用户输入一个整数,如果它能被5整除就显
8、示HiFive,而如果它能被2整除就显示HiEven。12双向if语句if(布尔表达式)布尔表达式为真时执行的语句(组);else 布尔表达式为假时执行的语句(组);Boolean Expression false true Statement(s)for the false case Statement(s)for the true case 13if.else 例子if(radius=0)area=radius*radius*3.14159;System.out.println(The area for the“+“circle of radius +radius+is +area);el
9、se System.out.println(Negative input);14嵌套的if语句 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;else grade=F;Equivalent 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;else grade=F;15跟踪if-el
10、se语句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;else grade=F;假如成绩是70.0这个语句是 falseanimation16跟踪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;else grade=F;假如成绩是70.0这个语句是 falsean
11、imation17跟踪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;else grade=F;假如成绩是70.0这个语句是trueanimation18跟踪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;else grade=F;假如成绩是70.
12、0经判断是C级animation19跟踪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;else grade=F;假如成绩是70.0退出if语句animation20注意 在同一块中,else总是和离它最近的if子句匹配。int i=1;int j=2;int k=3;if(i j)if(i k)System.out.println(A);else System.out.println(B);(a)Equivalent(
13、b)int i=1;int j=2;int k=3;if(i j)if(i k)System.out.println(A);else System.out.println(B);21注意为了强制这个else匹配第一个if子句,必须添加一对花括号:int i=1;int j=2;int k=3;if(i j)if(i k)System.out.println(A);else System.out.println(B);这条语句会打印B.22常见错误在if行出现错误的分号if(radius=0);area=radius*radius*PI;System.out.println(The area f
14、or the circle of radius +radius+is +area);这个错误很难发现,因为它既不是编译错误也不是运行错误,而是一个逻辑错误。当使用下行块风格时,经常会出现这个错误。所以使用行为块风格可以帮助防止出现此类错误。Wrong23小窍门 if(number%2=0)even=true;else even=false;(a)Equivalent boolean even =number%2=0;(b)24注意 if(even=true)System.out.println(It is even.);(a)Equivalent if(even)System.out.prin
15、tln(It is even.);(b)25问题:一个改进的数学学习工具 假设我们想开发一个一年级学生练习减法的程序。程序随机产生两个一位整数:number1和number2,且满足number1=number2.程序向学生显示问题,例如,“What is 9-2?”。当学生输入答案之后,程序会显示一个消息表示答案是否正确。SubtractionQuizRun26问题:计算身体质量指数 体质指数(BMI)是关于体重指标的健康测量。将以千克为单位的体重除以以米为单位身高的平方,就得到BMI的值。针对16岁及以上的年龄人群,他们的BMI值的说明如下表所示。ComputeBMIR u n BMI I
16、nterpretation below 16 serious underweight 16-18 underweight 18-24 normal weight 24-29 overweight 29-35 seriously overweight above 35 gravely overweight 27问题:计算税款 美国国家联邦个人收入所得税是基于纳税人登记的身份和可征税收入计算的。纳税人登记的身份有四种:单身纳税人,已婚共同纳税人,已婚单独纳税人和家庭户主纳税人。税率会随年变化。下表给出2009年的税率。Marginal Tax RateSingleMarried Filing Jo
17、intly or Qualified Widow(er)Married Filing SeparatelyHead of Household10%$0$8,350$0$16,700$0$8,350$0$11,95015%$8,351$33,950$16,701$67,900$8,351$33,950$11,951$45,50025%$33,951$82,250$67,901$137,050$33,951$68,525$45,501$117,45028%$82,251$171,550$137,051$208,850$68,525$104,425$117,451$190,20033%$171,55
18、1$372,950$208,851$372,950$104,426$186,475$190,201-$372,95035%$372,951+$372,951+$186,476+$372,951+28问题:计算税款续ComputeTaxRunif(status=0)/Compute tax for single filerselse if(status=1)/Compute tax for married file jointlyelse if(status=2)/Compute tax for married file separatelyelse if(status=3)/Compute t
19、ax for head of householdelse /Display wrong status29逻辑运算符运算符 名称!非&与|或异或30运算符!的真值表 p !p true false false true Example(assume age=24,gender=M)!(age 18)is false,because(age 18)is true.!(gender!=F)is true,because(grade!=F)is false.31运算符&的真值表 p1 p2 p1&p2 false false false false true false true false fals
20、e true true true Example(assume age=24,gender=F)(age 18)&(gender=F)is true,because(age 18)and(gender=F)are both true.(age 18)&(gender!=F)is false,because(gender!=F)is false.32运算符|的真值表 p1 p2 p1|p2 false false false false true true true false true true true true Example(assume age=24,gender=F)(age 34)
21、|(gender=F)is true,because(gender=F)is true.(age 34)|(gender=M)is false,because(age 34)and(gender=M)are both false.33异或运算符的真值表 p1 p2 p1 p2 false false false false true true true false true true true false Example(assume age=24,gender=F)(age 34)(gender=F)is true,because(age 34)is false but(gender=F)i
22、s true.(age 34)|(gender=M)is false,because(age 34)and(gender=M)are both false.34例子 给出有一个程序检验一个数是否能被2和3整除,是被2还是3整除,是只能被2或3两者中的一个整除。TestBooleanOperatorsRun35例子续System.out.println(Is +number+divisible by 2 and 3?+(number%2=0)&(number%3=0);System.out.println(Is +number+divisible by 2 or 3?+(number%2=0)|
23、(number%3=0);System.out.println(Is +number+divisible by 2 or 3,but not both?+(number%2=0)(number%3=0);TestBooleanOperatorsRun36运算符&和|Java中&和&以及|和|的区别:&和&都是表示与,区别是&只要不满足第一个条件,后面条件就不再判断。而&要对所有的条件都进行判断。|和|同理。37运算符&和|如果x是1,在如下表达式之后x是?(x 1)&(x+x)&(1 x+)这个又如何呢(1=x)|(10 x+)?(1=x)|(10 x+)?38问题:判断闰年LeapYearR
24、un 这个程序首先让用户输入一个int型年份,然后判断它是不是闰年。如果某年可以被4整除而不能被100 整除,或者可以被400整除,那么这一年就是闰年。(year%4=0&year%100!=0)|(year%400=0)39问题:彩票 假设我们想开发一个玩彩票的游戏,程序会随机地产生一个两位数的彩票,提示用户输入一个两位数,然后按照下面的规则判断用户是否能赢。LotteryRunF 如果用户的输入数匹配彩票得实际顺序,奖金为$10 000美元。F 如果用户输入的所有数字匹配彩票的所有数字,奖金$3000美元。F 如果用户输入的一个数字匹配彩票的一个数字,奖金$1000美元。40switch
25、语句switch(status)case 0:compute taxes for single filers;break;case 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);41switch 语句的流程图 st
26、atus is 0 Compute tax for single filers break Compute tax for married file jointly break status is 1 Compute tax for married file separatly break status is 2 Compute tax for head of household break status is 3 Default actions default Next Statement 42switch 语句的规则switch(switch-expression)case value1:
27、statement(s)1;break;case value2:statement(s)2;break;case valueN:statement(s)N;break;default:statement(s)-for-default;Switch表达式必须能计算出一个char,byte,short或 int 型值,并且必须总是用括号括住。value1,.,valueN 必须与switch表达式的值具有相同的数据类型。注意:value1,.,valueN 都是常量表达式,也就是说这里的表达式是不能包含变量的,例如,不允许出现1+x。43Switch 语句的规则 关键字break是可选的。brea
28、k语句会立即终止整个switch语句。如果break语句是不存在的,下一个case语句将被执行。switch(switch-expression)case value1:statement(s)1;break;case value2:statement(s)2;break;case valueN:statement(s)N;break;default:statement(s)-for-default;默认情况下(default)是可选的,用来指定没有一个指定的case与switch表达式匹配时应该采取的操作。这几条语句是按顺序判断的,但是他们的顺序不影响程序运行结果.然而要有良好的编程风格,因
29、此按顺序比较好。习惯上把默认情况放在最后。44跟踪switch语句switch(ch)case a:System.out.println(ch);case b:System.out.println(ch);case c:System.out.println(ch);如果 ch 是 a:45跟踪switch语句switch(ch)case a:System.out.println(ch);case b:System.out.println(ch);case c:System.out.println(ch);ch 是 a:46跟踪switch语句switch(ch)case a:System.ou
30、t.println(ch);case b:System.out.println(ch);case c:System.out.println(ch);执行这一行语句47跟踪switch语句switch(ch)case a:System.out.println(ch);case b:System.out.println(ch);case c:System.out.println(ch);执行这一行语句48跟踪switch语句switch(ch)case a:System.out.println(ch);case b:System.out.println(ch);case c:System.out.
31、println(ch);执行这一行语句49跟踪switch语句switch(ch)case a:System.out.println(ch);case b:System.out.println(ch);case c:System.out.println(ch);Next statement;执行这一行语句50跟踪switch语句switch(ch)case a:System.out.println(ch);break;case b:System.out.println(ch);break;case c:System.out.println(ch);假如 ch is a:51跟踪switch语句
32、switch(ch)case a:System.out.println(ch);break;case b:System.out.println(ch);break;case c:System.out.println(ch);Execute this line52跟踪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:53跟踪switch语句switch(ch)case a:System.out.
33、println(ch);break;case b:System.out.println(ch);break;case c:System.out.println(ch);执行这一行语句54跟踪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;执行下一行语句55条件表达式条件表达式if(x 0)y=1else y=-1;等同于:y=(x 0)?1:-1;(boolean-expre
34、ssion)?expression1:expression2三目运算符二元运算符一元运算符56条件运算符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”);57条件运算符(boolean-expression)?exp1:exp258格式化控制台输出 使用printf语句:System.out.printf(format,items);格式标识符指定每个条目应该如何显示。
35、这里的条目可以是数值,字符,布尔值或字符串。一个标识符是以百分号(%)开头的转换码。59常用的标识符标识符标识符 输出输出 举例举例%b 布尔值 true or false%c 字符 a%d 十进制整数 200%f 浮点数 45.460000%e 标准科学计数法形式的数 4.556000e+01%s 字符串 Java is cool int count=5;double amount=45.56;System.out.printf(count is%d and amount is%f,count,amount);display count is 5 and amount is 45.56000
36、0 items 60运算符的优先级表Fvar+,var-(后置运算符)F+,-(一元加号和一元减号),+var,-var(前置运算符)F(type)类型转换F!(非)F*,/,%(乘法,除法和求余运算)F+,-(二元加法和减法)F,=(比较运算符)F=,!=;(相等运算符)F(异或)F&(条件与)F|(条件或)F=,+=,-=,*=,/=,%=(赋值运算符)61运算符的优先级和结合方向 应该首先计算括号内中的表达式(括号可以嵌套,在嵌套的情况下,先计算里层括号中的表达式)。当计算没有括号时,运算符会依照优先级规则和结合规则进行运算。优先级规则定义了运算符的先后次序,它包含目前所学的所有运算符。
37、它们从上到下按优先级递减的方式排列。优先级相同的运算符在同一排。62运算符的结合性 如果相邻运算符的优先级相同,则结合方向决定它们的执行顺序。除了赋值运算符之外,所有的二元运算符都是左结合 a b+c d 等价于 (a b)+c)d 赋值运算符是右结合,所以 a=b+=c=5 等价于a=(b+=(c=5)63例子 应用运算符的优先级和结合性规则,表达式3+44 5(4+3)-1等于如下:3+4*4 5*(4+3)-1 3+4*4 5*7 1 3+16 5*7 1 3+16 35 1 19 35 1 19 34 false (1)inside parentheses first (2)multi
38、plication (3)multiplication (4)addition (5)subtraction (6)greater than 64(GUI)确定对话框int option=JOptionPane.showConfirmDialog (null,Continue);65问题:猜生日GuessBirthDateUsingConfirmationDialogR u n 这个程序可以猜到你的生日,运行看看是如何工作的 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Set1 8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31 Set2 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 Set3 2 3 6 7 10 11 14 15 18 19 22 23 26 27 30 31 Set4 4 5 6 7 12 13 14 15 20 21 22 23 28 29 30 31 Set5+=19