JAVA基础——控制结构(韩顺平P104-P154)

目录

一、顺序控制

二、分支控制(if; else; switch)

1、if else

2、switch分支

三、循环控制(for; while; dowhile; 多重循环)

1、for循环

2、while循环

3、do while

4、多重循环(重难点)

四、break(跳转控制语句)

五、continue

六、return


程序运行的流程控制决定程序是如何执行的

一、顺序控制

程序从上到下逐行地执行,中间没有任何判断和跳转。(程序默认的)

  • 向前引用原则:要先定义再引用。

二、分支控制(if; else; switch)

1、if else

让程序有选择的执行,分支控制有三种:

  • 1、单分支
    • 如下:当条件表达式为真的时候,就会执行{}中的代码,如果为false就不执行。特别说明:如果{}中只有一条语句,大括号可以省略(但是建议写上)

  • 2、双分支
    • 当条件表达式成立,就执行代码块1,否则执行代码块2.同样{}中只有一条语句可以省略{}

  • 3、多分支
    • 当条件表达式1成立时,即执行代码块1.如果表达式1不成立,再去判断表达式2,如果所有表达式都不成立的时候,才会去执行else。
    • 注意:多分支可以没有else (如果前面所有条件多不成立,那么一个执行入口都没有)

  • 分支结果的演示:下面这属于嵌套分支
import java.util.Scanner;
public class Example {
    public static void main(String[] args){
        // 多分支演示(下面有4种情况)
        Scanner myScanner = new Scanner(System.in);
        System.out.println("请输入分数");
        int score = myScanner.nextInt();
        if (score >=1 && score<=100){ //这是双分支嵌套多分支
            if(score == 100){
                System.out.println("信用极好");
            }else if(score > 80 && score <=99){
                System.out.println("信用优秀");
            }else if(score > 60 && score <=80){
                System.out.println("信用一般");
            }else {
                System.out.println("信用不及格");
            }
        }else{  //可以做一下格式判断。
            System.out.println("输入范围错误");
        }
    }
}
  • 注意: 如果boolean b=true; if( b=false){}  这个if中的不会执行的,为false。 

2、switch分支

  • 表达式对应一个具体的值(运行之后)。
  • case 常量1:xxx  (当表达式的值等于常量1,就执行语句块1)
  • break:表示退出switch (一般每个case下的表达式后面都跟一个break)
  • default:如果一个都没匹配上,就执行default: xxx 中的语句块。
  • 穿透现象:如果语句块1后面没有break,那么会直接执行语句块2(不会再判断case2)
    • 要是整个switch都没有break,那么在一次执行后,陆续执行后面所有的语句块

  • 演示:
import java.util.Scanner;
public class Switch01 {
    public static void main(String[] args){
        // 接收一个字符(a表示星期一、b表示星期二)
        Scanner myScanner = new Scanner(System.in);
        System.out.println("请输入一个字符a-g");
        char c1 = myScanner.next().charAt(0); //取接收到的第一个字符
        switch(c1) { // 在java中有值返回,就可以认为是一个表达式
            case 'a' :
                System.out.println("今天星期一");
                break;
            case 'b' :
                System.out.println("今天星期二");
                break;
            case 'c' :
                System.out.println("今天星期三");
                break;
            // …… ……
            default:
                System.out.println("没有匹配上");
        }
    }
}
  • 细节注意:

    • 表达式的数据类型,应该和case后的常量类型一致。或者能够自动转换为可以匹配的类型(如果不匹配,会直接报错)(比如char可以自动转为int)

    • switch表达式中返回的值必须为以下类型:byte、short、int、char、enum、String

    • case子句中的值必须为常量/常量表达式,不能是变量。(即使给常量赋值了也不行)

    • default可以没有,只不过可能就是没有结果。(就像可以没有else一样)

    • 如果没有写break,程序会顺序执行到switc结尾(包括default),除非又遇到break。

      • 比如想123对应输出春季,就可以用穿透法。(case 1和2的时候不写输出也不写break,统一在case 3 后面再写 print(春季) break)。

  • switch 和 if else的使用选择:

    • 如果判断的具体数值不多(比如坦克大战游戏开发里面只有上下左右),且符合byte、short、int、char、enum、String六种类型,建议使用switch(看起来比较简洁)。

    • 如果是对区间进行判断,或者结果为bollean类型判断,使用if (if适用范围更广)。

