• JavaSE学习笔记(三)—— 流程控制语句


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

      流程控制语句分类:顺序结构;选择结构;循环结构

    一、顺序结构

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

    class ShunXuJieGouDemo {
        public static void main(String[] args) {
            System.out.println("程序开始了");
            
            System.out.println("我爱Java");
            
            System.out.println("程序结束了");
        }
    }

    二、选择结构

      选择结构也被称为分支结构。
      选择结构有特定的语法规则,代码要执行具体的逻辑运算进行判断,逻辑运算的结果有两个,所以产生选择,按照不同的选择执行不同的代码。
      Java语言提供了两种选择结构语句:if语句;switch语句

    2.1 if语句

      if语句有三种格式

    【if语句格式1】——适合做单个判断

    if(比较表达式) {
        语句体;
    }

    执行流程:
      先计算比较表达式的值,看其返回值是true还是false。
      如果是true,就执行语句体;
      如果是false,就不执行语句体;

       

    class IfDemo {
        public static void main(String[] args) {
            int x = 10;
            
            if(x == 10) {
                System.out.println("x等于10");
            }
            
            if(x == 20) {
                System.out.println("x等于20");
            }
            
            System.out.println("over");
        }
    }

    if语句的注意事项:
      A:比较表达式无论简单还是复杂,结果必须是boolean类型
      B:if语句控制的语句体如果是一条语句,大括号可以省略;如果是多条语句,就不能省略。建议永远不要省略。
      C:一般来说:有左大括号就没有分号,有分号就没有左大括号

    class IfDemo2 {
        public static void main(String[] args) {
            int x = 10;
            
            if(x == 10) {
                System.out.println("x等于10");
            }
            
            if((x > 5) || (x == 10)) {
                System.out.println("x大于或者等于10");
            }
            System.out.println("-------------------");
            
            int a = 100;
            
            /*
            if(a == 100) {
                System.out.println("a的值是100");
            }
            */
            
            if(a != 100) {
                System.out.println("a的值是100");
                System.out.println("over");
            }
            System.out.println("-------------------");
            
            int b = 100;
            if(b != 100);  //这里其实是有语句体的,只不过是空语句体。
            
            //代码块
            {
                System.out.println("b的值是100");
                System.out.println("over");
            }
        }
    }

    【if语句格式2】——适合做两个判断

    if(比较表达式) {
        语句体1;
    }else {
        语句体2;
    }

      注意:else后面是没有比较表达式的,只有if后面有。

    执行流程:
      首先计算比较表达式的值,看其返回值是true还是false。
      如果是true,就执行语句体1;
      如果是false,就执行语句体2;

    class IfDemo3 {
        public static void main(String[] args) {
            //判断两个数据是否相等
            
            int a = 10;
            int b = 20;
            
            if(a == b) {
                System.out.println("a等于b");
            }else {
                System.out.println("a不等于b");
            }
        }
    }

       由于if语句的第二种格式刚才也完成了三元运算符可以完成的效果。所以,我们就认为他们可以完成一样的操作。但是,他们就一点区别没有吗?肯定不是。

       区别:三元运算符实现的,都可以采用if语句实现。反之不成立。

      什么时候if语句实现不能用三元改进呢?
        当if语句控制的操作是一个输出语句的时候就不能。
      为什么呢?因为三元运算符是一个运算符,运算符操作完毕就应该有一个结果,而不是一个输出。

    class IfDemo4 {
        public static void main(String[] args) {
            //获取两个数据的最大值
            int a = 10;
            int b = 20;
            
            //用if语句实现
            int max1;
            if(a > b) {
                max1 = a;
            }else {
                max1 = b;
            }
            System.out.println("max1:"+max1);
            
            //用三元改进
            int max2 = (a > b)? a: b;
            System.out.println("max2:"+max2);
            System.out.println("----------");
            
            //判断一个数据是奇数还是偶数,并输出是奇数还是偶数
            int x = 100;
            
            if(x%2 == 0) {
                System.out.println("100是一个偶数");
            }else {
                System.out.println("100是一个奇数");
            } 
            
            //用三元改进
            //这种改进是错误的。
            //String s = (x%2 == 0)?System.out.println("100是一个偶数");:System.out.println("100是一个奇数");;
        }
    }

    【if语句的格式3】——适合做多个判断

    if(比较表达式1) {
        语句体1;
    }else if(比较表达式2) {
        语句体2;
    }else if(比较表达式3) {
        语句体3;
    }
    ...
    else {
        语句体n+1;
    }

    执行流程:
      首先计算比较表达式1看其返回值是true还是false,
      如果是true,就执行语句体1,if语句结束。
      如果是false,接着计算比较表达式2看其返回值是true还是false,
      如果是true,就执行语句体2,if语句结束。
      如果是false,接着计算比较表达式3看其返回值是true还是false,
      ...
      如果都是false,就执行语句体n+1。

    class IfDemo5 {
        public static void main(String[] args) {
            //需求:键盘录入一个成绩,判断并输出成绩的等级。
            /*
                90-100 优秀
                80-90  好
                70-80  良
                60-70  及格
                0-60   不及格
            */
            
            //创建键盘录入对象
            Scanner sc = new Scanner(System.in);
            
            //录入数据
            System.out.println("请输入你的考试成绩:");
            int score = sc.nextInt();
            
            /*
            if(score>=90 && score<=100) {
                System.out.println("优秀");
            }else if(score>=80 && score<90) {
                System.out.println("好");
            }else if(score>=70 && score<80) {
                System.out.println("良");
            }else if(score>=60 && score<70) {
                System.out.println("及格");
            }else {
                System.out.println("不及格");
            }
            */
            //这样写已经满足我的基本要求,但是可能别人在使用的时候,不会按照你要求的数据给出了。
            //在做一个程序的基本测试的时候,一定要考虑这样的几个问题:
            //正确数据,错误数据,边界数据。
            //而我们刚才写的程序并没有处理错误数据,所以这个程序不是很好,要改进
            /*
            if(score>=90 && score<=100) {
                System.out.println("优秀");
            }else if(score>=80 && score<90) {
                System.out.println("好");
            }else if(score>=70 && score<80) {
                System.out.println("良");
            }else if(score>=60 && score<70) {
                System.out.println("及格");
            }else if(score>=0 && score<60){
                System.out.println("不及格");
            }else {
                System.out.println("你输入的成绩有误");
            }
            */
            
            //另一种判断改进
            if(score<0 || score>100) {
                System.out.println("你输入的成绩有误");
            }else if(score>=90 && score<=100) {
                System.out.println("优秀");
            }else if(score>=80 && score<90) {
                System.out.println("好");
            }else if(score>=70 && score<80) {
                System.out.println("良");
            }else if(score>=60 && score<70) {
                System.out.println("及格");
            }else {
                System.out.println("不及格");
            }
        }
    }

    【if语句的练习题】

      A:获取两个数据中较大的值
      B:判断一个数据是奇数还是偶数,并输出是奇数还是偶数

    class IfTest {
        public static void main(String[] args) {
            //创建键盘录入对象
            Scanner sc = new Scanner(System.in);
            
            //获取两个数据中较大的值
            System.out.println("请输入第一个数据:");
            int a = sc.nextInt();
            
            System.out.println("请输入第二个数据:");
            int b = sc.nextInt();
            
            //定义一个变量接收最大值
            int max;
            
            if(a > b) {
                max = a;
            }else {
                max = b;
            }
            
            System.out.println("max:"+max);
            System.out.println("----------------");
            
            //判断一个数据是奇数还是偶数
            System.out.println("请输入你要判断的数据:");
            int x = sc.nextInt();
            
            if(x%2 == 0) {
                System.out.println(x+"这个数据是偶数");
            }else {
                System.out.println(x+"这个数据是奇数");
            }
        }
    }

       键盘录入x的值,计算出y的并输出。

      x>=3 y = 2x + 1;
      -1<=x<3 y = 2x;
      x<=-1 y = 2x – 1;

    /*    
        分析:
            A:由于数据要键盘录入,所以必须使用Scanner。
            B:由于是三种判断,所以我们选择if语句格式3。
    */
    class IfTest2 {
        public static void main(String[] args) {
            //创建键盘录入对象
            Scanner sc = new Scanner(System.in);
            
            System.out.println("请输入x的值:");
            int x = sc.nextInt();
            
            //定义一个y
            int y;
            
            //用if语句格式3进行判断
            if(x >= 3) {
                y = 2*x + 1;
            }else if(x>=-1 && x<3) {
                y = 2*x;
            }else {
                y = 2*x - 1;
            }
            
            System.out.println("y:"+y);
        }
    }

      键盘录入月份的值,输出对应的季节。

    /*    
        春    3,4,5
        夏    6,7,8
        秋    9,10,11
        冬    12,1,2
        
        分析:
            A:键盘录入月份的值,所以我们要使用Scanner。
            B:我们应该判断这个月份在那个季节,而这个判断情况较多,所以,用if语句格式3。
            
        if语句的使用场景:
            A:针对表达式是一个boolean类型的判断
            B:针对一个范围的判断
    */
    class IfTest3 {
        public static void main(String[] args) {
            //创建键盘录入对象
            Scanner sc = new Scanner(System.in);
            
            //录入数据
            System.out.println("请你输入一个月份:");
            int month = sc.nextInt();
            
            //第三种格式实现即可
            if(month<1 || month>12) {
                System.out.println("你输入的月份有误");
            }else if(month == 1) {
                System.out.println("冬季");
            }else if(month == 2) {
                System.out.println("冬季");
            }else if(month == 3) {
                System.out.println("春季");
            }else if(month == 4) {
                System.out.println("春季");
            }else if(month == 5) {
                System.out.println("春季");
            }else if(month == 6) {
                System.out.println("夏季");
            }else if(month == 7) {
                System.out.println("夏季");
            }else if(month == 8) {
                System.out.println("夏季");
            }else if(month == 9) {
                System.out.println("秋季");
            }else if(month == 10) {
                System.out.println("秋季");
            }else if(month == 11) {
                System.out.println("秋季");
            }else {
                System.out.println("冬季");
            }
            System.out.println("--------------");
            
            //这个程序确实是符合了我们的需求,但是就是看起来比较麻烦
            //那么,我们能不能改进一下呢?
            //month == 3
            //month == 4
            //month == 5
            //我们发现,上面三个都是春季。
            //而他们本身每一个都是一个boolean表达式
            //所以,我们就可以考虑使用逻辑运算符给他们连接起来改进
            if(month<1 || month>12) {
                System.out.println("你输入的月份有误");
            }else if(month==3 || month==4 || month==5) {
                System.out.println("春季");
            }else if(month==6 || month==7 || month==8) {
                System.out.println("夏季");
            }else if(month==9 || month==10 || month==11) {
                System.out.println("秋季");
            }else {
                System.out.println("冬季");
            }
            System.out.println("--------------");
            
            //这个时候,程序代码以及可以了。
            //但是呢,假如我要求你输入一个月份,判断是上半年还是下半年。
            //这个时候,我们的判断条件连接就是6个boolean表达式
            //我们可能还有更多的连接
            //这个时候,其实我们还有另外的一种改进方案:
            //month == 3
            //month == 4
            //month == 5
            //month>=3 && month<=5
            //用范围也是可以改进的。
            if(month<1 || month>12) {
                System.out.println("你输入的月份有误");
            }else if(month>=3 && month<=5) {
                System.out.println("春季");
            }else if(month>=6 && month<=8) {
                System.out.println("夏季");
            }else if(month>=9 && month<=11) {
                System.out.println("秋季");
            }else {
                System.out.println("冬季");
            }
            System.out.println("--------------");
        }
    }

      获取三个数据中的最大值

    /*
        由此案例主要是为了讲解if语句是可以嵌套使用的。而且是可以任意的嵌套。
    */
    class IfTest4 {
        public static void main(String[] args) {
            int a = 10;
            int b = 30;
            int c = 20;
            
            //三元实现
            //int temp = (a>b)? a: b;
            //int max = (temp>c)? temp: c;
            //System.out.println("max:"+max);
            //System.out.println("--------");
            
            //用if语句实现
            int max;
            if(a > b) {
                if(a > c) {
                    max = a;
                }else {
                    max = c;
                }
            }else {
                if(b > c) {
                    max = b;
                }else {
                    max = c;
                }
            }
            System.out.println("max:"+max);
        }
    }

    2.2 switch语句

    【switch语句格式】

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

    【格式解释】

      switch:表示这是switch选择结构
      表达式:这个地方的取值是有限定的,只能是byte,short,int,char类型,但是JDK5以后可以是枚举;JDK7以后可以是字符串。
      case:后面跟的是要和表达式进行比较的值
      语句体:要执行的代码
      break:表示中断,结束的意思,可以控制switch语句的结束。
      default:当所有的值都和表达式不匹配的时候,就执行default控制的语句。其实它就相当于if语句的else。

    【执行流程】

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

      

    【案例】

      键盘录入一个数据,根据这个数据,我们输出对应的星期?

        键盘录入1,对应输出星期一

        键盘录入2,对应输出星期二
        ...
        键盘录入7,对应输出星期日

    /*            
        分析:
            1:键盘录入,用Scanner实现
            2:判断我们既可以使用if语句,也可以使用我们要讲解的switch语句
            
        注意:
            A:遇到左大括号缩进一个tab的位置。
            B:关联不是很大的语句间空行
    */
    
    class SwitchDemo {
        public static void main(String[] args) {
            //创建键盘录入对象
            Scanner sc = new Scanner(System.in);
            
            //控制键盘录入数据
            System.out.println("请输入一个数据(1-7):");
            int week = sc.nextInt(); //3
            
            //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("你输入的数据有误");
                    break;
            }
        }
    }

    【switch语句的注意事项】

    1. case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的
    2. default可以省略吗?
      可以省略,但是不建议,因为它的作用是对不正确的情况给出提示。
      特殊情况:判断的值是固定的。(单选题)
    3. break可以省略吗?
      可以省略,但是结果可能不是我们想要的。会出现一个现象:case穿透。最终我们建议不要省略
    4. default一定要在最后吗?
      不是,可以在任意位置。但是建议在最后。
    5. switch语句的结束条件
      a:遇到break就结束了
      b:执行到末尾就结束了 

    【练习】

      模拟单项选择题。

    /*
        分析:
            A:出一个选择题,然后供你选择。
            B:键盘录入选择的数据。
            C:根据选择来给出你选择的结论。
    */class SwitchTest2 {
        public static void main(String[] args) {
            //出一个选择题,然后供你选择。
            //由于我们现在没有办法键盘录入得到一个'A','B'
            //这样的东西,我就用65,66这样的值替代
            //将来我们获取到这样的值以后,强制转换为字符类型
            System.out.println("下面的几个人你最爱谁?");
            System.out.println("65 林青霞");
            System.out.println("66 张曼玉");
            System.out.println("67 刘德华");
            System.out.println("68 王力宏");
            
            //键盘录入选择的数据。
            Scanner sc = new Scanner(System.in);
            
            System.out.println("请输入你的选择:");
            int choiceNumber = sc.nextInt();
            
            //强制转换为字符类型
            char choice = (char) choiceNumber;
            
            switch(choice) {
                case 'A':
                    System.out.println("恭喜你,选择正确");
                    break;
                case 'B':
                    System.out.println("不好意思,你选择有误");
                    break;
                case 'C':
                    System.out.println("不好意思,你选择有误");
                    break;
                case 'D':
                    System.out.println("不好意思,你选择有误");
                    break;
                default:
                    System.out.println("没有该选项");
                    break;
            }
        }
    }

      根据你键盘录入的字符串,判断是否有满足要求的,如果有就输出。否则,提示有误。

    class SwitchTest3 {
        public static void main(String[] args) {
            //创建键盘录入对象
            Scanner sc = new Scanner(System.in);
            
            //录入数据
            System.out.println("请输入你要判断的字符串:");
            String s = sc.nextLine();
            
            switch(s) {
                case "hello":
                    System.out.println("你输入的是hello");
                    break;
                case "world":
                    System.out.println("你输入的是world");
                    break;
                case "java":
                    System.out.println("你输入的是java");
                    break;
                default:
                    System.out.println("没有找到你输入的数据");
                    //break;
            }
        }
    }

      用switch语句实现键盘录入月份,输出对应的季节

    /*
        分析:
            A:键盘录入一个月份,用Scanner实现
            B:用switch语句实现即可
    */class SwitchTest4 {
        public static void main(String[] args) {
            //创建键盘录入对象
            Scanner sc = new Scanner(System.in);
            
            //录入数据
            System.out.println("请输入月份(1-12):");
            int month = sc.nextInt();
            
            /*
            switch(month) {
                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;
                case 8:
                    System.out.println("夏季");
                    break;
                case 9:
                    System.out.println("秋季");
                    break;
                case 10:
                    System.out.println("秋季");
                    break;
                case 11:
                    System.out.println("秋季");
                    break;
                case 12:
                    System.out.println("冬季");
                    break;
                default:
                    System.out.println("你输入的月份有误");
            }
            */
            
            //这样写太麻烦了,我们使用一个我们不想使用的东西:case穿透
            switch(month) {
                case 1:
                case 2:
                case 12:
                    System.out.println("冬季");
                    break;
                case 3:
                case 4:
                case 5:
                    System.out.println("春季");
                    break;
                case 6:
                case 7:
                case 8:
                    System.out.println("夏季");
                    break;
                case 9:
                case 10:
                case 11:
                    System.out.println("秋季");
                    break;
                default:
                    System.out.println("你输入的月份有误");
            }
        }
    }

    2.3 if语句和switch语句的区别

      在做判断的时候,我们有两种选择,if语句和switch语句,那么,我们到底该如何选择使用那种语句呢?
    【if语句使用场景】

    • 针对结果是boolean类型的判断
    • 针对一个范围的判断
    • 针对几个常量值的判断

    【switch语句使用场景】

    • 针对几个常量值的判断

    三、循环结构

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

      循环语句:for循环,while循环,do...while循环。

    3.1 for循环

    【格式】

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

    【执行流程

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

      

    【注意事项】

    1. 判断条件语句无论简单还是复杂结果是boolean类型。
    2. 循环体语句如果是一条语句,大括号可以省略;如果是多条语句,大括号不能省略。建议永远不要省略。
    3. 一般来说:有左大括号就没有分号,有分号就没有左大括号

    【练习】

      请在控制台输出数据1-10
    class ForDemo2 {
            for(int x=1; x<=10; x++) {
                System.out.println(x);
            }
            
            System.out.println("-------------");
            
            //从0开始
            for(int x=0; x<10; x++) {
                System.out.println(x+1);
            }
        }
    }    

      求出1-10之间数据之和

    /*
        分析:
            0+1=1
                1+2=3
                    3+3=6
                        6+4=10
                            10+5=15
                                 ...
                                 
            由此可见我们要定义两个变量:
                一个变量用于存储第一个加数,第一个加数其实保存的是以前的所有数据和。默认初始化值应该是0。
                一个变量用于存储第二个加数,第二个加数其实就是每次的数据变化的值。
                
        求和思想。        
    */
    class ForDemo3 {
        public static void main(String[] args) {
            //原始做法
            System.out.println(1+2+3+4+5+6+7+8+9+10);
            
            //定义第一个加数
            int sum = 0;
            
            for(int x=1; x<=10; x++) {
                //这里的x其实是第二个加数
                sum = sum + x;
                /*
                    0 + 1 = 1
                            1 + 2 = 3
                                    3 + 3 = 6
                                    ...
                */
                
                //sum += x;
            }
            System.out.println("sum:"+sum);
        }
    }

      求1-100之和、求出1-100之间偶数和

    class ForDemo4 {
        public static void main(String[] args) {
            //求1-100之和。
            int sum1 = 0;
            
            for(int x=1; x<=100; x++) {
                sum1 +=x;
            }
            
            System.out.println("1-100之和是:"+sum1);
            System.out.println("------------------");
            
            //求出1-100之间偶数和
            //方式1
            int sum2 = 0;
            
            for(int x=1; x<=100; x++) {
                if(x%2 == 0) {
                    sum2 += x;
                }
            }
            
            System.out.println("1-100偶数之和是:"+sum2);
            System.out.println("------------------");
            
            //方式2
            int sum3 = 0;
            
            for(int x=0; x<=100; x+=2) {
                    sum3 += x;
            }
            
            System.out.println("1-100偶数之和是:"+sum3);
            System.out.println("------------------");
        }
    }

      求5的阶乘

    class ForDemo5 {
        public static void main(String[] args) {
            //定义最终结果变量
            int jc = 1;
            
            //这里的x其实可以直接从2开始
            //for(int x=1; x<=5; x++) 
            
            for(int x=2; x<=5; x++) {
                jc *=x;
            }
            
            System.out.println("1-5的阶乘是:"+jc);
        }
    }

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

    /*
        分析:
            我们都不知道什么叫"水仙花数",你让我怎么做呢?
            
            所谓的水仙花数是指一个三位数,其各位数字的立方和等于该数本身。
            举例:153就是一个水仙花数。
            153 = 1*1*1 + 5*5*5 + 3*3*3 = 1 + 125 + 27 = 153
    
            A:三位数其实是告诉了我们范围。
            B:通过for循环我们就可以实现获取每一个三位数
              但是麻烦是如何获取这个三位数的个,十,百位上的数据
              
              我们如何获取一个数据的个,十,百呢?
                假设有个一个数据:153
                ge:    153%10 = 3
                shi: 153/10%10 = 5
                bai:153/10/10%10 = 1
                qian:x/10/10/10%10
                wan:  x/10/10/10/10%10
                ...
    
            C:让ge*ge*ge+shi*shi*shi+bai*bai*bai和该数据比较
              如果相同,就把该数据在控制台输出。
    */
    class ForDemo6 {
        public static void main(String[] args) {
            //三位数其实是告诉了我们范围。
            for(int x=100; x<1000; x++) {
                int ge = x%10;
                int shi = x/10%10;
                int bai = x/10/10%10;
                
                //让ge*ge*ge+shi*shi*shi+bai*bai*bai和该数据比较
                if(x == (ge*ge*ge+shi*shi*shi+bai*bai*bai)) {
                    //如果相同,就把该数据在控制台输出。
                    System.out.println(x);
                }
            }
        }
    }

      请在控制台输出满足如下条件的五位数
        个位等于万位
        十位等于千位
        个位+十位+千位+万位=百位

    /*
        分析:
            A:五位数就告诉了我们范围。
            B:分解每一个五位数的个,十,百,千,万位上的数据
            C:按照要求进行判断即可
    */
    class ForDemo7 {
        public static void main(String[] args) {
            //五位数就告诉了我们范围。
            for(int x=10000; x<100000; x++) {
                //分解每一个五位数的个,十,百,千,万位上的数据
                int ge = x%10;
                int shi = x/10%10;
                int bai  = x/10/10%10;
                int qian = x/10/10/10%10;
                int wan = x/10/10/10/10%10;
                
                //按照要求进行判断即可
                if((ge==wan) && (shi==qian) && (ge+shi+qian+wan==bai)) {
                    System.out.println(x);
                }
            }
        }
    }

      统计”水仙花数”共有多少个

    /*    
        分析:
            A:首先必须知道什么是水仙花数
                所谓的水仙花数是指一个三位数,其各位数字的立方和等于该数本身。
                举例:153就是一个水仙花数。
                153 = 1*1*1 + 5*5*5 + 3*3*3 = 1 + 125 + 27 = 153
            B:定义统计变量,初始化值是0
            C:三位数告诉了我们范围,用for循环就可以搞定
            D:获取每一个三位数的个,十,百的数据
            E:按照要求进行判断
            F:如果满足要求就计数。
    */
    class ForDemo8 {
        public static void main(String[] args) {
            //定义统计变量,初始化值是0
            int count = 0;
            
            //三位数告诉了我们范围,用for循环就可以搞定
            for(int x=100; x<1000; x++) {
                //获取每一个三位数的个,十,百的数据
                int ge = x%10;
                int shi = x/10%10;
                int bai = x/10/10%10;
                
                //按照要求进行判断
                if(x == (ge*ge*ge+shi*shi*shi+bai*bai*bai)) {
                    //如果满足要求就计数。
                    count++;
                }
            }
            
            System.out.println("水仙花数共有"+count+"个");
        }
    }

      请统计1-1000之间同时满足如下条件的数据有多少个:
        对3整除余2
        对5整除余3
        对7整除余2

    /*
        分析:
            A:定义统计变量,初始化值是0
            B:1-1000之间是一个范围,用for很容易就可以实现。
            C:每个数据要同时满足如下要求
                x%3==2
                x%5==3
                x%7==2
            D:如果满足条件,统计数据++即可,最后输出统计变量
    */
    class ForDemo9 {
        public static void main(String[] args) {
            //定义统计变量,初始化值是0
            int count = 0;
        
            //1-1000之间是一个范围,用for很容易就可以实现。
            for(int x=1; x<=1000; x++) {
                /*
                    每个数据要同时满足如下要求
                    x%3==2
                    x%5==3
                    x%7==2
                */
                if(x%3==2 && x%5==3 && x%7==2) {
                    count++;
                    System.out.println(x);
                }
            }
            
            //输出数据
            System.out.println("满足这样条件的数据共有:"+count+"个");
        }
    }

    3.2 while语句

    【基本格式】

    while(判断条件语句) {
        循环体语句;
    }

    【扩展格式】

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

      通过这个格式,我们就可以看到其实和for循环是差不多的。

    class WhileDemo {
        public static void main(String[] args) {
            //输出10次"HelloWorld"
            //for语句版
            for(int x=0; x<10; x++) {
                System.out.println("HelloWorld");
            }
            System.out.println("--------------");
            //while语句版
            int x=0;
            while(x<10) {
                System.out.println("HelloWorld");
                x++;
            }
        }
    }

     【练习】

      求出1-100之和

    class WhileDemo2 {
        public static void main(String[] args) {
            //求出1-100之和
            //for语句版本
            int sum = 0;
            
            for(int x=1; x<=100; x++) {
                sum+=x;
            }
            
            System.out.println("sum:"+sum);
            System.out.println("--------");
            //while语句版本
            int sum2 = 0;
            
            int y=1;
            while(y<=100) {
                sum2+=y;
                y++;
            }
            
            System.out.println("sum2:"+sum2);
            System.out.println("--------");
        }
    }

       统计水仙花数有多少个

    class WhileDemo3 {
        public static void main(String[] args) {
            //for循环版本
            int count = 0;
            
            for(int x=100; x<1000; x++) {
                int ge = x%10;
                int shi = x/10%10;
                int bai = x/10/10%10;
                
                if((ge*ge*ge+shi*shi*shi+bai*bai*bai) == x) {
                    count++;
                }
            }
            
            System.out.println("count:"+count);
            System.out.println("------------");
            
            //while循环版本
            int count2 = 0;
            
            int y = 100;
            while(y<1000) {
                int ge = y%10;
                int shi = y/10%10;
                int bai = y/10/10%10;
                
                if((ge*ge*ge+shi*shi*shi+bai*bai*bai) == y) {
                    count2++;
                }
                
                y++;
            }
            
            System.out.println("count2:"+count2);
        }
    }

      我国最高山峰是珠穆朗玛峰:8848m,我现在有一张足够大的纸张,厚度为:0.01m。
      请问,我折叠多少次,就可以保证厚度不低于珠穆朗玛峰的高度?

    /*
        分析:
            A:定义一个统计变量,默认值是0
            B:最高山峰是珠穆朗玛峰:8848m这是最终的厚度
              我现在有一张足够大的纸张,厚度为:0.01m这是初始厚度
            C:我折叠多少次,就可以保证厚度不低于珠穆朗玛峰的高度?
              折叠一次有什么变化呢?就是厚度是以前的2倍。
            D:只要每次变化的厚度没有超过珠穆朗玛峰的高度,就折叠,统计变量++
            E:输出统计变量。
    */
    
    class WhileDemo5 {
        public static void main(String[] args) {
            //定义一个统计变量,默认值是0
            int count = 0;
            
            //最高山峰是珠穆朗玛峰:8848m这是最终的厚度
            //我现在有一张足够大的纸张,厚度为:0.01m这是初始厚度
            //为了简单,我把0.01变成1,同理8848就变成了884800
            int end = 884800;
            int start = 1;
            
            while(start<end) {
                //只要每次变化的厚度没有超过珠穆朗玛峰的高度,就折叠,统计变量++
                count++;
                
                //折叠一次有什么变化呢?就是厚度是以前的2倍。
                start *= 2;
                
                    
            }
            
            //输出统计变量。
            System.out.println("要叠"+count+"次");
        }
    }

    3.3 do...while循环

    【基本格式】

    do {
        循环体语句;
    }while(判断条件语句);

    【扩展格式】

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

      

    class DoWhileDemo {
        public static void main(String[] args) {
            //输出10次HelloWorld。
            int x = 0;
            do {
                System.out.println("HelloWorld");
                x++;
            }while(x<10);
            
            System.out.println("--------------");
            
            //求和1-100
            int sum = 0;
            int a = 1;
            do {
                sum += a;
                a++;
            }while(a<=100);
            
            System.out.println(sum);
        }
    }

    3.4 三种循环语句的区别

      三种循环语句其实都可以完成一样的功能,也就是说可以等价转换,但还是有小区别的:

       do...while循环至少执行一次循环体。

      而for,while循环必须先判断条件是否成立,然后决定是否执行循环体语句。

      那么,我们一般使用哪种循环呢?

      优先考虑for,其次考虑while,最后考虑do...while

    【for和while的区别】

      如果你想在循环结束后,继续使用控制条件的那个变量,用while循环,否则用for循环。不知道用for循环。因为变量及早的从内存中消失,可以提高内存的使用效率。

      其实还有一种场景的理解:

      如果是一个范围的,用for循环非常明确。
      如果是不明确要做多少次,用while循环较为合适。
        举例:吃葡萄。

    class WhileDemo4 {
        public static void main(String[] args) {
            //for循环实现
            for(int x=0; x<10; x++) {
                System.out.println("while循环和for循环的区别");
            }
            //这里不能在继续访问了
            //System.out.println(x);
            
            //while循环实现
            int y = 0;
            while(y<10) {
                System.out.println("while循环和for循环的区别");
                y++;
            }
            //这里是可以继续访问的
            System.out.println(y);
        }
    } 

    3.5 死循环问题

      一定要注意控制条件语句控制的那个变量的问题,不要弄丢了,否则就容易死循环。

      两种最简单的死循环格式:

      while(true){...}
      for(;;){...}

    class DoWhileDemo3 {
        public static void main(String[] args) {
            int x = 0;
            while(x < 10) {
                System.out.println(x);
                x++;
            }
            System.out.println("--------------");
            
            /*
            while(true) {
                System.out.println("今天我很高兴,学习了死循环");
            }
            */
            
            for(;;){
                System.out.println("今天我很高兴,学习了死循环");
            }
            
            //System.out.println("--------------");
        }
    }

    3.6 循环嵌套

      请输出一个4行5列的星星(*)图案。

    /*
        结果:
            *****
            *****
            *****
            *****
    
        循环嵌套:就是循环语句的循环体本身是一个循环语句。
    
        通过结果我们知道这样的一个结论:
            外循环控制行数
            内循环控制列数
     */
    public class ForForDemo {
        public static void main(String[] args) {
            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 5; j++) {
                    System.out.print("* ");
                }
                //我们可以通过空的输出语句实现换行:System.out.println();
                System.out.println();
            }
        }
    }

      请输出下列的形状
      *
      **
      ***
      ****
      *****

    class ForForDemo2 {
        public static void main(String[] args) {
            //通过简单的观察,我们看到这是一个行是5,列数是变化的形状
            //我们先打印出一个5行5列的形状
            for(int x=0; x<5; x++) {
                for(int y=0; y<5; y++) {
                    System.out.print("*");
                }
                System.out.println();
            }
            
            System.out.println("--------------");
            
            //我们实现了一个5行5列的形状
            //但是这不是我们想要的
            //我们要的是列数变化的
            //列数是如何变化的呢?
            //第一行:1列    y=0,y<=0,y++
            //第二行:2列    y=0,y<=1,y++
            //第三行:3列    y=0,y<=2,y++
            //第四行:4列    y=0,y<=3,y++
            //第五行:5列    y=0,y<=4,y++
            //在看外循环x的变化,恰好就是x=0,1,2,3,4
            //所以这个最终版的程序就是如下
            for(int x=0; x<5; x++) {
                for(int y=0; y<=x; y++) {
                    System.out.print("*");
                }
                System.out.println();
            }
        }
    }

      在控制台输出九九乘法表

    /*
        首先我们写出九九乘法表:
            1*1=1
            1*2=2    2*2=4
            1*3=3    2*3=6    3*3=9
            1*4=4    2*4=8    3*4=12    4*4=16
            ...
            1*9=9    2*9=18    3*9=27    ...
            
        我们先把这个九九乘法表看出是这样的一个形状:
            *
            **
            ***
            ****
            *****
            ******
            *******
            ********
            *********
            
        注意:
            'x' x表示任意,这种做法叫转移字符。
            
            '	'    tab键的位置
            '
    '    回车
            '
    '    换行
    */
    class ForForDemo3 {
        public static void main(String[] args) {
            for(int x=0; x<9; x++) {
                for(int y=0; y<=x; y++) {
                    System.out.print("*");
                }
                System.out.println();
            }
            System.out.println("--------------");
            //为了使用数据,我们从1开始
            for(int x=1; x<=9; x++) {
                for(int y=1; y<=x; y++) {
                    System.out.print(y+"*"+x+"="+y*x+"	");
                }
                System.out.println();
            }
        }
    }

    四、跳转控制语句

      前面我们已经说过了,Java中的goto是保留字,目前不能使用。虽然没有goto语句可以增强程序的安全性,但是也带来很多不便,比如说,我想在某个循环知道到某一步的时候就结束,现在就做不了这件事情。为了弥补这个缺陷,Java就提供了break,continue和return来实现控制语句的跳转和中断。

    • break 中断
    • continue 继续
    • return 返回

    4.1 break 

      break:中断的意思

    【使用场景】

    1. switch语句中
    2. 循环语句中。(循环语句中加入了if判断的情况)

      注意:离开上面的两个场景,无意义。

    【如何使用呢】

      1、跳出单层循环

      2、跳出多层循环(开发中用的少)。

        要想实现这个效果,就必须知道一个东西。带标签的语句。格式: 标签名: 语句 

    class BreakDemo {
        public static void main(String[] args) {
            //报错:在 switch 或 loop 外部中断
            //break;
            
            //跳出单层循环
            for(int x=0; x<10; x++) {
                if(x == 3) {
                    break;
                }
                System.out.println("HelloWorld");
            }
            
            System.out.println("over");
            System.out.println("-------------");
            
            wc:for(int x=0; x<3; x++) {
                nc:for(int y=0; y<4; y++) {
                    if(y == 2) {
                        //break nc;
                        //跳出多层循环
                        break wc;
                    }
                    System.out.print("*");
                }
                System.out.println();
            }
        }
    }

    4.2 continue

      continue:继续

    【使用场景】

      循环中。离开此场景无意义。

    【continue和break的区别】

    • break:跳出单层循环
    • continue:跳出一次循环,进入下一次的执行
    class ContinueDemo {
        public static void main(String[] args) {
            for(int x=0; x<10; x++) {
                if(x == 3) {
                    //break;//输出的是012
                    continue;//输出的是012456789
                }
                
                System.out.println(x);
            }
        }
    }

    【练习】

    for(int x=1; x<=10; x++) {
        if(x%3==0) {
            //在此处填写代码
        }
        System.out.println(“Java基础班”);
    }

      我想在控制台输出2次:“Java基础班“——break;

      我想在控制台输出7次:“Java基础班“——continue;

      我想在控制台输出13次:“Java基础班“——System.out.println(“Java基础班”);

    4.3 return

      return:返回

      它的作用不是结束循环的,而是结束方法的。

    class ReturnDemo {
        public static void main(String[] args) {
            for(int x=0; x<10; x++) {
                if(x == 2) {
                    System.out.println("退出");
                    //break;//输出0 1 退出 over
                    //continue;//输出0 1 退出 3 4 5 6 7 8 9 over
                    return;//输出0 1 退出
                }
                
                System.out.println(x);
            }
            
            System.out.println("over");
        }
    }

    五、循环语句结合break的练习

      需求:小芳的妈妈每天给她2.5元钱,她都会存起来,但是,每当这一天是存钱的第5天或者5的倍数的话,她都会花去6元钱
      请问,经过多少天,小芳才可以存到100元钱。

    /*
        分析:
            A:小芳的妈妈每天给她2.5元钱
                double dayMoney = 2.5;
            B:她都会存起来
                double daySum = 0;
            C:从第一天开始存储
                int dayCount = 1;
            D:经过多少天,小芳才可以存到100元钱。
                double result = 100;
            E:这一天是存钱的第5天或者5的倍数的话,她都会花去6元钱,
                说明要判断dayCount的值,如果对5整除就减去6元钱。
                    daySum -= 6;
              由此还隐含了一个问题,就是如果不是5的倍数天的话,钱要累加
                    daySum += dayMoney;
            F:因为不知道是多少天,所以我用死循环,一旦超过100元我就退出循环。
    */
    class WhileDemo {
        public static void main(String[] args) {
            //每天要存储的钱是2.5元
            double dayMoney = 2.5;
            
            //存钱的初始化值是0
            double daySum = 0;
            
            //从第一天开始存储
            int dayCount = 1;
            
            //最终存储不小于100就不存储了
            int result = 100;
            
            //因为不知道是多少天,所以我用死循环,
            while(true) {
                //累加钱
                daySum += dayMoney;
                
                //一旦超过100元我就退出循环。
                if(daySum >= result) {
                    System.out.println("共花了"+dayCount+"天存储了100元");
                    break;
                }
                
                if(dayCount%5 == 0) {
                    //花去6元钱
                    daySum -= 6;
                    System.out.println("第"+dayCount+"天花了6元钱");
                }
                
                //天数变化
                dayCount++;
            }
        }
    }
  • 相关阅读:
    things to analysis
    retrieve jenkins console output
    temp
    temp
    mysql on Mac OS
    Scala的几个小tips
    docker查看容器使用率
    JVM性能监控(jconsole和jvisualvm)
    线程死锁问题
    线程阻塞状态
  • 原文地址:https://www.cnblogs.com/yft-javaNotes/p/10789823.html
Copyright © 2020-2023  润新知