JAVA SE基础《四》---- 流程控制

发布时间 2023-07-10 09:32:40作者: 小王子C

目录

一、分支结构

  • if
  • switch
  • switch的注意事项
  • switch的穿透性

二、循环结构

  • for循环
  • while循环
  • do-while循环
  • 死循环
  • 循环嵌套

三、跳转关键字

  • break、continue

四、案例技术:随机数Random类

 

一、分支结构

1、if

If分支

  • 根据判定的结果(真或假)决定执行某个分支的代码

If分支的作用

 If分支有三种格式

if 第一种格式

 

 执行流程:

首先判断条件表达式的结果,如果为true执行语句体,为 false 就不执行语句体

注意事项:if语句中,如果大括号控制的只有一行代码,则大括号可以省略不写

if第二种格式

 执行流程:

首先判断条件表达式的结果,如果为true执行语句体1,为 false 就执行语句体2

if第三种格式

执行流程:

  1. 先判断条件1的值,如果为true则执行语句体1,分支结束;如果为false则判断条件2的值
  2. 如果值为true就执行语句体2,分支结束;如果为false则判断条件3的值
  3. ...
  4. 如果没有任何条件为true,就执行else分支的语句体n+1。

 

2、switch分支

switch分支

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

 

总结 

1、switch分支的格式、执行流程是怎么样的?

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

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

 

3、switch的注意事项

switch分支注意事项:

  1. 表达式类型只能是byte、short、int、char,JDK5开始支持枚举,JDK7开始支持String、不支持double、float、long
  2. case给出的值不允许重复,且只能是字面量,不能是变量。
  3. 不要忘记写break,否则会出现穿透现象。

 

4、switch穿透性的应用场景

switch的穿透性

  • 如果代码执行到没有写break的case块,执行完后将直接进入下一个case块执行代码(而且不会进行任何匹配),直到遇到break才跳出分支,这就是switch的穿透性。

 

总结

1、什么情况下会出现switch穿透现象?

  • case中没有写break。

2、switch穿透性能解决什么问题?

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

 

二、循环结构

1、for循环 

for 循环

控制一段代码反复执行很多次。

for 循环案例详细流程说明

// 输出3次HelloWorld
for (int i=0;i<3;i++){
        System.out.println("Hello World");
}

执行的流程:

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

总结

1、for循环格式和执行流程是什么样的?

 

案例1

需求:求1-5之间的数据和,并把求和结果在控制台输出。

分析:

int sum=0;
for(int i=1; i<=5; i++){
       sum += 1;
}
System.out.println(sum);

 

案例2

需求:求1-10之间的奇数和,并把求和结果在控制台输出。

分析

int sum=0;
for(int i=1; i<=10; i++){
       if(i%2 == 1){
           sum += i;
        }
}
System.out.println(sum);

 

案例3

需求:在控制台输出所有的“水仙花数”,水仙花数必须满足如下2个要求:

1、水仙花数是一个三位数

2、水仙花数的个位、十位、百位的数字立方和等于原数

分析:

1、定义一个for循环从“100一直到999”。

2、每次访问到数据后,提取该数据的:个位、十位、百位数字。

3、使用if判断:个位、十位、百位的数字立方和是否等于原数,等于则输出该数据。

class Demo{
    public static void main(String[] args){
        int count=0;   //初始化个数值
        for(int x=100;x<1000;x++){
            int a = x % 10;       //个位  % 整除取余
            int b = x / 10 % 10;    //十位
            int c = x / 10 / 10 % 10;   //百位
            //判断是否满足水仙花数的条件
            if(x == a*a*a+b*b*b+c*c*c){
                System.out.println(x); //打印输出水仙花数
                count++;    //统计水仙花数的个数
            }
        }
        System.out.println("水仙花数共有"+count+"个");
    }
}

 

2、while循环

while循环格式与执行流程

示例

 

总结

1、while循环的格式,执行流程是怎么样的?

 2、什么时候用for循环,什么时候用while循环?

  • 功能上是完全一样的,for能解决的while也能解决,反之亦然。
  • 使用规范是:知道循环几次:使用for;不知道循环几次建议使用:while。

