六、流程控制语句

99 阅读9分钟

顺序结构

顺序结构

顺序结构语句是Java程序默认的执行流程,按照代码的先后顺序,从上到下依次执行

分支结构

为什么要有 If 语句?

If 语句在程序中就是用来进行判断的

If 语句的第一种格式

if (关系表达式) {
    语句体
}

执行流程:

首先计算关系表达式的值

如果关系表达式的值为true就执行语句体

如果关系表达式的值为false就不执行语句体

继续执行后面的其他语句

练习:老丈人选女婿

需求:键盘录入女婿酒量,如果大于2斤,老丈人给出回应,反之不回应

import java.util.Scanner;  
  
public class IfDemo1 {  
    public static void main(String[] args) {  
        // 1.键盘录入女婿酒量  
        Scanner sc = new Scanner(System.in);  
        System.out.println("请输入女婿对酒量");  
        int wine = sc.nextInt();  
        // 2.对酒量进行判断  
        if (wine > 2) {  
            System.out.println("小伙子,不错呦!");  
        }  
    }  
}

If的注意点:

1.大括号的开头可以另起一行书写,但是建议写在第一行的末尾

2.在语句体中,如果只有一句代码,大括号可以省略不写

3.如果对一个布尔类型的变量进行判断,不要用==号,直接把变量写在小括号即可

If的第二种格式

if (关系表达式) {
    语句体1;
} else {
    语句体2;
}

执行流程:

首先计算关系表达式的值

如果关系表达式的值为true就执行语句体1

如果关系表达式的值为false就执行语句体2

继续执行后面的其他语句

练习:商品付款

需求:假设用户在超市实际购买,商品总价为600元,键盘录入一个整数表示用户实际支付的钱。如果付款大于等于600,表示付款成功,否则付款失败

import java.util.Scanner;  
  
public class Test1 {  
    public static void main(String[] args) {  
        Scanner sc = new Scanner(System.in);  
        System.out.println("录入一个整数表示实际支付的钱");  
        int money = sc.nextInt();  
        if (money >= 600) {  
            System.out.println("付款成功");  
        } else {  
            System.out.println("付款失败");  
        }  
    }  
}

练习:影院选座

假设电影院售卖100张票,票的序号为 1~100。其中奇数票号坐左侧,偶数票号坐右侧。键盘录入一个整数表示电影票的票号。根据不同的票号给出不同的提示:奇数打印坐左边,偶数打印坐右边

import java.util.Scanner;  
  
public class Test2 {  
    public static void main(String[] args) {  
        Scanner sc = new Scanner(System.in);  
        System.out.println("请录入一个票号");  
        int ticket = sc.nextInt();  
        if (ticket >=0 && ticket <= 100) {  
            if (ticket % 2 == 1) {  
                System.out.println("坐左边");  
            } else {  
                System.out.println("坐右边");  
            }  
        }  
    }  
}

If语句的第三种格式

if (关系表达式1) {
    语句体1;
} else if (关系表达式2) {
    语句体2;
}
 ...
 else {
     语句体 n + 1;
}

执行流程:

首先计算关系表达式1的值

如果为true就执行语句体1;如果为false就计算关系表达式2的值

如果为true就执行语句体2;如果为false计算关系表达式3的值

...... 如果所有关系表达式结果都为false,就执行语句体 n + 1

练习:商品的价格

需求:商场都会有VIP的会员制,根据不同的会员会有不同的折扣。假设商品总价为1000.键盘录入会员级别,并计算出实际支付的钱。

会员1级:打九折

会员2级:打8折

会员3级:打7折

非会员:不打折

import java.util.Scanner;  
  
public class VIPTest {  
    public static void main(String[] args) {  
        // 定义变量记录总价  
        int price = 1000;  
        // 键盘录入会员的级别  
        Scanner sc = new Scanner(System.in);  
        System.out.println("请录入会员的级别");  
        int vip = sc.nextInt();  
        if (vip == 1) {  
            System.out.println("实际支付的钱为" + (price * 0.9));  
        } else if (vip == 2) {  
            System.out.println("实际支付的钱为" + (price * 0.8));  
        } else if(vip == 3) {  
            System.out.println("实际支付的钱为" + (price * 0.7));  
        } else {  
            System.out.println("实际支付的钱为" + price);  
        }  
    }  
}

switch语句格式

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

执行流程:

首先计算表达式的值

依次和case后面的值进行比较,如果有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束

如果所有的case后面的值和表达式的值都不匹配,就会执行default里面的语句体,然后结束整个switch语句

格式说明:

表达式:(将要匹配的值)取值为byte、short、int、char。JDK5以后可以是枚举,JDK7以后可以是String

