文章目录
前言
为什么要学选择结构?在现实生活中, 我们经常要在干什么事情之前做 “先要进行判断,能不能,满足一定条件”, 然后才能决定 是否 去执行。
- 例如,生活中的一些场景:
- 过斑马线,看红绿灯。
- 一个数能被2整数,那么这个数就是偶数。
- 到图书馆去借书,就必须要有借书证,并且借书证不能过期,这两个条件却一不可。
程序设计也是如此,需要有流程控制语言,实现与用户的交流,并根据用户的输入决定程序要“做什么”,“怎么做” 等。这就是我们生活中的条件判断,在我们流程控制中可以使用 选择结构,通常和 逻辑运算符 一起使用!
1. If 选择结构
- 程序执行的顺序结构,固然能解决计算,输出问题,但是遇见判断在选择问题就无法解决,所以“技术来源于生活”,我们需要条件语句。
1.1. 单分支结构 if
-
简单的 if 条件语法结构:
if(条件判断){ 执行代码块; }
-
if
是关键字,括号()里是判断条件,括号里返回的类型是boolean值。
public class Demo {
public static void main(String[] args) {
// 声明两个变量值
int x = 90;
int y = 100;
// 单分支if
if (x>y){
System.out.println("x的值大于y值");
}
System.out.println("y值大于x的值");
}
}
-
输出结果:
y值大于x的值
- 需求说明: 小明考试成绩,如果,数学成绩大于等于80分或者语文成绩大于70分奖励一个游戏皮肤。
- 提示:还记得 逻辑运算符 么?
1.2. 多分支结构 if…else
-
if... else
语句是条件语句中最常用的一种形式,它会针对某种条件有选择地作出处理。- 例如,生活中,考过90分奖励女朋友一个,反之打扫家务。
if(条件判断){ 执行代码块1; }else{ 执行代码块2; }
-
if...else
结构使用注意:else
不能单独使用,必须和if
一起使用。else
可有可无,根据具体情况。else
语句跟if
语句是互斥的,只能执行一种。
public class Demo { public static void main(String[] args) { System.out.println("请输入考试成绩:"); double score = new Scanner(System.in).nextDouble(); if (score>=90){ System.out.println("奖励女朋友一个"); }else{ System.out.println("打扫家务一年"); } } }
- 输出结果:
请输入考试成绩:
91
奖励女朋友一个
- 需求说明: 张楚岚的Java成绩大于98分,而且音乐成绩大于80分,老师会奖励他;或者Java成绩等于100分,音乐成绩大于70分,老师也会奖励他。
- 提示,注意满足要求条件!
1.3 嵌套分支结构
嵌套分支结构相当于针对某一事件的多种情况进行处理。通常表现为“如果满足某种条件,就进行某种处理,否则如果满足另一种条件则执行另一种处理” 有两种形式。
1.3.1. if…else 中嵌套 if… else
-
语法结构:
if(条件判断){ if(条件判断){ 执行代码; }else{ 执行代码; } }else{ 执行代码; }
-
案例需求说明如下:
- 去洗浴中心洗澡,要求买票之后才能进入, 否则,提示请买票,如果买票,男生进入男宾,女生进入女宾。
- 提示, 占时需要将汉字用数字来代替:
int ticket 是否购票 1为 购票 0 为未购票。
int sex 1为男生 2 为女生。
import java.util.Scanner; public class Demo02 { public static void main(String[] args) { // 假设声明2个阈值 // int类型记录是否买票 1 购票 0 没有购票 // int类型一个记录男女 1:男 2:女 System.out.println("请输入是否购票 1购票 0 未购票:" ); int ticket = new Scanner(System.in).nextInt(); int sex; //if 嵌套判断 if (ticket==1){ //买了票,提示输入男女 System.out.println("请输入性别 1(男) 2(女):"); sex = new Scanner(System.in).nextInt(); if (sex==1){ System.out.println("男宾一位,请上二楼!"); }else{ System.out.println("女宾一位,里面请!"); } }else{ System.out.println("请购票,才能进入!谢谢合作"); } } }
-
输出结果:
请输入是否购票 1购票 0 未购票: 1 请输入性别 1(男) 2(女): 1 男宾一位,请上二楼!
1.3.2 多重if结构 if…else if…else
- 语法结构:
if(条件判断){ 执行语句; }else if(条件判断){ 执行语句; }else if(条件判断){ 执行语句; }else{ 执行语句; }
- 案例需求说明如下:
- 有些情况是简单的
if
解决不了的,会出现问题,比如,分段计算。
- 有些情况是简单的
public class Demo02 {
public static void main(String[] args) {
/*
针对于,分段成绩使用,多重if选择结构解决问题
*/
System.out.println("请输入您的成绩: ");
int score = new Scanner(System.in).nextInt();
if (score>=0&&score<60){
System.out.println("成绩未通过");
}else if (score>=60&&score<=70){
System.out.println("成绩良好");
}else if (score>=80&&score<=100){
System.out.println("成绩优秀");
}else{
System.out.println("请正确输入您的成绩");
}
}
}
-
多重if 嵌套,需求说明如下:
- 学校运动会,挑选赛,男女混跑,跑进10秒进入晋级比赛, 未跑进,则淘汰。跑进10秒,男生进男生组,女生进女生组,输入错误则提示输入有误!
- 结合上下案例,提示疑问:
== 为啥不能不能比较汉字!
public class Demo03 { public static void main(String[] args) { System.out.println("请输入跑步成绩: "); int seconds = new Scanner(System.in).nextInt(); if (seconds<=10){ /* 跑进比赛,然后进行分配比赛组 疑问,为什么sex ==会报错! */ System.out.println("恭喜你进入决赛圈,请输入性别:"); String sex = new Scanner(System.in).next(); if (sex=="男"){ //为什么 == 不可以! System.out.println("进男生比赛组"); }else if (sex=="女"){ System.out.println("进女生比赛组"); }else{ System.out.println("输入有误,请重新输入!"); } }else { System.out.println("再接再厉,继续加油!"); } } }
1.4 课堂练习
1.4.1 练习:计算考试奖励
- 需求:如果小明考试完成,无论成绩多少,奖励50元,但是,如果考了100分满分,触发了额外奖励机制,多奖励200元。
- 请使用
if
单分支结构完成。
- 请使用
public class Demo01{
public static void main(String[] args) {
System.out.println("请输入你的考试成绩:");
float score = new Scanner(System.in).nextInt();//分数类型 double int float 都行。
int cash = 50; //100分以下只给50元。
//触发了额外的条件。考100多给200元。
if(score==100f){
cash+=200;
}
System.out.println("到手金额:"+cash);
}
}
1.4.2 练习:计算会员折扣
- 需求:商场会根据,会员购物积分不同,享受不同折扣,折扣如下:
x<2000
打9折2000<= x <4000
打8折4000<= x < 8000
打7折x>=8000
打6折- 注意:上述为数学写法!!!!
public class Demo04 {
public static void main(String[] args) {
System.out.println("请输入消费积分:");
double score = new Scanner(System.in).nextDouble();
//声明一个折扣
double discont;
if (score>=8000){
discont = 0.6;
}else if (score>=4000){
discont = 0.7;
}else if (score>=2000){
discont=0.8;
}else{
discont=0.9;
}
System.out.println("商品折扣为"+discont);
}
}
输出结果:
请输入消费金额:
5222
商品折扣为0.7
1.4.3 练习:购物结算
- 商场做促销,买东西打折。会员和非会员有所不同;
- 非会员,购物消费超过100打,9折;
- 会员,,商场会员正常打8折 ,并且会员购物满200元,打7.5折;
public class Demo05 {
public static void main(String[] args) {
// 判断是不是会员
System.out.println("请问您是会员么?y或者n");
String answer = new Scanner(System.in).next();
System.out.println("请输入您的消费金额: ");
double cash = new Scanner(System.in).nextDouble();
if (answer.equals("n")){
if (cash>=100){
System.out.println("您的消费满100打九折,实际付款"+cash*0.9);
}else{
System.out.println("消费未满100,不打折,实付金额"+cash);
}
}else{
if (cash>=200){
System.out.println("您是会员消费满200打7.9折,实付金额"+cash*0.79);
}else{
System.out.println("您是会员,消费未满200,打8折,实付金额"+cash*0.8);
}
}
}
}
输出结果:
请问您是会员么?y或者n
y
请输入您的消费金额:
220
您是会员消费满200打7.9折,实付金额173.8
1.5 If 总结
- 基本的
if
结构:- 可以处理单个或者组合条件的情况.
if-else
结构:- 可以处理简单2个的条件分支情况
多重 if
结构:- 可以处理连续区间的条件分支情况.
嵌套if
结构:- 可以 处理复杂 的条件分支情况.
2. switch 选择结构
if
选择结构已经几乎可以处理所有的选择场景了,单 为什么 还要在学一个switch选择结构?
2.1. switch 结构
-
switch又叫 等值判断,其语法结构如下:
switch(表达式){ case 常量 1: 执行代码; break; case 常量 2: 执行代码; break; ...//可以有很多个case default: 执行代码; break; }
-
语法
switch
结构,注意事项:switch
里的表达式可以是byte ,short ,int , char 和 Strting(jdk,7之后支持);
- 一个
switch
后面可以有 多个case,且每个case 顺序可以改变,但是每个case 后面只能是固定的 常量值,且不允许重复; - default 表示 默认情况, 类似于
else
可以有也可以没有。
-
练习
switch
结构的使用;- 手机打电话,根据不同的数字按键可以预设自己拨号,如:长按 1,自动拨号给预先设定人员。
public class Switch_Test { public static void main(String[] args) { System.out.println("请长按拨号键:"); int num = new Scanner(System.in).nextInt(); //switch 语法结构的使用 switch (num){ case 1: System.out.println("拨号给刘德华"); break; case 2: System.out.println("拨号给张学友"); break; case 3: System.out.println("拨号给郭富城"); break; case 4: System.out.println("拨号给黎明"); break; default: //default 相当于 if--esle中的 else System.out.println("输入按键有误,请从新输入"); break; } } }
-
输出结果:
请长按拨号键: 1 拨号给刘德华
2.2 switch 的穿透性
- 例如:输入月份就可以查询该月有多少天,1、3、5、7、8、10、12月份是31天,2月28天,4、6、9、11月份是30天。
- 思考一:case
后面没有break
,会发生什么?
- 思考二:default
的顺序可以改变么?
public class Switch_Test2 {
public static void main(String[] args) {
System.out.println("请输入要查询的月份: ");
String month = new Scanner(System.in).next();//jdk 1.7 之后支持String类型
//switch 语法结构的使用
switch (month){
case "一月":
System.out.println(month+"有31天");
break;
case "二月":
System.out.println(month+"有28天");
break;
case "三月":
System.out.println(month+"有31天");
break;
case "四月":
System.out.println(month+"有30天");
break;
case "五月":
System.out.println(month+"有31天");
break;
case "六月":
System.out.println(month+"有30天");
break;
case "七月":
System.out.println(month+"有31天");
break;
case "八月":
System.out.println(month+"有31天");
break;
case "九月":
System.out.println(month+"有30天");
break;
case "十月":
System.out.println(month+"有31天");
break;
case "十一月":
System.out.println(month+"有30天");
break;
case "十二月":
System.out.println(month+"有31天");
break;
default:
System.out.println("请输入正确月份");
break;
}
}
}
- 思考一个问题:给15分钟时间 什么原因产生的穿透性? 能结合穿透性修改上面案例么?
//TODO 怎么结合穿透性,修改上面查询月份案例!做到简化代码
... ...
3. switch 和if 混合练习
3.1 商场商品换购
- 需求如下:消费大于0元以上才有提示:
- 商场消费,
选择1 消费满50,加5元,送纪念卡一张。
选择2 消费满100,加10元,送vip会员一年。
选择 0 不换购
最后告诉消费金额。
public class IfandSwitch {
public static void main(String[] args) {
//提示消费信息,并键盘接收
System.out.println("请输入您的消费金额:");
Scanner input = new Scanner(System.in);
double money = input.nextDouble();
int cash=0; //初始化额外换购金额
if (money > 0) {
System.out.println("是否参加优惠活动:");
System.out.println("选择1 消费满50加5元送纪念卡一张");
System.out.println("选择2 消费满100加10元送vip一张");
System.out.println("选择0 不换购");
int num = input.nextInt(); //选择数字
// switch 语法结构:
switch (num) {
case 1:
if (money >= 50) {
//如果满足条件 才可以换购
cash = 5;
System.out.println("加5元换购纪念卡一张");
} else {
System.out.println("消费未满50,还差"+(50-money));
}
break;
case 2:
if (money >= 100) {
//如果满足条件 才可以换购
cash = 10;
System.out.println("加10元换购VIP一张");
} else {
System.out.println("消费未满100,还差"+(100-money));
}
break;
case 0:
System.out.println("可以在逛一逛看看");
break;
default:
System.out.println("请正确输入换购选择");
break;
}
} else {
System.out.println("有优惠活动进来看看呗!");
}
System.out.println("您一共消费的金额是"+(money+cash)); //输出结果
}
}
输出结果:
请输入您的消费金额:
500
是否参加优惠活动:
选择1 消费满50加5元送纪念卡一张
选择2 消费满100加10元送vip一张
选择0 不换购
2
加10元换购VIP一张
您一共消费的金额是510.0