控制语句、方法、递归算法

控制语句

控制语句:把语句组合成能完成一定功能的小逻辑模块。它分为三类:顺序、选择和循环。

  1. “顺序结构”代表“先执行a,再执行b”的逻辑
  2. “条件判断结构”代表“如果…,则…”的逻辑
  3. “循环结构”代表“如果…,则重复执行”的逻辑

很神奇的是,三种流程控制语句就能表示所有的事情!实际上,任何软件和程序,小到一个练习,大到一个操作系统,本质上都是由“变量、选择语句、循环语句”组成

条件判断结构(选择结构)

条件判断结构:if结构和switch结构。而if结构又可以分为if单分支结构、if-else双分支结构、if-else if-else多分支结构。

image.png

单分支结构

流程图

image.png

语法结构

下面的语法结构和上面图对应

if(布尔表达式){

  语句块
}


备注

  1. 如果if语句不写{},则只能作用于后面的第一条语句。
  2. 强烈建议,任何时候都写上{},即使里面只有一句话!

敲代码】if单分支结构(掷骰子游戏)

public class Test01 {  
  
    public static void main(String[] args) {  
        int i = (int) (Math.random() * 6 + 1);  
        int j = (int) (Math.random() * 6 + 1);  
        int k = (int) (Math.random() * 6 + 1);  

        int count = i + j + k;  
        System.out.println("第一个骰子:" + i );  
        System.out.println("第二个骰子:" + j );  
        System.out.println("第三个骰子:" + k );  

        if(count > 15){  
            System.out.println("今天手气不错!再来一把");  
        }  
        if(count>=10 && count < 15){  
            System.out.println("手气一般!再来两把");  
        }  
        if(count < 10){  
            System.out.println("手气差点,下次再来吧!");  
        }  

        System.out.println("今天掷骰子得分:" + count);  
    }  
}

image.png

备注:Math类的使用

  • Java.lang包中的Math类提供了一些用于数学计算的方法。
  • Math.random()该方法用于产生0到1区间的double类型的随机数,但是不包括1。如:int i = (int)(6*random()); 产生[0,5]之间的随机整数(假如是0.9 * 6 取整也是5)

if-else双分支结构

流程图

image.png

语法结构

下面的语法结构和上面图对应

if(布尔表达式){

  语句块1
}else{
  语句块2
}

敲代码

import java.util.Arrays;  
/**  
* 测试if-else 双分支结构  
*/  
public class Test02 {  
  
    public static void main(String[] args) {  
        double r = 4 * Math.random();  
        double area = 3.14 * r * r;  
        double circle = 2 * Math.PI * r;  

        System.out.println("半径:" + r);  
        System.out.println("周长:" + circle);  
        System.out.println("面积:" + area);  


        if (area >= circle) {  
            System.out.println("面积的数值大于等于周长");  
        } else {  
            System.out.println("面积的数值小于周长");  
        }  


        // 条件运算符  


        int a = 3,b = 4;  
        int c = a<b?b:a;  
        System.out.println("较大数是:" + c); // 把a和b中大的数返回  

        // 把a和b中,较大的数返回  
        if(a<b){  
            c = b;  
        }else{  
            c = a;  
        }  
        System.out.println("较大数是:" + c);  
    }  
}

if-else if -else多分支结构

流程图

image.png

语法结构

下面的语法结构和上面图对应

if(布尔表达式1){
  语句块1;
}else if(布尔表达式2){
  语句块2;
}... ...
else if(布尔表达式n){
  语句块n;
}else{
  语句块
}

敲代码 1

/**













 * 测试多分支结构

 */

















public class Test03 {



    public static void main(String[] args) {

        int i = (int) (Math.random() * 6 + 1);
        int j = (int) (Math.random() * 6 + 1);
        int k = (int) (Math.random() * 6 + 1);

        int count = i + j + k;
        System.out.println("第一个骰子:" + i);
        System.out.println("第二个骰子:" + j);
        System.out.println("第三个骰子:" + k);


        if (count > 15) {
            System.out.println("今天手气不错!再来一把");
        } else if (count >= 10) {
            System.out.println("手气一般!再来两把");
        } else {
            System.out.println("手气不行,明天再来吧");
        }
        System.out.println("今天掷骰子得分:" + count);
    }
}

