zoukankan      html  css  js  c++  java
  • 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("感谢您的使用");
            
        }
    }
  • 相关阅读:
    oracle 导入数据时提示只有 DBA 才能导入由其他 DBA 导出的文件
    oracle 常用语句
    android udp 无法收到数据 (模拟器中)
    android DatagramSocket send 发送数据出错
    AtCoder ABC 128E Roadwork
    AtCoder ABC 128D equeue
    AtCoder ABC 127F Absolute Minima
    AtCoder ABC 127E Cell Distance
    CodeForces 1166E The LCMs Must be Large
    CodeForces 1166D Cute Sequences
  • 原文地址:https://www.cnblogs.com/wurengen/p/15616486.html
Copyright © 2011-2022 走看看