3.if选择语句

程序可以基于条件决定执行那些语句

3.1 boolean数据类型

(boolean 数据类型声明一个具有值truefalse的变量)

  • 比较两个值的大小,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(布尔表达式){
语句体
}

执行流程

  1. 首先判断布尔表达式的值是true还是false
  2. 如果是true就执行语句体
  3. 如果是false就不执行语句体
    在这里插入图片描述
    选择结构if语句注意事项
  • 关系表达式无论简单还是复杂,结果必须是boolean类型

  • if语句控制的语句体如果是一条语句,大括号可以省略;如果是多条语句,则不能省略;建议永远不要省略

  • if语句格式2(两个判断)

if(布尔表达式){
语句体1
}else{
语句体2
}

执行流程

  1. 首先判断布尔表达式的值是true还是false
  2. 如果是true执行语句体1
  3. 如果是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. 首先判断布尔表达式1的结果
  2. 如果是true就执行语句体1
  3. 如果是false就继续判断布尔表达式2的结果
  4. 如果是true就执行语句体2
  5. 如果是false就继续判断布尔表达式…
  6. 如果没有任何布尔表达式的值是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(表达式){
case1:
语句体1;
break;
case2:
语句体2;
break;
.......
default:
语句体n+1
break;
}

执行流程

  1. 首先计算表达式的值
  2. 其次,和case依次比较,一旦有对象的值,就会执行相应的语句,在执行的过程中,遇到break就会结束。
  3. 最后,如果所有的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 操作符的优先级和结合规则

  • 首先计算括号中的表达式
  • 在有括号嵌套的情况下,先计算内层括号中的表达式
  • 在无括号情况下,按操作符优先级顺序计算
    在这里插入图片描述
    赋值运算符=为右结合,除此之外,所有二元运算符左结合
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值