运行结果

image.png

备注

image.png

为什么标注的地方不写count>=10 && count < 15,因为如果大于15就会走第一个if,只要不大于15,就会后面的else if ,因此就相当于count>=10 && count < 15

敲代码 2

/**













 * 测试多分支结构

 */

















public class Test03 {



    public static void main(String[] args) {

        int age = (int)(120*Math.random());
        System.out.println("年龄是:"+ age);
        // 15以下(不含15):儿童,15-24青年,25-44中年,45-64中老年,65-84老年,85-99老寿星,100-109百岁老人,110以上,打破年龄最长记录
        if(age<15){
            System.out.println("儿童,好好玩");
        }else if(age<25){
            System.out.println("青年,好好读书");
        }else if(age<45){
            System.out.println("中年,好好工作,养家糊口");
        }else if(age<65){
            System.out.println("中老年,遛遛狗,下下棋,泡泡茶,吹吹牛");
        }else if(age<85){
            System.out.println("老年,今天跳广场舞了吗?");
        }else if(age<100){
            System.out.println("老寿星,家有一老,如有一宝");
        }else if(age<110){
            System.out.println("百岁老人,跨世纪的见证者");
        }else{
            System.out.println("110岁以上,已经打破世界记录了");
        }
}

运行结果

image.png

switch多分枝结构(多值情况)

流程图

image.png

语法结构

与上图相对应的语法结构:

switch(表达式){
    case 值1:
        语句块1;
        [break];
    case 值2:
        语句块2;
        [break];

}

...  ...   ...  ...
    [default:
      默认语句块:]
}   

备注

  • 语法结构中使用“[]”标注的都是可选的,如break 是可选的,如果没有break,就会向下执行后面的语句,直到碰到break为止
  • switch会根据表达式的值从相匹配的case标签处开始执行,一直执行break处或者switch的末尾。如果表达式的值与任一case值不匹配,则进入default语句
  • switch中表达式中的值,是int(byte、short、char也可,long不行)、枚举、字符串

敲代码

/**













 * 测试switch语句的用法
 */

















public class TestSwitch01 {
    public static void main(String[] args) {







        int grade = (int)(Math.random()*4)+1;
        System.out.println("你的年级是:"+grade);
        switch (grade){
            case 1:
                System.out.println("大一,输出博客,坚持运动");
            break;
            case 2:
                System.out.println("多参加学校的党组织部门和活动,锻炼融入社会的能力");
            break;
            case 3:
                System.out.println("准备考研或者为校招做准备");
            case 4:
                System.out.println("做好简历,海量投和面试,积累经验");
            default:
                System.out.println("你已经毕业了");
        }
    }


}

运行结果

image.png

敲代码

/**













 * 测试switch语法
 */

















public class TestSwitch02 {
    public static void main(String[] args) {







        int month = (int)(Math.random()*12)+1;
        switch (month){
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
            case 6:
                System.out.println(month + "月,属于上半年");
                break;
            default:
                System.out.println(month + "月,属于下半年");
                break;
        }

    }

}

运行结果

image.png

备注

充分利用了switch中break的特点,如果没有break,那么程序就按顺序执行下一行,并且下一行中不再判断case中的条件是否满足,直接执行语句(一直执行到有break的地方为止)。

敲代码

/**













 * 测试switch
 */

















public class TestSwitch03 {
    public static void main(String[] args) {







        String str = "a";
        switch (str){
            case "a":
                System.out.println("a");
            case "A":
                System.out.println("A");
                break;
            default:
                System.out.println("*");
        }

    }

}

运行结果

image.png

循环while

介绍

循环结构分两大类,一类是当型,一类是直到型

  1. 当型

当布尔表达式条件为true,反复执行某语句,当布尔表达式的值为false是时才停止循环,比如while与for循环(为主)

  1. 直到型

先执行某语句,再判断布尔表达式,如果为true,再执行某语句,如此反复,直到布尔表达式条件为false时才停止循环,比如 do -whitle

语法结构

流程图

image.png

语法结构

whtile(布尔表达式){
    循环体
}


备注

1.在循环刚开始时,会计算一次“布尔表达式”的值,若条件为真,执行循环体。而后来每一次额外的循环,都会在开始前重新计算一次

  1. 语句中应有使循环趋向于结束的语句,否则会出现无限循环 – “死”循环

