程序控制结构

0x01 流程控制介绍

​ 流程控制分为顺序结构、分支结构、循环结构三种类型。if适合做区间匹配,switch适合做值匹配。知道循环几次用for,不知道则用while。跳转语句有break(结束当前所在的循环或者switch分支)和continue(跳过本次循环,进入下一次循环)。

image-20230708104617775

0x02 顺序结构

​ 程序默认的执行流程,代码从上往下执行。

0x03 分支结构

1、if分支

if分支根据判定的结果(真或假)决定执行某个分支的代码,If分支有如下3种格式

image-20230708112200397

下面分别演示其3种格式的if分支

image-20230708112218726

public class IfDemo1 {
    public static void main(String[] args) {
        double t = 38.9;
        if (t > 37) {
            System.out.println("这个人温度异常,把他赶紧带走");
        }
    }
}

image-20230708112227964

public class IfDemo2 {
    public static void main(String[] args) {
        double money = 99;
        if (money > 90) {
            System.out.println("发红包成功了");
        } else {
            System.out.println("余额不足");
        }
    }
}

image-20230708112251345

public class IfDemo3 {
    public static void main(String[] args) {
        int score = 78;
        if (score >= 0 && score < 60) {
            System.out.println("您的绩效成绩为: D");
        } else if (score >= 60 && score < 80) {
            System.out.println("您的绩效成绩为: C");
        } else if (score >= 80 && score < 90) {
            System.out.println("您的绩效成绩为: B");
        } else if (score >= 90 && score < 100) {
            System.out.println("您的绩效成绩为: A");
        } else {
            System.out.println("您录入的分数不正确");
        }
    }
}

2、switch分支

switch分支也是匹配条件去执行分支, 适合做值匹配的分支选择,结构清晰,格式良好

image-20230708200640760

public class SwitchDemo {
    public static void main(String[] args) {
        String week = "周六";
        switch (week) {
            case "周一":
                System.out.println("埋头苦干,解决bug");
                break;
            case "周二":
                System.out.println("请求大牛程序员帮忙");
                break;
            case "周三":
                System.out.println("今晚啤酒、龙虾、小烧烤");
                break;
            case "周四":
                System.out.println("主动帮助新来的女程序解决bug");
                break;
            case "周五":
                System.out.println("今晚吃鸡");
                break;
            case "周六":
                System.out.println("与王婆介绍的小芳相亲");
                break;
            case "周日":
                System.out.println("郁郁寡欢、准备上班。");
                break;
            default:
                System.out.println("您输入的星期信息肯定是不存在的~~");
        }
    }
}

switch分支的注意事项:

表达式类型只能是byte、short、int、char,JDK5开始支持枚举,JDK7开始支持String、不支持double、float、long。

case给出的值不允许重复,且只能是字面量,不能是变量。

不要忘记写break,否则会出现穿透现象。

image-20230708124815895


3、小总

1)if、switch分支各自适合做什么业务场景?

if其实在功能上远远强大于switch。if适合做区间匹配。switch适合做:值匹配的分支选择、代码优雅。

2)什么情况下会出现switch穿透现象?

case中没有写break。

3)switch穿透性能解决什么问题?

存在多个case分支的功能代码是一样时,可以用穿透性把流程集中到同一处处理,这样可以简化代码。

0x04 循环结构

1、for循环

image-20230708195539304

示例执行的流程:
循环一开始,执行int i = 0 一次。
然后判断循环条件:0 < 3 返回true ,进入到循环体中执行输出 :helloWorld ,然后执行迭代语句i++ , 此时i=1了。
然后判断循环条件:1 < 3 返回true ,进入到循环体中执行输出 :helloWorld ,然后执行迭代语句i++ , 此时i=2了。
然后判断循环条件:2 < 3 返回true ,进入到循环体中执行输出 :helloWorld, 然后执行迭代语句i++ , 此时i=3了。
然后判断循环条件:3 < 3 返回false, 循环立即结束!!

2、while循环

image-20230708195612944

3、do-while循环

image-20230708180342509

do-while循环的特点就是先执行后判断,一定会先执行一次循环体

4、三种循环的区别小结

for循环 和 while循环(先判断后执行)

do...while (第一次先执行后判断)

for循环和while循环的执行流程是一模一样的。如果已知循环次数建议使用for循环,如果不清楚要循环多少次建议使用while循环。

for循环中,控制循环的变量只在循环中可以使用。While循环中,控制循环的变量在循环后还可以继续使用。

5、死循环

​ 死循环:一直循环的执行下去,如果没有干预不会停止下来。

//死循环第一种写法
public class EndLessLoopDemo1 {
    public static void main(String[] args) {
        for (; ; ) {
            System.out.println("Hello World");
        }
    }
}
//死循环第二种写法,经典写法,建议用此方法比较规范
public class EndLessLoopDemo2 {
    public static void main(String[] args) {
        while (true) {
            System.out.println("Hello World");
        }
    }
}
//死循环第三种写法
public class EndLessLoopDemo3 {
    public static void main(String[] args) {
        do {
            System.out.println("Hello World");
        }
        while (true);
    }
}

案例需求:系统密码是520,请用户不断的输入密码验证,验证不对输出:密码错误,验证成功输出:欢迎进入系统,并停止程序。

//定义一个整型变量记录正确的密码:520
//使用while死循环,让用户不断输入数据,与正确密码比对:验证不成功输出:密码错误、验证成功输出:欢迎进入系统,并使用break结束当前循环的执行。