case:后面跟的是要和表达式进行比较的值(被匹配的值)

break:表示中断,结束的意思,用来结束switch语句

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

case后面的值只能是字面量,不能是变量

case给出的值不允许重复

练习:运动计划

需求:键盘录入星期数,先是今天的减肥活动

周一跑步,周二游泳,周三慢走,周四动感单车,周五拳击,周六爬山,周日好好吃一顿

import java.util.Scanner;  
  
public class planTest {  
    public static void main(String[] args) {  
        // 1.键盘录入星期数  
        Scanner sc = new Scanner(System.in);  
        System.out.println("请录入星期数");  
        int week = sc.nextInt();  
        // 2.利用switch对星期进行匹配  
        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("没有这个星期");  
        }  
    }  
}

switch其他知识点

default的位置和省略
  • 位置:default不一定写在最下面,可以在任意位置写(不推荐,最好最下边)
  • 省略:default可以省略,语法不会有问题,但是不建议省略
public class SwitchTest {  
    public static void main(String[] args) {  
        int num = 100;  
        switch(num) {  
            default:  
                System.out.println("num的值不是1,10");  
                break;  
            case 1:  
                System.out.println("num的值是1");  
                break;  
            case 10:  
                System.out.println("num的值是10");  
                break;  
        }  
    }  
}
case穿透

语句体没有写 break 导致的

如果没有发现break,程序会继续执行下一个case的语句体,一直遇到break或右大括号为止

public static void main(String[] args) {  
    int num = 1;  
        switch(num) {  
            case 1:  
                System.out.println("num的值为1");  
            case 10:  
                System.out.println("num的值为10");  
            default:  
                System.out.println("num的值不是1,10");  
        }  
    }  
}
switch新特性(JSK12才有)
public class NewSwitch {  
    public static void main(String[] args) {  
        int num = 1;  
        switch(num) {  
            case 1 -> {  
                System.out.println("一");  
            }  
            case 2 -> {  
                System.out.println("二");  
            }  
            case 3 -> System.out.println("三");  
            default -> System.out.println("没有这个选项");  
        }  
    }  
}
switch和if第三种格式各自的使用场景

switch 和 if的第三种格式各自使用场景

  • if的第三种格式:一般用于对范围的判断
  • switch:把有限个数据一一列举出来,让我们任选其一

练习:休息日和工作日

需求:键盘录入星期数,输出工作日和休息日。(1~5)工作日,(6~7)休息日

import java.util.Scanner;  
  
public class TestBreak {  
    public static void main(String[] args) {  
        Scanner sc = new Scanner(System.in);  
        System.out.println("请录入一个整数表示星期");  
        int week = sc.nextInt();  
        switch(week) {  
            case 1,2,3,4,5:  
                System.out.println("工作日");  
                break;  
            case 6,7:  
                System.out.println("休息日");  
                break;  
            default:  
                System.out.println("没有这个星期");  
                break;  
        }  
    }  
}
import java.util.Scanner;  
  
public class TestNewSwitchBreak {  
    public static void main(String[] args) {  
        Scanner sc = new Scanner(System.in);  
        System.out.println("请录入星期数");  
        int week = sc.nextInt();  

        switch(week) {  
            case 1,2,3,4,5 -> System.out.println("工作日");  
            case 6,7 -> System.out.println("休息日");  
            default -> System.out.println("没有这个星期");  
        }  
    }  
}

循环结构

什么是循环?

  • 重复的做某件事情
  • 具有明确的开始和停止标记

循环的分类

  • for
  • while
  • do...while

for 循环

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

执行流程:

1⃣️ 执行初始化语句

2⃣️ 执行条件判断语句,看其结果是true还是false

如果是false,循环结束;如果是true,执行循环体语句

3⃣️ 执行条件控制语句

4⃣️ 回到2⃣️继续执行条件判断语句

  • 初始化语句只执行一次
  • 判断语句为true,循环继续
  • 判断语句为false,循环结束
练习:打印1~5,打印5~1
public class ForTest1 {  
    public static void main(String[] args) {  
        for (int i = 1; i <= 5; i++) {  
            System.out.println(i);  
        }  

        for (int i = 5; i >=1; i--) {  
            System.out.println(i);  
        }  
    }  
}
练习:求和

需求:求 1~5之间的和

public class ForTest2 {  
    public static void main(String[] args) {  
        int sum = 0;  
        for (int i = 1; i <= 5; i++) {  
            sum += i;  
        }  
        System.out.println(sum);  
    }  
}
练习:求和

