Java流程控制语句


流程控制语句

一、流程控制语句

1. 流程控制语句介绍

流程控制语句通过一些语句来控制程序的【执行】流程

2. 流程控制语句分类

流程控制语句分类

  • 顺序结构
  • 分支结构
  • 循环结构

image-20230117190620598

顺序结构

Java 程序默认的执行流程没有特定的语法结构按照代码的先后顺序依次执行程序中大多数的代码都是这样执行的。

public class Test {
	public static void main(String[] args) {
		System.out.println("A");
		System.out.println("B");
		System.out.println("C");
	}
}

image-20230117185251784

二、分支语句

1. if 语句

1.1 if 第一种格式

格式
if (判断条件) {
    语句体;	
}

执行流程

  1. 首先计算判断条件的结果
  2. 如果条件的结果为 true 就执行语句体
  3. 如果条件的结果为 false 就不执行语句体

下面我们通过一个例子来了解if第一种格式

public static void ifTest1(){
        System.out.println("开始");

        int age = 18;

        if (age >= 18){
            System.out.println("可以上网吧");
        }

        System.out.println("结束");
}

输出结果为

image-20230117231057084

1.2 if 第二种格式

格式
if (判断条件) {
    语句体1;	
} else {
    语句体2;	
}

执行流程

  1. 首先计算判断条件的结果
  2. 如果条件的结果为 true 就执行语句体1
  3. 如果条件的结果为 false 就执行语句体2

下面我们通过一个例子来了解if第二种格式

public static void ifTest2(){
        System.out.println("开始");

        int age = 17;

        if (age >= 18){
            System.out.println("可以上网吧");
        }else {
            System.out.println("你的年龄未满18岁不可以上网吧");
        }

        System.out.println("结束");
}

输出结果为

image-20230117231135013

1.3 if 第三种格式

格式
if (判断条件1) {
    语句体1;	
} else if (判断条件2) {
    语句体2;	
} 
...
else {
    语句体n+1;
}

执行流程

  1. 首先计算判断条件1的值
  2. 如果值为true就执行语句体1如果值为false就计算判断条件2的值
  3. 如果值为true就执行语句体2如果值为false就计算判断条件3的值
  4. 如果没有任何判断条件为true就执行语句体n+1。

下面我们通过一个例子来了解if第三种格式

public static void ifTest3(){
        //需求键盘录入一个整数数值表示用户身份  1.会员 2.非会员 其他您的输入有误
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入:");
        int num = sc.nextInt();

        if(num == 1){
            System.out.println("会员身份");
        } else if (num == 2) {
            System.out.println("非会员身份");
        }else {
            System.out.println("您的输入有误");
        }

 }

输出结果为

image-20230117231339768

1.4 If 案例

我们刚才学习了 if 语句的三种格式下面我们通过案例来巩固一下

1、检查密码

需求键盘录入用户的密码如果密码是123456长须输出密码正确否则的话输出密码错误

代码实现

public static void checkPassword() {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入密码:");

        int password = sc.nextInt();

        if (password == 123456) {
            System.out.println("密码正确");
        } else {
            System.out.println("密码错误");
        }
	}

输出结果为

image-20230119100837254

2、考试奖励

需求键盘录入考试成绩根据成绩所在的区间程序打印出不同的奖励机制

  • 95~100自行车一辆
  • 90~94游乐场玩一次
  • 80~89变形金刚一个
  • 80分以下挨揍

image-20230119101009067

代码实现

方法一

public static void queryPrizeByScore() {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入您的分数:");
        int score = sc.nextInt();

        if (score >= 95 && score <= 100) {
            System.out.println("自行车一辆");
        } else if (score >= 90 && score <= 94) {
            System.out.println("游乐场玩一次");
        } else if (score >= 80 && score <= 89) {
            System.out.println("变形金刚一个");
        } else if (score >= 0 && score <= 79) {
            System.out.println("挨揍");
        } else {
            System.out.println("您的输入有误请检查是否是0~100之间");
        }

    }

