Java SE 03(选择结构)
1.选择结构 if 语句
1.1单分支if语句
1.1.1 if 语句是一个结构,允许程序确定执行的路径。
1.1.2 特点:适合做单个判断
1.1.3 单分支 if 语句的语法如下:
if (布尔表达式){
语句(组):
}
1.1.4 执行流程:
- 首先判断布尔表达式的值是true还是false
- 如果是true就执行语句体
- 如果是false就不执行语句体
注意:
- 关系表达式无论简单还是复杂,结果必须是boolean类型
- if语句控制的语句体如果是一条语句,大括号可以省略;如果是多条语句,则不
能省略;建议永远不要省略
1.2 双分支 if-else 语句
1.2.1 if-else 语句根据条件是真或者是假,决定执行的路径。
1.2.2 特点::适合做两个判断
1.2.3 双分支 if-else 语句语法如下:
if (布尔表达式){
布尔表达式为其时执行的语句 (组) 1;
}
else{
布尔表达式为假时执行的语句 (组) 2;
}
1.2.4 执行流程:
- 首先判断布尔表达式的值是true还是false
- 如果是true执行语句体1
- 如果是false执行语句体2
1.2.5 双分支 if-else 语句和三元的相互转换问题
- 三元运算符的操作都可以使用if语句改进,反之不成立
- 当if语句控制的语句体是一条输出语句时,就不成立,因为三元运算符是一个运算符,必须要求有一个结果返回。而输出语句不能作为一个返回结果。
1.3 嵌套的 if 语句和多分支 if - else 语句
1.3.1 if 语句可以在另外一个 if 语句中,形成嵌套的 if 语句。
1.3.2 特点:适合做多个判断
1.3.3 多分支 if - else 语句语法格式
if(布尔表达式1){
语句体1;
}else if(布尔表达式2){
语句体2;
}
...
else{
语句体n+1;
}
1.3.4 执行流程:
- 首先判断布尔表达式1的结果
- 如果是true就执行语句体1
- 如果是false就继续判断布尔表达式2的结果
- 如果是true就执行语句体2
- 如果是false就继续判断布尔表达式…
- …
- 如果没有任何布尔表达式的值是true,就执行语句体n+1
2. 选择结构switch语句
2.1 switch 语句基于变量或者表达式的值来执行语句。
2.2 switch 语句的完整语法:
switch (switch 表达式){
case 值 1: 语句 (组) 1;
break;
case 值 2: 语句 (组) 2;
break;
...
case 值 N: 语句 (组) N;
break;
default:默认情况下执行的语句 (组)
2.3 switch 语句遵从下述规则:
- switch 表达式必须能计算出一个 char、byte、short、int 或者 String 型值,并且必
须总是要用括号括住。 - 值 1 ,…,值 N 必须与 switch 表 达 式 的 值 具 有 相 同 的 数 据 类 型。注 意:值 1 ,…,值 N 都是常量表达式,也就是说这里的表达式是不能包含变量的,例如,不允许出现 1+x。
- 当 switch 表达式的值与 case 语句的值相匹配时,执行从该 case 开始的语句,直到遇到一个 break 语句或到达该 switch 语句的结束。
- 默认情况(default)是可选的,当没有一个给出的 case 与 switch 表达式匹配时,用来执行该操作。
- 关键字 break 是可选的。break 语句会立即终止 switch 语句。
2.4 执行流程:
- 首先计算表达式的值
- 其次,和case依次比较,一旦有对象的值,就会执行相应的语句,在执行的过程
中,遇到break就会结束。 - 最后,如果所有的case都和表达式的值不匹配,就会执行defalut语句体部分,然
后switch执行完毕。
3. 选择结构 if 语句和 switch 语句的各自使用场景
3.1 if语句的使用场景:
- 针对结果是boolean类型的判断
- 针对一个范围的判断
- 针对几个常量值的判断
3.2 switch语句使用场景:
- 针对几个常量值的判断
4. 关键术语
英文 | 中文 |
---|---|
Boolean expression | 布尔表达式 |
Boolean data type | boolean 数据类型 |
Boolean value | 布尔值 |
conditional operator | 条件操作符 |
dangling-else ambiguity | 悬空 else 歧义 |
debugging | 调试 |
fall-through behavior | 落空行为 |
flowchart | 流程图 |
lazy operator | 懒惰操作符 |
operator associativity | 操作符结合规则 |
operator precedence | 操作符优先级 |
selection statement | 选择语句 |
short-circuit evaluation | 短路运算 |
编程练习题:
-
(代数:解一元二次方程)可以使用下面的公式求一元二次方程 ax2+bx+c=0 的两个根:
可以使用 Math.pow(x,0.5)来计算x0.5
下面是一些运行示例:Enter a, b, c: 1.0 3 1
Enter
The equation has two roots -0.381966 and -2.61803
Enter a, b, c:1 2.0 1Enter
The equation has one root -1
Enter at bt c:1 2 3Enter
The equation has no real roots代码:
import java.util.Scanner; class Demo3_1{ /* 数据:a b c d e f x delt 指令: 1.输入数据 2.计算delt 3.判断? 3.1 delt==0 计算出唯一解 x 3.2 delt>0 计算x1 x2 3.3 输出无解 */ public static void main(String[] args){ Scanner scanner=new Scanner(System.in); //1. double a=scanner.nextDouble(); double b=scanner.nextDouble(); double c=scanner.nextDouble(); //2. double delt=b*b-4*a*c; //3. if(delt==0){ //3.1 double x=-b/(2*a); System.out.printf("The equation has one root f",x); }else if(delt>0){ //3.2 double x1=(-b+Math.pow(delt,0.5))/(2*a); double x2=(-b-Math.pow(delt,0.5))/(2*a); System.out.printf("The equation has two rootst %f and %f" x1,x2); }else { //3.3 System.out.println("No real root."); } } }
-
(回文数字)编写一个程序,提示用户输入一个三位的整数,然后确定它是否回文数字。当从左到右,以及从右到左都是一样的话,这个数字称为回文数。
下面是程序的一个运行示例:
Enter a three-digit integer: 121
Enter
121 is a palindrome
Enter a three-digit integer: 123Enter
123 is not a palindromeimport java.util.Scanner; class Demo3_2{ /* 数据:一个三位整数 个位 十位 百位 指令: 1.输入一个数字 2.将数字进行拆分个位a 十位b 百位c 3.重新组装一个新数字 a*100+b*10+c 4.判断该数字与原数字是否相同 */ public static void main(String[] args){ Scanner scanner = new Scanner(System.in); System.out.printf("Enter a three-digit integer:"); int num=scanner.nextInt(); int n=num; int a=n%10; n/=10; int b=n%10; n/=10; int c=n%10; int newnum=a*100+b*10+c; if(newnum==num){ System.out.printf("%d is a palindorme.",num); }else{ System.out.printf("%d is not a palindorme.",num); } } }
-
(游戏:剪刀、石头、布)编写可以玩流行的剪刀、石头、布游戏的程序。(剪刀可以剪布,石头可以砸剪刀,而布可以包石头。)程序随机产生一个数,这个数为 0、1或者 2, 分别表示石头、剪刀和布。程序提示用户输入值 0、1或者 2, 然后显示一条消息,表明用户和计算机谁贏了游戏,谁输了游戏,或是打成平手。
下面是运行示例:
scissor (0), rock (1), paper (2): 1
Enter
The computer is scissor. You are rock. You won
scissor (0), rock (1), paper (2): 2Enter
The computer is paper. You are paper too. It is a drawimport java.util.Scanner; class Demo3_3{ /* 数据:电脑随机生成(0,1,2) 用户输入(0 1 2) 指令: 1.电脑随机生成 2.获取用户输入 3.进行比对 3.1 usr==com 平局 3.2 (com+1)%3==usr 用户赢 (com+1)%3 1 2 0 usr 0 1 2 3.3 用户输 4.结束 */ public static void main(String[] args){ Scanner scanner=new Scanner(System.in); //1. int com=(int)(Math.random()*3); System.out.print("scissor(0) rock(1) paper(2):"); //2. int usr=scanner.nextInt(); String comStr=""; String usrStr=""; if(com==0){ comStr="scissor"; }else if(com==1){ comStr="rock"; }else{ comStr="paper"; } if(usr==0){ usrStr="scissor"; }else if(usr==1){ usrStr="rock"; }else{ usrStr="paper"; } //3. if(com==usr){ //3.1 System.out.printf("The computer is %s.You are %s.It is a draw",comStr,usrStr); }else if((com+1)%3==usr){ //3.2 System.out.printf("The computer is %s.You are %s.You win",comStr,usrStr); }else{ //3.3 System.out.printf("The computer is %s.You are %s.You lose",comStr,usrStr); } } }
-
(几何:点是否在圆内?)编写程序,提示用户输入一个圆的圆心坐标(ox,oy)、半径和一个点P(x, y),然后检査这个点是否在圆内。
下面是运行示例:
Enter circle ox,oy,r: 2 2 2
Enter
Enter a point P: 1 1Enter
Point P(1.0,1.0) in the circle.
Enter circle ox,oy,r:1 2 3Enter
Enter a point P:4 4Enter
Point P(4.0,4.0) not in the circle.import java.util.Scanner; class Demo3_4{ /* 点是否在圆内 数据:圆心坐标ox oy 半径r 点px py 指令: 1.输入数据 2.计算op距离 3.判断r>op 3.1 输出点p在圆内 3.2 输出点p在圆外 */ public static void main(String[] args){ Scanner scanner=new Scanner(System.in); System.out.printf("Enter circle ox,oy,r:"); //1. double ox=scanner.nextDouble(); double oy=scanner.nextDouble(); double r=scanner.nextDouble(); System.out.printf("Enter a point P(x,y):"); double px=scanner.nextDouble(); double py=scanner.nextDouble(); //2. double op=Math.pow((Math.pow((px-ox),2)+Math.pow((py-oy),2)),0.5); //3. if(r>op){ System.out.printf("Point P(%.1f,%.1f) in the circle.",px,py); }else{ System.out.printf("Point P(%.1f,%.1f) not in the circle.",px,py); } } }