程序可以基于条件决定执行那些语句
3.1 boolean数据类型
(boolean 数据类型声明一个具有值true或false的变量)
- 比较两个值的大小,JAVA提供6种关系操作符
比较的结果是一个布尔值true或false,例如:
double radius = 1;
System.out.print(radius > 0);
语句显示true, 具有布尔值的变量叫布尔变量,boolean数据类型用于声明布尔型变量,例:
boolean flag1 = true;
boolean flag2 = false;
true和false都是直接量,被当做保留字一样,不能用作程序中的标识符
练习:输入一个整数,判断它是否被5和6整除;被5或6整除;被5或6整除但不同时整除
/*
数据:
num,f1,f2,f3
操作:
布尔值f1,f2,f3
f1=(num%5==0)&&(num%6==0);同真返回ture
f2=(num%5==0)||(num%6==0);有一个为真返回ture
f3=(num%5==0)^(num%6==0);异或 “同假异真”
*/
import java.util.Scanner;
class if3_9
{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("Enter an integer :");
int num=scanner.nextInt();
boolean f1=(num%5==0)&&(num%6==0);
boolean f2=(num%5==0)||(num%6==0);
boolean f3=(num%5==0)^(num%6==0);
System.out.println("Is"+num+"divisible by 5 and 6?"+f1);
System.out.println("Is"+num+"divisible by 5 or 6?"+f2);
System.out.println("Is"+num+"divisible by 5 or 6,but not both?"+f3);
}
}
3.2 if选择结构
- if语句格式1:(单个判断)
if(布尔表达式){
语句体
}
执行流程:
- 首先判断布尔表达式的值是true还是false
- 如果是true就执行语句体
- 如果是false就不执行语句体
选择结构if语句注意事项
- 关系表达式无论简单还是复杂,结果必须是boolean类型
- if语句控制的语句体如果是一条语句,大括号可以省略;如果是多条语句,则不能省略;建议永远不要省略
- if语句格式2(两个判断)
if(布尔表达式){
语句体1
}else{
语句体2
}
执行流程:
- 首先判断布尔表达式的值是true还是false
- 如果是true执行语句体1
- 如果是false执行语句体2
if语句的格式2和三元的相互转换
if(i>0){
i++;
}else{ //等同于 (i>0)?i++:i--(三元操作符)
i--;
}
注意
三元运算符是一个运算符,必须要求有一个结果返回。当if语句控制的语句体是一条输出语句时,不能作为一个返回结果
- if语句格式3(多个判断)
if语句的第三种格式:
if(布尔表达式1){
语句体1
}else if(布尔表达式2){
语句体2;
}
...
else{
语句体n+1;
}
执行流程:
- 首先判断布尔表达式1的结果
- 如果是true就执行语句体1
- 如果是false就继续判断布尔表达式2的结果
- 如果是true就执行语句体2
- 如果是false就继续判断布尔表达式…
- …
- 如果没有任何布尔表达式的值是true,就执行语句体n+1
练习:彩票->电脑随机产生1个两位数,提示用户输入一个两位数,若顺序匹配(完全匹配),中奖10000元,不按顺序匹配(数字匹配),中奖3000元,匹配1个数字,中奖1000元
/*
彩票
数据:
num1(随机两位数) num2(输入的两位数)
操作:
1.拆开两位数
2.判断
2.1 num1=num2(顺序匹配)
2.2 数字匹配(不按顺序)
2.3 匹配一个数字
*/
import java.util.Scanner;
class if1_0
{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
//用户输入一个两位数
System.out.print("Enter your lottery pick(two digits) :");
int num2=scanner.nextInt();
//电脑随机产生一个两位数
int num1=(int)(Math.random()*100);//(int)强制转换为int型
System.out.println("The lottery number is :"+num1);
//拆开随机数
int A=(num1)%10;
int B=(num1)/10;
//拆开用户输入的数
int a=(num2)%10;
int b=(num2)/10;
if(num1==num2){
System.out.println("you win 10000"); //情况1
}else if(a==B&&b==A){
System.out.println("you win 3000"); //情况2
}else if(a==A||a==B||b==A||b==B){
System.out.println("you win 1000"); //情况3
}else{
System.out.println("Sorry,you no win!!");
}
}
}
if语句常见错误
- 忘记必要的括号
- if行出现错误的分号 【 if(i>0); 错误】
- 布尔值的冗余测试
if(even == true){ //冗余
System.out.println("HALLO")
}
直接测试布尔变量更好
if(even){
System.out.println("HALLO")
}
- 悬空else出现歧义
int i=1,j=2,k=3;
if(i>j)
if(i>k)
System.out.println("A") ;
else//缩进表示与第一个if匹配,实际匹配第二个if
System.out.println("B") ;//同一个块中,else总是与离他最近的if相匹配
int i=1,j=2,k=3;
if(i>j){
if(i>k)
System.out.println("A") ;
}
else
System.out.println("B") ;//程序打印B
- 两个浮点数值的相等测试
浮点数具有有限的计算精度,可能引入取整错误,所以,浮点数的相等测试不可靠
//期望输出true
double x=1.0-0.1-0.1-0.1-0.1-0.1;
System.out.print(x==0.5);//实际输出false,x并不精确=0.5
3.3 switch选择结构
switch(表达式){
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
.......
default:
语句体n+1
break;
}
执行流程:
- 首先计算表达式的值
- 其次,和case依次比较,一旦有对象的值,就会执行相应的语句,在执行的过程中,遇到break就会结束。
- 最后,如果所有的case都和表达式的值不匹配,就会执行defalut语句体部分,然后switch执行完毕
练习:提示输入一个代表今天的数字0 1 2 3 4 5 6(星期天,星期一,星期二…),输入一个天数,计算这些天过后是星期几?
/*
数据:
today,days,future
操作:
1. 输入today(星期)
2. 输入days(增加的天数)
3. 计算future是星期几
future=(today+days)%7
*/
import java.util.Scanner;
class if3_3
{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
//输入today(星期)
System.out.print("Enter today's day:");
int today=scanner.nextInt();
//输入days(增加的天数)
System.out.print("Enter the number of days elapsed since today:");
int days=scanner.nextInt();
//转换today的0 1 2 3 4 5 6为星期
String a="";
switch(today){
case 0:
a="Sunday";
break;//不可省略,结果为0,则a赋值Sunday,跳出判断
case 1:
a="Monday";
break;
case 2:
a="Tuesday";
break;
case 3:
a="Wednesday";
break;
case 4:
a="Thursday";
break;
case 5:
a="Friday";
break;
case 6:
a="Saturday";
break;
}
//计算future
int future=(today+days)%7;
//转换future的0 1 2 3 4 5 6为星期
String b="";
switch(future){
case 0:
b="Sunday";
break;
case 1:
b="Monday";
break;
case 2:
b="Tuesday";
break;
case 3:
b="Wednesday";
break;
case 4:
b="Thursday";
break;
case 5:
b="Friday";
break;
case 6:
b="Saturday";
break;
}
System.out.printf("Today is %s and future day is %s",a,b);
}
}
- case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的
- default不建议省略
- break省略不结束当前语句
- switvh语句结束的条件,break或者执行到末尾
3.4 操作符的优先级和结合规则
- 首先计算括号中的表达式
- 在有括号嵌套的情况下,先计算内层括号中的表达式
- 在无括号情况下,按操作符优先级顺序计算
赋值运算符=为右结合,除此之外,所有二元运算符左结合