三、循环控制(for; while; dowhile; 多重循环

顾名思义,作用是可以让代码循环多次执行。

1、for循环

  • 所以是初始化之后,每一轮先判断,再执行语句,再变量迭代。
  • 注意点:
    • 循环条件一定的返回一个boolean类型的值(i<10)
    • 细节1:初始化和变量迭代可以写到其他地方,但是分号不能省略  for ( ; i<10 ; )
    • 细节2:循环初始值可以有多条初始化语句,但要求类型一样。变量迭代也可以有多个
public class FOR {
    public static void main(String[] args){
        // 细节1
        int i = 1;  // 循环变量的初始化可以写在外面(这样在for之外也能使用)
        for ( ; i <= 10 ; ){  // 如果是for(;;)就是无限循环,也有配合break的使用场景
            System.out.println("你好"+i);
            i++; // 变量迭代也可以写在这里
        }
        System.out.println("你好"+i);  //输出11
        // 细节2
        for (int i = 0,j = 0; i<3; i++,j+=2){
            System.out.println(i,j);  // 最后输出2,4
        }
    }
}

2、while循环

所以while循环也有四要素,只是每个要素放的位置和for不一样。

注意:while循环的判断仍然为Boolean值,先判断再执行。

public class WHILE {
    public static void main(String[] args){
        // 打印1-100之间所有能被3整除的数
        int i = 1;
        while(i <= 100){
            if(i % 3 ==0){
                System.out.println("i="+i);
            }
            i++;  // 主意i++要写在语句的外面,因为他和是否能被整除无关,都要迭代。
        }
    }
}

3、do while

也有四要素,位置也发生了变化。先执行再判断(和while不同),所以至少会执行一次。

public class DOWHILE {
    public static void main(String[] args){
        // 统计1-200之间能被5整除但是不能被3整除的数
        int i = 1;
        do {
            if(i % 5 ==0 && i % 3 != 0){
                System.out.println("i="+i);
            }
            i++;
        }while(i <= 200);
    }
}

4、多重循环(重难点

  • 定义:将一个循环放在另一个循环体内,就形成了嵌套循环。(for, while, do while均可以作为外层循环或内层循环)
  • 建议一般使用2层,不要超过3层(否则代码可读性很差)。
  • 实质上嵌套循环,就是把内层循环当成外层循环的循环体。(把内层循环完之后才会跳出来循环外层。m×n次)
  • 比如看下面这个例子(编写逻辑是化繁为简! 先假设只有一个班,计算一个班的平均分,再加上外层循环,共有3个班)
import java.util.Scanner;
// 一共有3个班,一个班有5名同学
// 求出各个班的平均分和所有班级的平均分、统计3个班的及格人数
public class MulForExercise01 {
    public static void main(String[] args){
        Scanner myScanner = new Scanner(System.in);
        double allsum = 0;
        int passnum = 0; // 及格人数
        for(int i=1; i<=3; i++){  // 3个班
            double sum = 0;
            for(int j=1; j<=5; j++){  // 每个班5个学生
                System.out.println("请输入第"+i+"个班的第"+j+"个学生的成绩");
                double score = myScanner.nextDouble();
                if(score >= 60){
                    passnum++;  // 统计及格人数
                }
                sum += score; // 单个班级总分的累计
            }
            System.out.println("第"+i+"个班的平均分为:"+ (sum/5));
            allsum += sum;  // 所有班级总分的累计
        }
        System.out.println("所有班级的平均分为:"+ (allsum/15));
        System.out.println("所有班级的及格人数为:"+ passnum);
    }
}

  • 练习之打印空心金字塔(这是一个比较经典的例题):println是换行,print是不换行
public class MulForExercise01 {
    public static void main(String[] args){
//     打印完整的金字塔 
//        *      第1层:1 空4格; 2*层数-1个星星,
//       ***     第2层:3 空3格; 总层数-当前层数
//      *****    第3层:5 空2格;
//     *******   第4层:7
//    *********  第5层:9
    for(int i=1; i<=5; i++){
        for(int k=1; k<=5-i; k++){
            System.out.print(" ");  // 打印空格
        }
        for(int j=1; j<=2*i-1; j++){
            System.out.print("*");  // 打印星
        }
        System.out.println("");  // 换个行
    }
//     打印空心金字塔 (除首行和尾行,每行的第一个位置和最后一个位置是*)
//        *      第1层:1 空4格; 2*层数-1个星星,
//       * *     第2层:3 空3格; 总层数-当前层数
//      *   *    第3层:5 空2格;
//     *     *   第4层:7
//    *********  第5层:9
    for(int i=1; i<=5; i++){
        for(int k=1; k<=5-i; k++){
            System.out.print(" ");  // 空格还是一样的打
        }
        for(int j=1; j<=2*i-1; j++){
            // 如果当前行的第一个和最后一个位置,或者是最后一行就打*,否则就打空格
            if(j==1 || j=2*i-1 || i=5){ 
                System.out.print("*");
            }
            else{
                System.out.print(" ");
            }
        }
        System.out.println("");  // 换个行
    }
    }
}

四、break(跳转控制语句)

比如有这种需求:随机生成1-100个数,直到生成了97这个数,看看一共用了几次。

break可以 在循环中当某个条件满足时,就终止循环。(for、while、do-while都行)

// 1-100内的数求和,当和第一次大于20的当前数
public class break01 {
    public static void main(String[] args){
        int sum = 0;
        for(int i=1; i<=100; i++){
            sum += i; // 累计
            if(sum > 20){
                System.out.println("和>20的时候,当前数为:"+i);
                break;  // 跳出for循环
            }
        }
        System.out.println("继续执行");  // break后,循环外面的还是会继续执行
    }
}
  • break语句出现在多层嵌套的语句块中的时候,可以通过标签指明要终止的是哪一层循环
  • 可以对每层循环定义一个标签(自己定义,可以是abc),然后 break abc 退出对应的循环。
  • 在实际的开发中,尽量不要使用标签。可读性很差。
  • 如果没有指定break,默认退出最近的循环
public class breakdetail {
    public static void main(String[] args){
        label1:
        for(int i=0; i<4; i++){ // 外层循环
        label2:
            for(int j=0; j<10; j++){  // 内层循环
                if(j ==2){
                    break label1;  //默认 break label2; 结果就会输出4个01
                    // 要是写break label1,那么只会输出一个01,就跳出了外层循环
                    // 直接跳到“继续执行”的这一行
                }
            System.out.println("j="+j);
            }
        }
        System.out.println("继续执行");  // break后,循环外面的还是会继续执行
    }
}

五、continue

  • 用于结束本次循环,继续执行下一次循环。(也就是仅仅本次的后续语句不会再执行了)
  • 同样可以用标签来制定要跳过的是哪一层循环,也是尽量不要用。
public class Contiune01 {
    public static void main(String[] args){
        int i = 1;
        while(i<=4){
            i++;
            if(i==2){
                continue;  // 即i=2的时候,跳出本次循环,不会执行后面的打印语句
            }
            System.out.println("i="+i);
            // 会输出3 4 5
        }
    }
}

下面这个就只会输出2次01

六、return

  • 如果使用在方法里面,就表示跳出所在的方法。(如果写在main方法,就退出程序)
public class Return01 {
    public static void main(String[] args){
        for(int i=1; i<=5; i++){
            if(i==3){
                System.out.println("你好"+i);
                //break;  最后输出:再见 再见 你好3 继续
                //continue;  最后输出:再见 再见 你好3 再见 再见 继续
                return; // 这是用在main方法中,即直接跳出程序
                // 输出:再见 再见 你好3
            }
            System.out.println("再见");
        }
        System.out.println("继续");
    }
}

  • 27
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值