敲代码

/**













 * 测试while循环

 */

















public class TestWhile {

    public static void main(String[] args) {



        int a = 0;
        while (a<3){
            System.out.println("while循环了"+ a + "次");
            a++;
        }
    }
}

运行结果

image.png

备注

while循环中布尔表达式中的变量,在循环体中要发生变化,否则就会死循环

敲代码

/**













 * 测试while循环

 */

















public class TestWhile {

    public static void main(String[] args) {



        // 累加: 0+ 1 + 2 + 3 + 4 + ... + 100
        int i = 0;
        int sum = 0;
        while (i<=100){
            sum = sum + i;
            i++;
        }


        System.out.println("1累加到100的和为:" + sum);
    }
}

运行结果

image.png

循环结构for

流程图

本质上和while是一样的

image.png

语法结构

for(初始表达式;布尔表达式;迭代因子){
  循环体;
}


备注

  • 初始化部分设置:循环变量的初值
  • 条件判断部分为:布尔表达式
  • 迭代因子:控制循环变量的增减

for循环在执行条件判定后,先执行循环体部分,再执行迭代因子

敲代码

/**



 * 测试for循环


 */

















public class TestFor {
    public static void main(String[] args) {



        /*
            int a = 0;    // 初始化部分
            while (a<3){  // 布尔表达式
                System.out.println("while循环了"+ a + "次");  // 循环体
                a++;      // 迭代因子
            }
        */

        // 使用for循环对while其改在
        for (int a = 0; a < 3; a++) {
            System.out.println("进入for循环" + a + "次");
        }
        System.out.println();

        /*
            // 累加: 0+ 1 + 2 + 3 + 4 + ... + 100
            int i = 0;
            int sum = 0;
            while (i<=100){
                sum = sum + i;
                i++;
            }
            System.out.println("1累加到100的和为:" + sum);
        */


        // 使用for循环对while其改在
        int sum = 0;
        for (int i = 0; i <= 100; i++) {
            sum = sum + i;
        }
        System.out.println("1累加到100的和为:" + sum);
    }
}

运行结果

image.png

敲代码

/**













 * 测试for循环


 */

















public class TestFor02 {
    public static void main(String[] args) {



        // 输入9-1间的数
        for(int i = 9;i>0;i--){
            System.out.print(i + "\t");
        }

    }
}

运行结果

image.png

敲代码

/**













 * 测试for循环


 */

















public class TestFor03 {
    public static void main(String[] args) {



        // 测试90-1之间能被3整除的数
        for(int i=90;i>0;i--){
            if(i%3==0){
                System.out.println("90-1之间能被3整除的数:"+ i);
            }


        }


    }


}


或者我们发现90是能被3整除的,它后面的隔3个数的数也能被3整除

public class TestFor03 {
    public static void main(String[] args) {
        // 测试90-1之间能被3整除的数
  
        for(int i=90;i>0;i-=3){
            System.out.println("90-1之间能被3整除的数:"+ i);
        }
    }
}

运行结果
11.gif

do while循环(了解即可)

流程图

image.png

语法结构

do {
  循环体;
}whuile(布尔表达式)

do-while循环结构会先执行循环体,然后再判断布尔表达式的值,也就是说不管条件符不符合至少执行一次

练习

  1. 计算100之内的累加和、所有奇数和、所有偶数和

敲代码

/**



 * 计算100之内的累加和、所有奇数和、所有偶数和
 */

















public class Exe1Sum100 {
    public static void main(String[] args) {




        int sum = 0;     // 总和
        int oddSum = 0;  // 奇数和
        int evenSum = 0; // 偶数和
        for(int i=0;i<=100;i++){
            sum = sum + i;
        }


        // 使用while循环写
        int a = 0;
        while (a<=100){
            a++;
            if(a%2==0){
                evenSum += a;
            }else{
                oddSum += a;


            }
        }
        // 使用for循环写:
        for(int a=0;a<=100;a++){
            if(a%2==0){
                evenSum += a;
            }else{
                oddSum += a;


            }
        }
        System.out.println("100之内偶数和"+ evenSum);
        System.out.println("100之内奇数和"+ oddSum);
        System.out.println("100之内的累加和"+ sum);
    }
}

