• day04_Java流程控制


    流程控制语句

    在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。所以,我们必须清楚每条语句的执行流程。而且,很多时候要通过控制语句的执行顺序来实现我们想要的功能。流程控制语句分类,如下所示

    • 顺序结构
    • 分支结构(if, switch)
    • 循环结构(for, while, do…while)

    顺序结构

    顺序结构是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行的。

    顺序结构执行流程图:

    代码示例

    public class Demo {
        public static void main(String[] args) {
            System.out.println(1);
            System.out.println(2);
            System.out.println(3);
            System.out.println(4);
            System.out.println(5);
        }
    }

    分支结构

    根据不同的条件,执行不同的语句。在Java中分支结构又可以分为if语句和Switch语句。

    if语句格式之单if

    格式:

    执行流程:

    1. 首先计算关系表达式的值
    2. 如果关系表达式的值为true就执行语句体
    3. 如果关系表达式的值为false就不执行语句体
    4. 继续执行后面的语句内容

    执行流程图

    代码示例

    public class Demo {
        public static void main(String[] args) {
            System.out.println("开始");
            int age = 17;
            // 如果年龄大于18岁, 就可以上网吧
            if(age >= 18){
                // age > 18为true 执行的语句体
                System.out.println("可以上网吧");
            }
            System.out.println("结束");
        }
        
    }

    if语句格式之if ...else

    格式:

    执行流程:

    1. 首先计算关系表达式的值
    2. 如果关系表达式的值为true就执行语句体1
    3. 如果关系表达式的值为false就执行语句体2
    4. 继续执行后面的语句内容

    代码示例

    public class Demo {
        public static void main(String[] args) {
            // 程序判断一个数, 是奇数还是偶数
            int num = 9;
            
            if(num % 2 == 0){
                System.out.println("偶数");
            }else{
                System.out.println("奇数");
            }
        }
    }

    if语句格式之if ...else if ...else

    格式

    执行流程:

    1. 首先计算关系表达式1的值
    2. 如果值为true就执行语句体1;如果值为false就计算关系表达式2的值
    3. 如果值为true就执行语句体2;如果值为false就计算关系表达式3的值
    4. 如果没有任何关系表达式为true,就执行语句体n+1。

    执行流程图

    代码示例

    import java.util.Scanner;
    
    /*
    需求:小明快要期末考试了,小明爸爸对他说,会根据他不同的考试成绩,送他不同的礼物
    假如你可以控制小明的得分,请用程序实现小明到底该获得什么样的礼物,并在控制台输出。
     */
    public class Demo {
        public static void main(String[] args) {
            // 1. 使用Scanner录入考试成绩
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入您的成绩:");
            int score = sc.nextInt();
            // 2. 判断成绩是否在合法范围内 0~100
            if (score >= 0 && score <= 100) {
                // 合法成绩
                // 3. 在合法的语句块中判断成绩范围符合哪一个奖励
                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("挨顿揍, 这座城市又多了一个伤心的人~");
                }
            } else {
                // 非法的话, 给出错误提示
                System.out.println("您的成绩输入有误!");
            }
        }
    
    }

    注意事项:

    • 如果if语句所控制的语句体, 是一条语句, 大括可以省略不写但是强烈建议不神虐!

    分支语句之switch语句

    格式:

    switch语句中,表达式的数据类型,可以是byte,short,int,char,enum(枚举),JDK7后可以接收字符串。

    执行流程:

    1. 首先计算出表达式的值
    2. 其次,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结 束。
    3. 最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉。

    示例代码

    import java.util.Scanner;
    
    public class TestSwitch {
        /*
            需求:键盘录入星期数,显示今天的减肥活动。
        
            周一:跑步  
            周二:游泳  
            周三:慢走  
            周四:动感单车
            周五:拳击  
            周六:爬山  
            周日:好好吃一顿 
    
            分析:
                1. 键盘录入星期数据,使用变量接收
                2. 多情况判断,采用switch语句实现
                3. 在不同的case中,输出对应的减肥计划
        */
        public static void main(String[] args){
            // 1. 键盘录入星期数据,使用变量接收
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入");
            int week = sc.nextInt();
            // 2. 多情况判断,采用switch语句实现
            switch(week){
                // 3. 在不同的case中,输出对应的减肥计划
                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;
            }
        }
    }

    switch语句case穿透

    概述 : 如果switch语句中,case省略了break语句, 就会开始case穿透

    示例代码

    import java.util.Scanner;
    
    public class Demo {
        /*
            需求: 键盘录入星期数,输出工作日、休息日
            (1-5)工作日,(6-7)休息日
            
            
            case穿透是如何产生的?
            
                如果switch语句中,case省略了break语句, 就会开始case穿透.
            
            现象:
                当开始case穿透,后续的case就不会具有匹配效果,内部的语句都会执行
                直到看见break,或者将整体switch语句执行完毕,才会结束。
    
        */
        public static void main(String[] args){
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入星期数:");
            int week = sc.nextInt();
            
            switch(week){
                case 1:
                case 2:
                case 3:
                case 4:
                case 5:
                    System.out.println("工作日");
                    break;
                case 6:
                case 7:
                    System.out.println("休息日");
                    break;
                default:
                    System.out.println("您的输入有误");
                    break;
            }
        }    
    }

    循环结构

    循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复 执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形 成死循环。一般情况下,循环的组成如下所示:

    • 初始化语句: 用于表示循环开启时的起始状态,简单说就是循环开始的时候什么样
    • 条件判断语句:用于表示循环反复执行的条件,简单说就是判断循环是否能一直执行下去
    • 循环体语句: 用于表示循环反复执行的内容,简单说就是循环反复执行的事情
    • 条件控制语句:用于表示循环执行中每次变化的内容,简单说就是控制循环是否能执行下去

    循环语句之for循环

    for循环格式:

    执行流程:

    1. 执行初始化语句
    2. 执行条件判断语句,看其结果是true还是false。如果是false,循环结束。如果是true,继续执行
    3. 执行循环体语句
    4. 执行条件控制语句
    5. 回到②继续

    代码示例

    //在控制台输出所有的“水仙花数” 。水仙花数,指的是一个三位数,个位、十位、百位的数字立方和等于原数
    public class Demo {
        /*
            需求:在控制台输出所有的“水仙花数”,要求每行打印2个
            System.out.print (打印内容);    打印后不换行
            System.out.println(打印内容);    打印后换行
    
            分析:       
                1. 定义变量count,用于保存“打印过”的数量,初始值为0
                2. 在判定和打印水仙花数的过程中,拼接空格, 但不换行,并在打印后让count变量+1,记录打印过的数量
                3. 在每一次count变量+1后,判断是否到达了2的倍数,是的话,换行。
    
        */
        public static void main(String[] args) {
            // 1. 定义变量count,用于保存“打印过”的数量,初始值为0
            int count = 0;
            for (int i = 100; i <= 999; i++) {
                int ge = i % 10;
                int shi = i / 10 % 10;
                int bai = i / 10 / 10 % 10;
    
                if ((ge * ge * ge + shi * shi * shi + bai * bai * bai) == i) {
                    //  2. 在判定和打印水仙花数的过程中,拼接空格, 但不换行,并在打印后让count变量+1,记录打印过的数量
                    System.out.print(i + " ");
                    count++;
                    // 3. 在每一次count变量+1后,判断是否到达了2的倍数,是的话,换行
                    if (count % 2 == 0) {
                        System.out.println();
                    }
                }
            }
        }
    }

    总结:今后如果需求带有统计xxx,请先想到计数器变量.计数器变量定义的位置,必须在循环外部

    循环语句之while循环

     while循环完整格式

     

    while循环执行流程:

    1. 执行初始化语句
    2. 执行条件判断语句,看其结果是true还是false。如果是false,循环结束。如果是true,继续执行
    3. 执行循环体语句
    4. 执行条件控制语句
    5. 回到②继续

    示例代码

    /*
    世界最高山峰是珠穆朗玛峰(8844.43米=8844430毫米),假如我有一张足够大的纸,
    它的厚度是0.1毫米。请问,我折叠多少次,可以折成珠穆朗玛峰的高度?
     */
    public class Demo {
        public static void main(String[] args) {
            //定义一个计数器,初始值为0
            int count = 0;
            //定义纸张厚度
            double paper = 0.1;
            //定义珠穆朗玛峰的高度
            int zf = 8844430;
            //因为要反复折叠,所以要使用循环,但是不知道折叠多少次,这种情况下更适合使用while循环
            //折叠的过程中当纸张厚度大于珠峰就停止了,因此继续执行的要求是纸张厚度小于珠峰高度
            while(paper <= zf) {
                //循环的执行过程中每次纸张折叠,纸张的厚度要加倍
                paper *= 2;
                //在循环中执行累加,对应折叠了多少次
                count++;
            }
            //打印计数器的值
            System.out.println("需要折叠:" + count + "次");
        }
    }

    循环语句之dowhile循环

    完整格式:

    执行流程:

    1. 执行初始化语句
    2. 执行循环体语句
    3. 执行条件控制语句
    4. 执行条件判断语句,看其结果是true还是false。如果是false,循环结束。如果是true,继续执行
    5. 回到②继续

    代码示例

    public class Demo {
        //需求:在控制台输出5次"HelloWorld"
        public static void main(String[] args) {
            //do...while循环实现
            int j = 1;
            do {
                System.out.println("HelloWorld");
                j++;
            } while (j <= 5);
            
        }
    }

    三种循环的区别

    • for循环和while循环先判断条件是否成立,然后决定是否执行循环体(先判断后执行)
    • do...while循环先执行一次循环体,然后判断条件是否成立,是否继续执行循环体(先执行后判断)

    for循环和while的区别

    • 条件控制语句所控制的自增变量,因为归属for循环的语法结构中,在for循环结束后,就不能再次被访问到了
    • 条件控制语句所控制的自增变量,对于while循环来说不归属其语法结构中,在while循环结束后,该变量还可以继续使用

    死循环

    格式:

    注意: 无法访问的语句不能编写,否则会报错

    跳转控制语句

    跳转控制语句(break)

    跳出循环,结束循环

    public class Demo {
        /*
            break : 终止循环体内容的执行
            注意:使用是基于条件控制的
                    break语句只能在循环和switch中进行使用.
                    
            需求: 模拟20岁工作到80岁, 60岁退休.
        */
        public static void main(String[] args){
            for(int i = 20; i <= 80; i++){
                if(i == 60){
                    break;        // 结束整个循环
                }
                System.out.println(i + "岁正在上班");
            }
        }
        
    }

    跳转控制语句(continue)

    跳过本次循环,继续下次循环

    public class Demo {
        /*
            continue : 跳过某次循环体内容的执行
            
            注意:使用是基于条件控制, 在循环内部使用.
            
            需求: 模拟电梯上行的过程 1-24层, 4层不停.
        */
        public static void main(String[] args){
            for(int i = 1; i <= 24; i++){
                if(i == 4){
                    continue;
                }
                System.out.println(i + "层到了~");
            }
        }
        
    }

    综合练习

    import java.util.Scanner;
    import java.util.Random;
    
    public class Test {
        /*
            需求:程序自动生成一个1-100之间的数字,使用程序实现猜出这个数字是多少?
                当猜错的时候根据不同情况给出相应的提示
                如果猜的数字比真实数字大,提示你猜的数据大了
                如果猜的数字比真实数字小,提示你猜的数据小了
                如果猜的数字与真实数字相等,提示恭喜你猜中了
            
            1. 准备Random和Scanner对象, 分别用于产生随机数和键盘录入
            2. 使用Random产生一个1-100之间的数, 作为要猜的数
            3. 键盘录入用户猜的的数据
            4. 使用录入的数据(用户猜的数据)和随机数(要猜的数据)进行比较, 并给出提示
            
            5. 以上内容需要多次进行, 但无法预估用户输入几次可以猜测正确, 使用while(true)死循环包裹
            6. 猜对之后, break结束.
    
        */
        public static void main(String[] args){
            // 1. 准备Random和Scanner对象, 分别用于产生随机数和键盘录入
            Random r = new Random();
            Scanner sc = new Scanner(System.in);
            // 2. 使用Random产生一个1-100之间的数, 作为要猜的数
            int randomNum = r.nextInt(100) + 1;
            
            // 5. 以上内容需要多次进行, 但无法预估用户输入几次可以猜测正确, 使用while(true)死循环包裹
            while(true){
                // 3. 键盘录入用户猜的的数据
                System.out.println("请输入您猜的数据:");
                int num = sc.nextInt();
                // 4. 使用录入的数据(用户猜的数据)和随机数(要猜的数据)进行比较, 并给出提示
                if(num > randomNum){
                    System.out.println("猜大了");
                }else if(num < randomNum){
                    System.out.println("猜小了");
                }else{
                    // 6. 猜对之后, break结束.
                    System.out.println("恭喜,猜中了");
                    break;
                }
            }
            
            System.out.println("感谢您的使用");
            
        }
    }
  • 相关阅读:
    操作系统死锁原因及必要条件
    微信公众平台实现获取用户OpenID的方法
    开源授权协议使用调查报告,Apache最受欢迎 狼人:
    软件工程师,你真的喜欢你的工作吗? 狼人:
    程序员的本质 狼人:
    推荐16个最流行的JavaScript框架 狼人:
    11个完全免费的线框图工具 狼人:
    消息队列软件产品大比拼 狼人:
    FreeMarker 2.3.17版发布! 狼人:
    分享9个实用的jQuery倒计时插件 狼人:
  • 原文地址:https://www.cnblogs.com/wurengen/p/15616486.html
Copyright © 2020-2023  润新知