方法二

public static void queryPrizeByScore() {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入您的分数:");
        int score = sc.nextInt();

        if (score < 0 || score > 100) {
            System.out.println("您的输入有误请检查是否是0~100之间");
        } else if (score >= 95 && score <= 100) {
            System.out.println("自行车一辆");
        } else if (score >= 90 && score <= 94) {
            System.out.println("游乐场玩一次");
        } else if (score >= 80 && score <= 89) {
            System.out.println("变形金刚一个");
        } else {
            System.out.println("挨揍");
        }

    }

方法三

public static void queryPrizeByScore() {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入您的分数:");
        int score = sc.nextInt();

        if (score < 0 || score > 100) {
            System.out.println("您的输入有误请检查是否是0~100之间");
        } else {
            if (score >= 95 && score <= 100) {
                System.out.println("自行车一辆");
            } else if (score >= 90 && score <= 94) {
                System.out.println("游乐场玩一次");
            } else if (score >= 80 && score <= 89) {
                System.out.println("变形金刚一个");
            } else {
                System.out.println("挨揍");
            }
        }

    }

输出结果为

image-20230119102706212

1.5 if 语句注意事项

  • if 语句中如果大括号控制的是一条语句大括号可以省略不写

  • if 语句的 ( ) 和 { } 之间不要写分号

2. Switch 语句

2.1 Switch 语句格式

switch(表达式) {
    case1
	语句体1;
	break;
    case2
	语句体2;
	break;default	
	语句体n+1;
	break;
}

格式说明

  • 表达式将要匹配的值 取值为byte、short、int、char

    JDK5以后可以是枚举JDK7以后可以是String。

  • case后面跟的是要和表达式进行比较的值 被匹配的值。

  • break表示中断结束的意思用来结束switch语句。

  • default表示所有情况都不匹配的时候就执行该处的内容和if语句的else相似。

执行流程

  1. 拿着表达式的值依次和case后面的值进行匹配匹配成功就会执行对应的语句在执行的过程中遇到break就会结束。
  2. 如果所有的case都不匹配就会执行default里面的语句体然后程序结束掉。

2.2 Switch 案例

1、打印星期

需求键盘录入一个整数根据录入的数值程序打印出对应的星期

代码实现

package cn.edu.hgu.mswitch;

import java.util.Scanner;

public class SwitchDemo {
    public static void main(String[] args) {
        switchTest();
    }
    /*
        需求键盘录入一个整数根据录入的数值程序打印出对应的星期
     */
    public static void switchTest(){
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入:");
        int week =sc.nextInt();

        switch (week){
            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;
            case 7:
                System.out.println("星期日");
                break;
            default:
                System.out.println("输入错误");
                break;
        }
    }
}

注意事项

  1. case给出的值不允许重复
  2. case后面的值只能是常量不能是变量
  3. Switch()中可以接受的类型
    1. 基本数据类型byte short char int
    2. 引用数据类型jdk5版本开始可以是枚举jdk7版本开始可以是String字符串
  4. Switch穿透现象

2、Switch穿透现象

下面我们通过一个案例来了解什么是穿透现象

需求键盘录入一个数值1~5输出工作日 6~7输出休息日

方法一

我们根据上面那个案例对代码进行改造但是我们发现有多个case的语句体是相同的

image-20230119110348514

方法二

Switch语句case具有穿透现象我们可以使用这个现象来简化代码

image-20230119110927479

方法三

jdk14版本开始case后面允许编写多个数据多个数据之间用逗号分隔

image-20230119111236892

方法四

我们可以使用箭头->指向case对应的语句

image-20230119111604704

3. 使用范围

  • if 语句适用于范围性的判断
  • Switch语句适用于固定值的匹配

三、循环语句

我们来看一下前面实现的一个案例检查密码。在实际生活中比如我们输入支付密码是有次数限制的而不是只进行一次下面我们对代码进行修改

package cn.edu.hgu.loop;

import java.util.Scanner;