备注

for循环中的变量i仅限于for循环中使用,出了for循环使用就会报错

运行结果

image.png

  1. 循环0-130之间的数字,每行显示5个数字

敲代码

方法一: 值能被5整除就换行

/**













 * 循环0-130之间的数字,每行显示5个数字

 */

















public class ExePring0_130Bye5 {
    public static void main(String[] args) {







        for(int i=1;i<=130;i++){
            System.out.print(i + "\t");
            if(i%5==0){
                System.out.println();
            }


        }


    }


}


方法二: 添加计数器,每行计5个就换行

/**



 * 循环0-130之间的数字,每行显示5个数字

 */

















public class ExePring0_130Bye5 {
    public static void main(String[] args) {



        int count = 0;    // 每行打印了几个数
        for(int i=1;i<=130;i++){
            System.out.print(i + "\t");
            count++;
            if(count == 5){
                System.out.println();
                count = 0;
            }

        }

    }

}

运行结果

12.gif

嵌套循环

循环语句内部,再写一个或多个循环,称为嵌套循环。一般常见的就两层

练习1】:第一行输出5个1,第二行输出5个2,第三行输出5个3… … 直到第五行输出5
个5

敲代码

/**













 * 测试嵌套循环
 */

















public class TestNestedLoop {
    public static void main(String[] args) {







        for(int m=1;m<=5;m++){
            for(int i=0;i<5;i++){
                System.out.print(m + "\t");
            }
            System.out.println();
        }


    }


}


运行结果

image.png

练习2】:使用嵌套for循环打印9*9乘法口诀表

image.png

备注

我们要学会将复杂的问题拆分成简单的问题,然后再逐渐加大难度

9行我们做不出来,但是我们可以先做一行,比如先做第三行这一行,这一行3是固定的,1、2、3就用循环做

敲代码

/**













 * 九九乘法表

 */

















public class MultiplicationTable {

    public static void main(String[] args) {







        // 1*3 2*3 3*3
        for(int i=1;i<=3;i++){
            System.out.print(i+"*3"+"="+(i*3)+"\t");
        }

        System.out.println();
        // 1*4 2*4 3*4 4*4
        for(int i=1;i<=4;i++){
            System.out.print(i+"*4"+"="+(i*4)+"\t");
        }
    }
}

运行结果

image.png

考虑使用嵌套循环,解决重复的过程

/**













 * 九九乘法表

 */

















public class MultiplicationTable {

    public static void main(String[] args) {







        for(int m=1;m<=9;m++){
           // 思考下为什么不是i<=9?
            for(int i=1;i<=m;i++){
                System.out.print(i+"*"+m+"="+(i*m)+"\t");
            }


            System.out.println();
        }


    }
}

运行结果

image.png

练习3】:使用嵌套循环打印出 5*5的方阵,格式如下

image.png

方法一: 使用计数器count,count=1打印”*”,count=2打印”#”

/**



 * 使用嵌套循环打印出5x5方阵

 */

















public class PhalanxBy5X5 {
    public static void main(String[] args) {



        int count = 0;
        for(int m=1;m<=5;m++){
            for(int n=1;n<=5;n++){
                count++;
                if(count==2){
                    System.out.print("#"+ "\t");
                    count = 0;
                }else{
                    System.out.print("*"+ "\t");
                }

            }
            System.out.println();
        }

    }

}

方法二:m+n如果是奇数就输出”*”,m+n如果是偶数就输出”#”

/**













 * 使用嵌套循环打印出5x5方阵

 */

















public class PhalanxBy5X5 {
    public static void main(String[] args) {







        // 方法二:m+n如果是奇数就输出"*",m+n如果是偶数就输出"#"
        for(int m=1;m<=5;m++){
            for(int n=1;n<=5;n++){
                if((m+n)%2 == 0){
                    System.out.print("*"+ "\t");
                }else{
                    System.out.print("#"+ "\t");
                }
            }
            System.out.println();
        }

    }
}

运行结果

image.png

break语句和continue语句

流程图

image.png

区别

  1. break用于强制退出整个循环
  2. continue用于结束本次循环,继续下一次循环

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYw8B4qq' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片