需求: 求 1~100之间的偶数和

  1. 求和变量不能定义在循环之内,因为变量只在所属的大括号中有效

  2. 变量定义在循环里面,那么变量只在本次循环中有效。当本次循环结束之后,变量就会从内存中消失,第二次循环开始后,又会重新定义一个新的变量

public class ForTest3 {  
    public static void main(String[] args) {  
        int sum = 0;  
        for (int i = 0; i <= 100; i++) {  
            if (i % 2 == 0) {  
                sum += i;  
            }  
        }  
        System.out.println(sum);  
    }  
}
练习:统计满足条件的数字

需求:键盘录入两个数字,表示一个范围,统计这个范围中,既能被3整除,又能被5整除的数字有多少个

import java.util.Scanner;  
  
public class ForTest4 {  
    public static void main(String[] args) {  
        Scanner sc = new Scanner(System.in);  
        System.out.println("请录入第一个数字表示范围开始");  
        int start = sc.nextInt();  
        System.out.println("请录入第二个数字表示范围的结束");  
        int end = sc.nextInt();  

        int count = 0;  

        for (int i = start; i <= end; i++) {  
            if (i % 3 == 0 && i % 5 ==0) {  
            count++;  
            }  
        }  
        System.out.println(count);  
    }  
}

while循环的执行流程

格式:
初始化语句;
while(条件判断语句) {
    循环体语句;
    条件控制语句;
}
  • 初始化语句只执行一次
  • 判断语句为true,循环继续
  • 判断语句为false,循环结束
public class WhileTest {  
    public static void main(String[] args) {  
        int i = 0;  
        while (i <= 100) {  
            System.out.println(i);  
            i++;  
        }  
    }  
}
for和while的对比

相同点:运行规则一样

for和while的区别:

for循环中,控制循环的变量,因为归属for循环的语法结构中,在for循环结束后,就不能再次访问到了

while循环中,控制循环的变量,对于while循环来说不归属其语法结构中,在while循环结束后,该变量还可以继续使用

for和while的区别:

for循环中:知道循环次数或者循环的范围

while循环:不知道循环的次数和范围,只知道循环的结束条件

练习:打印折纸的次数

需求:珠穆朗玛峰高8844.42m,假如有一张可以无限折叠的纸,厚度为0.1mm。请问,这张纸折叠多少次可以折成珠穆朗玛峰的高度

public class WhileTest2 {  
    public static void main(String[] args) {  
        double height = 8844430;  
        double paper = 0.1;  
        int count = 0;  
        while (paper < height) {  
            paper = paper * 2;  
            count++;  
        }  
        System.out.println(count);  
    }  
}
练习:回文数

需求:给一个整数,如果整数是一个回文整数,打印true,否则,返回false

解释:回文数指正序和倒叙读都是一样的整数

如:121

public class WhileTest3 {  
    public static void main(String[] args) {  
        int x = 131;  
        int temp = x;  
        int num = 0;  
        while(x != 0) {  
            int ge = x % 10;  
            x = x / 10;  
            num = num * 10 + ge;  
        }  
        System.out.println(num);  
        System.out.println(x);  
        System.out.println(num == temp);  
    }  
}
练习:求商和余数

需求:给定两个整数,被除数和除数(都是正数,且不超过int的范围);将两数相除,要求不使用乘法、除法和%运算符,得到商和余数

public class WhileTest4 {  
    public static void main(String[] args) {  
        int dividend = 100;  
        int divisor = 30;  
        int count = 0;  
        while (dividend >= divisor) {  
            dividend = dividend - divisor;  
            count++;  
        }  
        System.out.println("余数是:" + dividend);  
        System.out.println("商为:" + count);  
    }  
}

do...while循环

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

先执行后判断

无限循环

无限循环:循环一直停不下来

for(;;) {
    System.out.println("学习");
}

while(true) {
    System.out.println("学习")
}

do {
    System.out.println("学习");
} while(true);

流程控制语句

  • continue:跳过本次循环,继续执行下次循环
  • break:结束整个循环
练习:小老虎吃包子

需求:小老虎吃包子,第三个有虫子,跳过不吃

public class TigerFood1 {  
    public static void main(String[] args) {  
        for (int i = 1; i <= 5; i++) {  
            if(i == 3) {  
                continue;  
            }  
            System.out.println("小老虎在吃第" + i + "个包子");  
        }  
    }  
}
练习:小老虎吃包子

需求:小老虎吃包子,吃完第三个饱了

public class TigerFood2 {  
    public static void main(String[] args) {  
        for (int i = 1; i <= 5; i++) {  
            System.out.println("小老虎在吃第" + i + "个包子");  
            if (i == 3) {  
                break;  
            }  
        }  
    }  
}