public class LoopDemo {
    public static void main(String[] args) {
        checkPassword();
    }

    /*
        循环语句可以解决的问题将一段代码逻辑重复的执行很多次
     */
    public static void checkPassword() {
        Scanner sc = new Scanner(System.in);
        for (int i = 1; i <= 3; i ++) {
            System.out.println("请输入密码:");

            int password = sc.nextInt();

            if (password == 123456) {
                System.out.println("密码正确");
            } else {
                System.out.println("密码错误");
            }
        }
    }

}

输出结果

image-20230119133933734

1. 循环介绍

好我们先了解了一下什么是循环语句循环语句可以将一段代码逻辑重复的执行很多次。

上面的例子中我们就使用了循环语句来重复执行密码验证直到循环次数结束。

image-20230117221946502

2. for循环

2.1 for 循环格式介绍

格式

for (   初始化语句 ;     条件判断语句 ;    条件控制语句 )  {
    循环体语句;
}

1、打印字符串

简单了解了循环之后我们先来进行一个简单的练习打印 3 行 “跑圈”

image-20230119135108299

介绍一下代码

其中

  • int i = 1是初始化语句定义一个初始化的变量
  • i <= 3是条件判断语句条件成立则执行循环体语句否则退出循环
  • i++是条件控制语句通过自增来控制循环次数
  • System.out.println("跑圈");是循环体语句每执行一次循环就执行一次循环体语句

经过我们对上面案例的练习我们了解了 for 循环语句的结构接下来我们再来做一个案例吧。

我们先来看一下需求

需求: 请使用循环, 在控制台打印出 10 次 黑马程序员.

这个只要在上面代码的基础上修改循环次数和循环体语句

public static void print() {
        for (int i = 1; i <= 10; i++) {
            System.out.println("黑马程序员");
        }
    }

输出结果为

image-20230119145145386

但是这样的话每次调用方法都是固定的次数但我们想根据参数的不同来打印不同行数的语句

image-20230119150028825

2、模拟计时器

请使用循环在控制台 打印数字 1-3 和 3-1 的数据

public static void printNumber(){
        for (int i = 1; i <=3; i++) {
            System.out.println(i);
        }
        System.out.println("------------------");
        for (int i = 3; i >=1; i--) {
            System.out.println(i);
        }
    }

输出结果为

image-20230119165524286

积累编码思路

  • 循环中用于控制循环的变量还可以放在循环体中继续进行使用
  • 条件控制语句不要局限的记忆为只能是++

3、求和

需求求1-100之间的偶数和并把求和结果在控制台输出

分析

  • 定义求和变量 sum准备记录累加的结果
  • 使用 for 循环分别获取数据 1 – 100
  • 循环使用 if 语句筛选出偶数数据
  • 将每一个偶数数据和 sum 变量进行累加
  • 循环结束后打印求和后的结果

代码实现

public static int getSum() {
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            if (i % 2 == 0) {
                sum += i;
            }
        }
        return sum;
    }

image-20230119170557582

生成方法返回值快捷键

  1. 方法名().var + 回车
  2. Ctrl + alt + V

法二

public static int getSum() {
        int sum = 0;
        for (int i = 2; i <= 100; i += 2) {
            sum += i;
        }
        return sum;
    }

这种方法比第一种方法更好不用进行判断而是根据规律选择。

思路积累

今后若遇到的需求是求 xxx 的和就要联想到求和变量 sum

4、水仙花数

需求在控制台输出所有的“水仙花数”

什么是“水仙花数”

  • 水仙花数是一个三位数

    111 222 333 370 371 520 999

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

    image-20230118160210361

分析

  1. 通过 for 循环获取到所有的三位数 100 - 999
  2. 在循环内部将每一个三位数拆分为个位十位百位
  3. 加入 if 筛选条件 if (gegege + shishishi + baibaibai == 原数)
  4. 满足条件则输出水仙花数

代码实现