案例

珠穆朗玛峰(世界最高峰8848.86米)

需求:世界最高山峰是珠穆朗玛峰(8848.86米=8848860毫米),假如我有一张足够大的纸,它的厚度是0.1毫米。请问,折叠多少次,可以折成珠穆朗玛峰的高度。

思路: 这种不清楚要循环多少次的情况可以选择用while实现。

double peakHeight = 8848860 ; // 山峰高度
double paperThickness = 0.1; //纸张厚度
int count = 0;
while (paperThickness < peakHeight){
        paperThickness *= 2;
        count ++;
}

 

总结

1、怎么解决此案例?

  • 定义变量存储珠穆朗玛峰的高度、纸张的高度。
  • 使用while循环,循环条件是(纸张厚度<山峰高度),内部控制纸张折叠,每折叠一次,纸张厚度为原来两倍,循环外定义计数变量,每折叠依次让该变量+1

2、for和while使用总结

  • 其实while能做的for都能实现
  • 但是如果一开始不知道循环次数的情况下,建议使用while循环解决更专业。

 

3、 do-while循环

do-while循环

  • 先执行再判断循环条件。

do-while循环的特点:一定会先执行一次循环体。

三种循环的区别小结

  • for循环 和 while循环(先判断后执行)
  • do...while (第一次先执行后判断)
  • for循环和while循环的执行流程是一模一样的。

  • 如果已知循环次数建议使用for循环,如果不清楚要循环多少次建议使用while循环。

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

4、死循环

死循环

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

写法

 案例

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

分析:

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

 

5、循环嵌套

循环嵌套

  • 循环中又包含循环

嵌套循环的特点

  • 外部循环每循环一次,内部循环全部执行完一次。

案例

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

for(int i = 1; i <= 4; i++) {
     System.out.println("*****");
}
for(int i = 1; i <= 4; i++) {
      for(int j = 1; j <= 5 ; j++){
         System.out.print("*");
     }
      System.out.println();
}

 

三、跳转关键字

1、break、continue

跳转控制语句介绍

  • break : 跳出并结束当前所在循环的执行。
  • continue: 用于跳出当前循环的当次执行,进入下一次循环。

注意事项:

  • break : 只能用于结束所在循环, 或者结束所在switch分支的执行。
  • continue : 只能在循环中进行使用。

 

四、案例技术:随机数Random类

1、Random的使用

Random随机数技术

  • 作用:用于在程序中获取随机数的技术。

得到0-9的随机数的实现步骤:

Random生成随机数的特点

  • nextInt(n)功能只能生成:0 – (n-1)之间的随机数。

Random生成区间随机数的技巧:减加法。

例如:要生成 1 – 10之间的随机数,程序怎么实现?

 总结

1、Random随机数类生成需要几步,具体是什么样的?

  • 导包:import java.util.Random;
  • Random r = new Random();
  • int number = r.nextInt(10);

2. Random随机数如何生成 65 – 91之间的随机数?

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

 

2、猜数字游戏

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

分析

  1. 随机生成一个1-100之间的数据
  2. 使用死循环让用户不断提示用户猜测,猜大提示过大,猜小提示过小,猜中结束游戏。
public class test {
    public static void main(String[] args) {
        // 1.随机产生一个1-100之间的数据,作为中奖号码
        Random r = new Random();
        int luckNumber = r.nextInt(100) +  1;

        // 2.定义一个死循环,让用户不断地猜测数据
        Scanner sc = new Scanner(System.in);
        while(true){
            // 提示用户猜测
            System.out.println("请您输入您猜测的数据:");
            int guessNumber = sc.nextInt();

            // 3.判断用户猜测的数字与幸运号码的大小情况
            if(guessNumber > luckNumber){
                System.out.println("您猜测的数字过大");
            } else if (guessNumber < luckNumber) {
                System.out.println("您猜测的数字过小");
            }else{
                System.out.println("恭喜你,猜测成功了!");
                break;
            }
        }
    }
}