第三章 选择语句
3.1 比较运算符
- 大于 >
- 大于等于 >=
- 小于 <
- 小于等于 <=
- 等与 ==
- 不等于 !=
3.2逻辑运算符
- 单与 &
- 双与&&
- 或 |
- 双或 ||
- 非 !
- 异或 ^
3.3 if语句
- 单if
- if-else分支
- 多if-else嵌套
- 多if-else
- 示例:计算身体质量指数
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
//1.获取身高和体重
System.out.print("Please enter your weight and hight:");
double weight=scanner.nextDouble();
double hight=scanner.nextDouble();
//2.BMI=体重/身高^2
double BMI=weight/hight/hight;
//3.将BMI进行判断,输出相应的说明
if(BMI>=30.0){
System.out.println("过胖");
}else if(BMI>=25.0){
System.out.println("超重");
}else if(BMI>=18.5){
System.out.println("正常");
}else{
System.out.println("偏瘦");
}
}
}
- 示例:判断闰年
import java.util.Scanner;
public class haha {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner sc=new Scanner(System.in);
System.out.println("请输入年份");
int year=sc.nextInt();
if(year%4==0&&year%100!=0||year%400==0) {
System.out.println("闰年");
}else {
System.out.println("土年");
}
}
}
- 示例:彩票
import java.util.Scanner;
public class haha {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner sc=new Scanner(System.in);
int random=(int)(Math.random()*100);//假设为 28
//System.out.println(random);
System.out.println("请输入一个数字!");
int num=sc.nextInt();
System.out.println("电脑产生的数字是"+random);
//输入 17
//定义a1为输入的个位数字 b1位十位数字
//定义a2为随机产生的个位数字 b2为十位数字
/*
* if(a1==a2&&b1==b2) 10000
* if(a1==b2&&b1==a2) 3000
* if(a1==a2||a1==b2||b1==a2||b1==b2)
*/
int a1=num%10;
num/=10;
int b1=num%10;
int a2=random%10;
random/=10;
int b2=random%10;
if(a1==a2&&b1==b2) {
System.out.println("一等奖10000元!");
}else if(a1==b2&&b1==a2){
System.out.println("二等奖3000元!");
}else if(a1==b2||a2==b1||a2==a1||b1==b2){
System.out.println("三等奖1000元");
}else {
System.out.println("拜拜!");
}
}
}
3.4 switch语句
- switch
- 不带case的switch
- switch语句遵循下面的规则:
3.5 条件表达式
- 布尔表达式
3.6常见错误和陷阱
- 忘记必要的括号
- 在if行出现的分号
- 对布尔值得冗余测试
- 悬空else出现的歧义
- 两个浮点值的相等测试
- 简化布尔变量赋值
- 避免不同情形中的重复代码
本章小结
- boolean类型变量可以存储值true或者false
- 关系操作符(<,<=,==,!=,>,>=)产生一个布尔值。
- 选择语句用于可选择的动作路径的编程。选择语句有以下几种类型:单分支if语句、双分支if-else语句、嵌套if语句、多分支if-else语句、switch语句和条件表达式。
- 各种if语句都是基于布尔表达式来控制决定。根据表达式的值时true或false,这些语句选择两种可能中的一种。
- 布尔操作符&&、||、!和^对布尔值和布尔变量进行计算。
- 当对p1&&p2求值时,java先求p1的值,如果p1为true,再对p2求值。如果p1为false,就不再对p2求值。当对p1||p2求值时,先对p1求值,如果p1为false,再对p2求值,如果p1位true就不再对p2求值。
- switch语句根据char、byte、int、short或者String类型的Switch来进行控制决定。
- 在switch语句中,关键字break是可选的,但它通常在每个分支的结尾,以中止switch的语句的剩余部分。如果没有出现break语句,则执行接下来的case语句。
- 表达式中的操作符按照括号、操作符优先级以及操作符结合规则所确定的次序进行求值。
- 括号用于强制求值的顺序以任何顺序进行。
- 具有更高级优先权的操作符更早的进行操作。对于同样优先级的操作符,它们的结合规则确定操作的顺序。
- 除了赋值运算符的所有二元操作符都是左结合的,赋值运算符号是右结合的。
编程练习题
import java.util.Scanner;
public class haha {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner sc=new Scanner(System.in);
System.out.println("请输入a、b、c的值");
double a=sc.nextDouble();
double b=sc.nextDouble();
double c=sc.nextDouble();
double delt=b*b-4*a*c;
if(delt>=0) {
if(delt>0) {
System.out.println("有两个解");
System.out.println((-b+Math.sqrt(delt))/2*a+"和"+(-b-Math.sqrt(delt))/2*a);
}else {
System.out.println(-b/2*a);
}
}else {
System.out.println("无解");
}
}
}
import java.util.Scanner;
public class haha {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner sc = new Scanner(System.in);
System.out.println("请输入代表今天日期的数字");
int today = sc.nextInt();
System.out.println("请输入今天之后的天数");
int sinceday = sc.nextInt();
int willday = (today + sinceday) % 7;
switch (willday) {
case 0:
System.out.println("周日");
break;
case 1:
System.out.println("周一");
break;
case 2:
System.out.println("周二");
break;
case 3:
System.out.println("周三");
break;
case 4:
System.out.println("周四");
break;
case 5:
System.out.println("周五");
break;
case 6:
System.out.println("周六");
break;
default:
break;
}
}
}
import java.util.Scanner;
public class haha {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner sc = new Scanner(System.in);
int random = (int) (Math.random() * 3);
System.out.println("电脑产生的是" + random);
System.out.println("请输入0、1或者2");// 依次代表石头、剪刀、布
int in = sc.nextInt();
if (in == 0) {
if (random == 0) {
System.out.println("平局");
} else if (random == 1) {
System.out.println("玩家赢");
} else {
System.out.println("电脑赢");
}
}
if (in == 1) {
if (random == 1) {
System.out.println("平局");
} else if (random == 2) {
System.out.println("玩家赢");
} else {
System.out.println("电脑赢");
}
}
if (in == 2) {
if (random == 2) {
System.out.println("平局");
} else if (random == 1) {
System.out.println("玩家赢");
} else {
System.out.println("电脑赢");
}
}
}
}
- 提示:一月和二月在这个公式里是用13和14表示的。所以需要将用户输入的月份1转换为13,将用户输入的2转换为14,同时年份改为前一年。
import java.util.Scanner;
public class haha {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner scanner=new Scanner(System.in);
//1.获取 年份 月 日
System.out.print("Enter year:");
int year=scanner.nextInt();
System.out.print("Enter month:");
int month=scanner.nextInt();
System.out.print("Enter the day of the month:");
int day=scanner.nextInt();
//隐含计算 j 世纪数 k该世纪的第几年
if(month==1||month==2){
month+=12;
year--;
}
int j=year/100;
int k=year%100;
int h=(day+26*(month+1)/10+k+k/4+j/4+5*j)%7;
System.out.println(h);
switch (h) {
case 0:
System.out.println("星期六");
break;
case 1:
System.out.println("星期天");
break;
case 2:
System.out.println("星期一");
break;
case 3:
System.out.println("星期二");
break;
case 4:
System.out.println("星期三");
break;
case 5:
System.out.println("星期四");
break;
case 6:
System.out.println("星期五");
break;
default:
break;
}
}
}
import java.util.Scanner;
public class haha {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner sc = new Scanner(System.in);
System.out.println("请输入这个点的x坐标");
double x = sc.nextDouble();
System.out.println("请输入这个点的x坐标");
double y = sc.nextDouble();
if (x <= 200 && x >= 0) {
if ((200 - x) / y >= 2) {
System.out.println("点在三角形里面");
return;
} else {
System.out.println("点在三角形外面");
}
}
}
}
- 思路
import java.util.Scanner;
public class Demo4_3 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner sc=new Scanner(System.in);
System.out.println("请输入第一个矩形的中心点坐标和宽高");
double x1=sc.nextDouble();
double y1=sc.nextDouble();
double w1=sc.nextDouble();
double h1=sc.nextDouble();
System.out.println("请输入第二个矩形的中心点坐标和宽高");
double x2=sc.nextDouble();
double y2=sc.nextDouble();
double w2=sc.nextDouble();
double h2=sc.nextDouble();
if(x2<=(w1/2-w2/2)+x1&&x2>=x1-(w1/2-w2/2)&&y2<=(h1/2-h2/2)+y1&&y2>=y1-(h1/2-h2/2)) {
System.out.println("第二个在第一个内");
}else if(x2>=(w1/2+w2/2)+x1||x2<=(x1-w1/2-w2/2)||y2>=(h1/2+h2/2)+y1||y2<=(y1-w1/2-w2/2)) {
System.out.println("第二个在第一个外");
}else {
System.out.println("重叠");
}
}
}