public static void daffodilNumber() {
        for (int i = 100; i <= 999; i++) {
            int ge = i % 10;
            int shi = i / 10 % 10;
            int bai = i / 100;
            if (ge * ge * ge + shi * shi * shi + bai * bai * bai == i) {
                System.out.println(i);
            }
        }
    }

image-20230119171552079

输出结果为

image-20230119171608837

5、统计水仙花数

需求在控制台输出所有的“水仙花数”并统计出水仙花数的个数

分析

  1. 定义计数器变量 count准备统计水仙花数的个数
  2. 通过 for 循环获取到所有的三位数 100 - 999
  3. 在循环内部将每一个三位数拆分为个位十位百位
  4. 加入 if 筛选条件 if (gegege + shishishi + baibaibai == 原数)
  5. 满足条件则输出水仙花数count变量++
  6. 打印 count 所记录的值

代码实现

public static int daffodilCount() {
        int count = 0;
        for (int i = 100; i <= 999; i++) {
            int ge = i % 10;
            int shi = i / 10 % 10;
            int bai = i / 100;
            if (ge * ge * ge + shi * shi * shi + bai * bai * bai == i) {
                count++;
                System.out.println(i);
            }
        }
        return count;
    }

image-20230119172216992

输出结果为

image-20230119172243835

思路积累

今后若遇到的需求是统计xxx就要联想到计数器变量 count

2.2 for 循环语句注意事项

  • 循环 { } 中定义的变量在每一轮循环结束后都会从内存中释放

  • 循环 ( ) 中定义的变量在整个循环结束后都会从内存中释放

    image-20230118161412878

  • 循环语句 ( ) 和 { } 之间不要写分号

4. 循环嵌套

循环嵌套: 在循环语句中, 继续出现循环语句.

for(int i = 1; i <= 5; i++) {

   System.out.println("A");
   System.out.println("B");
   System.out.println("C");

}

当循环体执行完一次, 下一轮循环才会开启

for(int i = 1; i <= 5; i++) {

     for(int j = 1; j <= 5; j++) {
     	System.out.println("HelloWorld");
     }
}

外循环执行一次, 内循环执行一圈

1、打印矩形

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

代码实现

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

image-20230119173014792

输出结果为

image-20230119173033242

注意事项

System.out.println();	//打印数据后有换行效果
System.out.print();		//打印数据后没有换行效果

2、打印三角形

需求在控制台使用 * 打印5行直角三角形

代码实现

