Java入门 第五节 流程控制(一)

前言

 为什么要学选择结构?在现实生活中, 我们经常要在干什么事情之前做 “先要进行判断,能不能,满足一定条件”, 然后才能决定 是否 去执行。

  1. 例如,生活中的一些场景:
    • 过斑马线,看红绿灯。
    • 一个数能被2整数,那么这个数就是偶数。
    • 到图书馆去借书,就必须要有借书证,并且借书证不能过期,这两个条件却一不可。

  程序设计也是如此,需要有流程控制语言,实现与用户的交流,并根据用户的输入决定程序要“做什么”,“怎么做” 等。这就是我们生活中的条件判断,在我们流程控制中可以使用 选择结构,通常和 逻辑运算符 一起使用!

1. If 选择结构

  1. 程序执行的顺序结构,固然能解决计算,输出问题,但是遇见判断在选择问题就无法解决,所以“技术来源于生活”,我们需要条件语句。

1.1. 单分支结构 if

  1. 简单的 if 条件语法结构:

    	if(条件判断){
    		执行代码块;
    	}
    
  2. if 是关键字,括号()里是判断条件,括号里返回的类型是boolean值。

if执行流程图

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的值
    
  1. 需求说明: 小明考试成绩,如果,数学成绩大于等于80分或者语文成绩大于70分奖励一个游戏皮肤。
    • 提示:还记得 逻辑运算符 么?

1.2. 多分支结构 if…else

  1. if... else 语句是条件语句中最常用的一种形式,它会针对某种条件有选择地作出处理。

    • 例如,生活中,考过90分奖励女朋友一个,反之打扫家务。
    	if(条件判断){
    		执行代码块1;
    	}else{
    		执行代码块2;
    	}
    

if...else流程执行

  1. 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
	奖励女朋友一个
  1. 需求说明: 张楚岚的Java成绩大于98分,而且音乐成绩大于80分,老师会奖励他;或者Java成绩等于100分,音乐成绩大于70分,老师也会奖励他。
    • 提示,注意满足要求条件!

1.3 嵌套分支结构

 嵌套分支结构相当于针对某一事件的多种情况进行处理。通常表现为“如果满足某种条件,就进行某种处理,否则如果满足另一种条件则执行另一种处理” 有两种形式。

1.3.1. if…else 中嵌套 if… else

  1. 语法结构:

    	if(条件判断){
    		if(条件判断){
    			执行代码;
    		}else{
    			执行代码;
    		}
    	}else{
    		执行代码;
    	}
    
  2. 案例需求说明如下:

    • 去洗浴中心洗澡,要求买票之后才能进入, 否则,提示请买票,如果买票,男生进入男宾,女生进入女宾。
    • 提示, 占时需要将汉字用数字来代替: 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

  1. 语法结构:
    if(条件判断){
    	执行语句;
    }else if(条件判断){
    	执行语句;
    }else if(条件判断){
    	执行语句;
    }else{
    	执行语句;
    }
    
  2. 案例需求说明如下:
    • 有些情况是简单的 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("请正确输入您的成绩");
        }
    }
}

  1. 多重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 练习:计算考试奖励

  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 练习:计算会员折扣

  1. 需求:商场会根据,会员购物积分不同,享受不同折扣,折扣如下:
    • 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 练习:购物结算

  1. 商场做促销,买东西打折。会员和非会员有所不同;
    • 非会员,购物消费超过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
您是会员消费满2007.9折,实付金额173.8

1.5 If 总结

  1. 基本的if 结构:
    • 可以处理单个或者组合条件的情况.
  2. if-else 结构:
    • 可以处理简单2个的条件分支情况
  3. 多重 if 结构:
    • 可以处理连续区间的条件分支情况.
  4. 嵌套if 结构:
    • 可以 处理复杂 的条件分支情况.

2. switch 选择结构

  • if 选择结构已经几乎可以处理所有的选择场景了,单 为什么 还要在学一个switch选择结构?

2.1. switch 结构

  1. switch又叫 等值判断,其语法结构如下:

    	switch(表达式){
    		case 常量 1:	
    			执行代码;
    			break;
    		
    		case 常量 2:
    			执行代码;
    			break;
    	  
    		...//可以有很多个case 
    	
    	   default:
    			执行代码;
    			break;
    	}
    
  2. 语法 switch 结构,注意事项:

    • switch里的表达式可以是 byte ,short ,int , char 和 Strting(jdk,7之后支持);
    • 一个switch后面可以有 多个case,且每个case 顺序可以改变,但是每个case 后面只能是固定的 常量值,且不允许重复
    • default 表示 默认情况, 类似于 else 可以有也可以没有。
  3. 练习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. 例如:输入月份就可以查询该月有多少天,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;
        }
    }
}

  1. 思考一个问题:给15分钟时间 什么原因产生的穿透性? 能结合穿透性修改上面案例么?
//TODO 怎么结合穿透性,修改上面查询月份案例!做到简化代码
... ...

3. switch 和if 混合练习

3.1 商场商品换购

  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 消费满505元送纪念卡一张
选择2 消费满10010元送vip一张
选择0 不换购
210元换购VIP一张
您一共消费的金额是510.0
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴琼老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值