6、循环嵌套

循环嵌套:循环中又包含循环,外部循环每循环一次,内部循环全部执行完一次。

//假如你有老婆,你犯了错,你老婆罚你连续3天,每天说5句我爱你
public class LoopNestedDemo {
    public static void main(String[] args) {
        for (int i = 1; i <= 3; i++) {
            for (int j = 1; j <= 5; j++) {
                System.out.println("我爱你" + i);
            }
            System.out.println("----------------------");
        }
    }
}

案例需求:在控制台使用 * 打印出4行5列的矩形

public class LoopNestedDemo {
    public static void main(String[] args) {
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 5; j++) {
                System.out.print("*");  //不换行
            }
            System.out.println();  //换行
        }
    }
}

0x05 跳转关键字

1、break

break跳出并结束当前所在循环并执行,只能用于结束所在循环, 或者结束所在switch分支的执行。

public class BreakAndContinueDemo10 {
    public static void main(String[] args) {
        // 目标:理解break 和 continue的作用。
        // 场景:假如你又有老婆了,然后你犯错了,你老婆罚你做5天家务,每天都是洗碗。
        // 但是洗碗到第三天后心软了 原谅你了不用洗了
        for (int i = 0; i < 5; i++) {
            System.out.println("快乐的洗碗~~~~");
            if(i == 2) {
                break; // 跳出并结束当前循环的执行~~
            }
        }

        // continue 跳出当前循环的当次执行,进入循环的下一次
        // 场景:假如你又有老婆了,然后你犯错了,你老婆罚你做5天家务,
        // 每天都是洗碗。但是洗碗到第三天后心软了 原谅你了不用洗了 但是依然不解恨 继续洗第4天 5天
        for (int i = 1; i <= 5 ; i++) {
            if(i == 3){
                continue; // 立即跳出当次执行,进入循环的下一次!
            }
            System.out.println("洗碗:" + i);
        }

2、continue

用于跳出当前循环的当次执行,进入下一次循环,只能在循环中进行使用。

public class BreakAndContinueDemo11 {
    public static void main(String[] args) {
        // 目标:理解break和continue操作外部循环。
        // 场景:假如你有老婆,你老婆罚你说3天,每天5句我爱你,但是说到第二天的第3句就心软了,以后都不用说了!
        OUT:
        for (int i = 1; i <= 3; i++) {
            for (int j = 1; j <= 5; j++) {
                System.out.println("我爱你~~");
                if(i == 2 && j == 3){
                    break OUT; // 指定跳出外部循环,并结束外部循环了!
                }
            }
            System.out.println("-----------------");
        }

        System.out.println("====================================================");
        // continue可以指定结束外部循环的当次执行,进入外部循环的下一次执行
        // 场景:假如你有老婆,你老婆罚你说3天,每天5句我爱你,但是说到第二天的第3句就心软了,当天
        // 不用说了,但是依然不解恨,第3天还是要说的。
        OUT:
        for (int i = 1; i <= 3; i++) {
            for (int j = 1; j <= 5; j++) {
                System.out.println("我爱你~~");
                if(i == 2 && j == 3){
                    continue OUT;
                }
            }
            System.out.println("-----------------");
        }
    }
}

3、random的使用

import java.util.Random;

public class RandomDemo1 {
    public static void main(String[] args) {
        // 目标:学会使用Java提供的随机数类Random
        // 1、导包
        // 2、创建随机数对象
        Random r = new Random();

        // 3、调用nextInt功能(方法)可以返回一个整型的随机数给你
        for (int i = 0; i < 20; i++) {
            int data = r.nextInt(10); // 0 - 9 不包含10的(包前不包后)
            System.out.println(data);
        }

        System.out.println("-----------------------");
        // 1 - 10 ==> -1 ==> (0 - 9) + 1
        int data = r.nextInt(10) + 1;
        System.out.println(data);

        // 3 - 17 ==> -3 ==> (0 - 14) + 3
        int data1 = r.nextInt(15) + 3;
        System.out.println(data1);
    }
}

案例需求:Random随机数如何生成 65 – 91之间的随机数

65 – 91  => (0 - 26)+ 65
int number = r.nextInt(27) + 65;

//random自带功能

案例需求:随机生成一个1-100之间的数据,提示用户猜测,猜大提示过大,猜小提示过小,直到猜中结束游戏

import java.util.Random;
import java.util.Scanner;

public class RamdomTest2 {
    public static void main(String[] args) {
        // 1、随机一个幸运号码 1- 100之间  (0 - 99) + 1
        Random r = new Random();
        int luckNumber = r.nextInt(100) + 1;

        // 2、使用一个死循环让用户不断的去猜测,并给出提示
        Scanner sc = new Scanner(System.in);
        while (true) {
            // 让用户输入数据猜测
            System.out.println("请您输入猜测的数据(1-100):");
            int guessNumber = sc.nextInt();

            // 3、判断这个猜测的号码与幸运号码的大小情况
            if(guessNumber > luckNumber){
                System.out.println("您猜测的数据过大~");
            }else if(guessNumber < luckNumber){
                System.out.println("您猜测的数据过小");
            }else {
                System.out.println("恭喜您,猜中了,可以去买单了~~~");
                break; // 直接跳出并结束当前死循环!!
            }
        }
    }
}
posted @ 2023-07-09 21:56  charonlight  阅读(43)  评论(0编辑  收藏  举报