public static void printTriangle() {
        for (int i = 1; i <= 5; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
        System.out.println("-------------");
        for (int i = 5; i >= 1; i--) {
            for (int j = 1; j <= i; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }

image-20230119173645542

输出结果为

image-20230119173728288

3、打印99乘法表

需求在控制台打印出 99 乘法表

代码实现

public static void print99() {
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print(j + "*" + i + "=" + i * j + "\t");
            }
            System.out.println();
        }
    }

image-20230119174316340

输出结果为

image-20230119174351143

3. while 循环语句

while 循环语句格式

初始化语句;
while (条件判断语句) {
    循环体语句;
    条件控制语句;
}

下面我们用 While 循环实现 水仙花数

package cn.edu.hgu.test;

public class WhileTest {
    public static void main(String[] args) {
        printDaffodil();
    }

    /*
           需求在控制台输出所有的“水仙花数”,统计出水仙花数的个数
     */
    public static void printDaffodil() {
        int i = 100;
        while (i <= 999) {
            int ge = i % 10;
            int shi = i / 10 % 10;
            int bai = i / 100;
            if (ge * ge * ge + shi * shi * shi + bai * bai * bai == i) {
                System.out.println(i);
            }
            i++;
        }

    }
}

4. do…while循环语句

do…while 循环格式与执行流程

初始化语句;
do {
    循环体语句;
    条件控制语句;
} while (条件判断语句);

特点无论判断条件是否满足都至少执行一次循环体

下面我们来看一下do …while 的特点

package cn.edu.hgu.test;

public class DoWhileTest {
    public static void main(String[] args) {
        doWhileTest();
    }
    public static void doWhileTest() {
        int i = 1;
        do {
            System.out.println("黑马程序员");
            i++;
        } while (i <= 5);
        System.out.println("-------------");
        System.out.println("i = "+i);
        do {
            System.out.println("黑马程序员");
            i++;
        } while (i <= 5);

    }
}

输出结果为

image-20230119202443862

5. 三种循环的区别

  • for循环 和 while循环先判断后执行
  • do…while 先执行后判断
  • for循环 和 while循环本质没有什么区别能用 for 循环实现的使用 while 也能使用

6. 跳转控制语句

  • break : 终止循环体内容的执行也就是说结束当前的整个循环
  • continue: 跳过某次循环体内容的执行继续下一次的执行

注意事项

  • break只能在循环或者Switch语句中进行使用
  • continue : 只能在循环中进行使用
  • break、continue下面不允许写代码因为执行不到属于无效的代码

break 案例模拟登陆

package cn.edu.hgu.mbreak;

import java.util.Scanner;

public class BreakDemo {
    public static void main(String[] args) {
        login();
    }
    public static void login(){
        Scanner sc = new Scanner(System.in);

        for (int i = 1; i <=3 ; i++) {
            System.out.println("请输入密码");
            int passward =sc.nextInt();

            if (passward == 123456){
                System.out.println("登陆成功");
                break;
            }else {
                System.out.println("登陆失败密码有误");
            }
        }

    }
}

输出结果为

image-20230119204426116

continue案例

package cn.edu.hgu.control;

public class ContinueDemo {
    public static void main(String[] args) {
        print();
    }

    public static void print() {
        for (int i = 1; i <= 20; i++) {
            if (i == 3 || i == 7 || i == 14) {
                continue;
            }
            System.out.println("第" + i + "名顾客进入电影院...");
        }
    }

}

输出结果为

image-20230119205104931

综合案例

需求学生管理系统-菜单搭建

代码如下

package cn.edu.hgu.control;

import java.util.Scanner;

public class ControlDemo {
    public static void main(String[] args) {
        initMenu();
    }

    /*
           需求学生管理系统-菜单搭建
     */
    public static void initMenu() {
        Scanner sc = new Scanner(System.in);
        lo:
        //:给循环起名字
        while (true) {
            System.out.println("请输入您的选择1.添加学生  2.删除学生  3.修改学生  4.查看学生  5.退出");
            int choice = sc.nextInt();

            switch (choice) {
                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 lo;
                default:
                    System.out.println("您的输入有误请检查");
                    break;
            }
        }
    }
}

输出结果为

image-20230119210640832

7. Random随机数

Random用来生成随机数。

案例Random产生随机数

package cn.edu.hgu.random;

import java.util.Random;

public class RandomDemo {
    public static void main(String[] args) {
        randomTest();
    }

    /*
        Random产生随机数
     */
    public static void randomTest() {
        Random r = new Random();
        //生成1~100之间的随机数
        for (int i = 1; i <= 10; i++) {
            int num = r.nextInt(100) + 1;
            System.out.println(num);
        }

        System.out.println("---------------");

        //生成20~80之间的随机数
        for (int i = 1; i <= 10; i++) {
            int num = r.nextInt(+61) + 20;
            System.out.println(num);
        }
    }

}

输出结果为

image-20230119211309735

案例猜数字

需求实现猜数字小游戏

package cn.edu.hgu.test;

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

public class RandomTest {
    public static void main(String[] args) {
        guessNumber();
    }

    public static void guessNumber() {
        Random r = new Random();
        Scanner sc = new Scanner(System.in);
        int randomNumber = r.nextInt(100) + 1;
        while (true) {
            System.out.println("请输入:");
            int scNumber = sc.nextInt();

            if (scNumber > randomNumber) {
                System.out.println("猜大了");
            } else if (scNumber < randomNumber) {
                System.out.println("猜小了");
            } else {
                System.out.println("猜对了");
                break;
            }
        }
        System.out.println("恭喜!");

    }


}

输出结果为

image-20230119213752573

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java