Java语句的流程控制

1、Java语句的执行结构

Java程序是由语句组成的。语句能够通过创建和操作变量、对变量赋值并控制这些操作的执行流程来描述运算。语句通常会被组织成代码段,即花括号中的一系列语句。首先来大概说一说Java中的语句分类:

  • 声明语句:创建某种类型的变量并用标识符为其命名。
  • 赋值语句:将(由表达式产生的)某种类型的数值赋予一个变量。
  • 条件语句:能够简单地改变执行流程—根据指定的条件选择执行两个代码段之一。
  • 循环语句:更彻底的改变执行流程—只要条件为真就不断地反复执行代码段中的语句。
  • 调用和返回语句:和静态方法有关,是改变执行流程和代码组织的另一种方式。

1996 年,计算机科学家 Bohm 和 Jacopini 证明了:任何简单或复杂的算法都可以由顺序结构、分支结构和 循环结构这三种基本结构组合而成。
它们的共同点是都包含一个入口和一个出口,它们的每个代码都有机会被执行,不会出现死循环。

1.1、顺序结构

顺序结构是一种基本的控制结构,它按照语句出现的顺序执行操作。

1.2、分支结构

分支结构又被称为选择结构,根据条件成立与否来执行操作。

1.2.1、if条件语句

if条件结构是根据条件判断之后再做处理,如果条件为真,则执行if之后的花括号内的代码,否则就执行else或者else if的花括号中的代码。如果没有else或者else if 那么当条件不满足的时候就直接跳过,执行后边的语句。
if(条件语句){…}
if (条件语句){…}else{…}
if (条件语句){…}else if(条件语句){…}
if (条件语句){…}else if(条件语句){…}else{…}

举个栗子,我们应该都考过试,学校按照我们的考试分数把成绩分为优秀(>=90),良好(80-90),合格(70-80),及格(60-70),不及格(<60),那么用程序可以描述为:

  1. import java.util.Scanner;
  2. public class Grade{
  3. public static void main(String[] args){
  4. Scanner input = new Scanner(System.in);
  5. System.out.println("请输入成绩:");
  6. int score s= input.nextInt();
  7. // 90以上优 80-90 良 70-80 合格 60-70 及格 <60 不及格
  8. if(score >= 90){
  9. System.out.println("您的成绩是优秀!不要骄傲继续加油哦!");
  10. }else if(score >= 80 & score < 90){
  11. System.out.println("您的成绩是良好!还要努力哦!");
  12. }else if(score >= 70 & score < 80){
  13. System.out.println("您的成绩是合格!还要加倍努力哦!");
  14. else if(score >= 60 & score < 70){
  15. System.out.println("您的成绩是及格!差一点点就不及格,下次要更努力了哦!");
  16. }else{System.out.println("您的成绩不合格!下次可不能不好好听课了!");
  17. }
  18. }
  19. }

1.2.2、switch语句

一般格式:

switch(表达式){
case 取值 1: 语句块 1;break;
case 取值 n: 语句块 n;break;
default: 语句块 n+1;break;
}

switch 语句有关规则
表达式的返回值必须是下述几种类型之一:byte, int, char, short, String;
case 子句中的取值必须是常量,且所有 case 子句中的取值应是不同的;
default 子句是可选的;
break 语句用来在执行完一个 case 分支后使程序跳出 switch 语句块;如果 case 后面没有写 break 则直接往下面执行!
case 后面的执行体可写{ }也可以不写{ }.

这种选择语句一般用于case特别多的场景,举个栗子,我们想知道某一年某一月有多少天,可以如下编写代码:

import java.util.Scanner;

public class CalculationDays {
    public static void main(String[] args) {
        /*
        一年中有 12 个月,而每个月的天数是不一样的。其中大月 31 天,分别为
        1,3,5,7,8,10,12 月,小月 30 天,分别 为 4,6,9,11 月。还有二月比较特殊,平
        年的二月只有 28 天,而闰年的二月有 29 天.在控制台输入年份和月份,程序计算该年该月的天数。
        判断闰年条件①:非整百年数除以4,无余为闰,有余为平;②整百年数除以400,无余为闰有余平。
         */
        Scanner input = new Scanner(System.in);
        System.out.println("请输入年份:");
        int year = input.nextInt();
        System.out.println("请输入月份:");
        int month = input.nextInt();
        switch (month) {
            case (1):
            case (3):
            case (5):
            case (7):
            case (8):
            case (10):
            case (12):
                // 1,3,5,7,8,10,12月份有31天
                System.out.println(year + "年" + month + "月有31天");
            case (4):
            case (6):
            case (9):
            case (11):
                // 4,6,9,11月有30天
                System.out.println(year + "年" + month + "月有30天");
            case (2):
                // 判断是否为闰年
                if (year % 400 == 0 | (year % 100 != 0 & year % 4 == 0)) {
                    // 闰年2月有29天
                    System.out.println(year + "年" + month + "月有29天");
                } else {
                    // 平年2月有28天
                    System.out.println(year + "年" + month + "月有28天");
                }
        }
    }

1.3、循环结构

循环结构是一种重复结构,如果条件成立,它会重复执行某一循环体,直到出现不满足的条件为止。

循环语句分类:

  • for 循环
  • while 循环
  • do/while 循环

1.3.1、while循环

首次先判断是否满足条件,符合条件则执行循环体,然后再判断,符合条件,循环继续执行;否则,循环退出。
特点:先判断,再执行

格式:

while(条件表达式){
    //循环体;
}

使用 while 循环的步骤:

1、分析循环条件和循环操作

2、套用 while 语法写出代码

3、检查循环是否能够退出(重要)

举个栗子,计算1+2+3+4+…+n(n个数字之和):

int sum = 0;
int n = 10;
int i = 0;
while(i <= n ){
    sum += i;
    i++;
}
System.out.print("1+2+3+...+10的结果为:" + sum);

1.3.2、do-while 循环

首次先执行一遍循环操作,符合条件,循环继续执行;否则,循环退出。
特点:先执行,再判断

格式:

do {
    // 循环题
}while ( 条件表达式 );

因此while 循环和 do-while 循环的区别就是:
while:先判断条件,如果条件满足,再执行循环操作。
do while:先执行一遍循环操作,然后再判断条件,如果条件满足,继续执行循环操作。

举个栗子,之前网上流传一个价值一个亿的人工智能代码:

import java.util.Scanner;

public class AI {
    public static void main(String[] args) {
        // 人工智障的精髓,把"吗"去掉,把"我"变成"我也",把?变成!,还可以有其他形式,感兴趣的自己玩玩
        // 实例化一个Scanner对象,用来接收输入
        Scanner input = new Scanner(System.in);
        System.out.println("请输入聊天内容:");
        String question, reply;
        do {
            question = input.next();
            reply = question.replace("吗", "");
            reply = reply.replace("我", "我也");
            reply = reply.replace("?", "!");
            System.out.println(reply);
        } while (!reply.equals("滚"));
    }
}

/*
在吗?
在!
吃了吗?
吃了!
我爱你
我也爱你
能听得懂吗?
能听得懂!
真的吗?
真的!
*/

1.3.3、for循环

格式:

for( 初始化参数;判断条件;更新循环变量){
    // 循环体;
}

举个栗子,打印我们小学背过的九九乘法表:

public class MultiplicationTable {
    public static void main(String[] args) {
        System.out.println("乘法口诀表:");
        // 打印乘法口诀表
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print(j + "*" + i + "=" + (i * j) + "\t");
            }
            System.out.println();
        }
    }
}

1.3.4、退出循环

最后说一下break和continue语句。break语句是直接跳出当前所在的循环(不执行循环体中break之后的语句),不再执行循环,而continue则是跳过这一次的循环(不执行循环体中continue之后的语句),继续执行之后下一次循环的判断和循环。看例子:

public class Demo {

/*
    break与continue语句:
         break是用于终止本轮所有次循环。即不执行本次循环中break后面的语句,直接跳出循环。
          continue是用于终止本轮本次循环。即本次循环中continue后面的代码不执行,进行下一次循环的入口判断。

 */
    public static void main(String[] args) {
        for(int i=0;i<10;i++) {
            if(i==5) {
                break;
            }
            System.out.println(i);
        }
        System.out.println("-------------------------");
        for(int j=0;j<10;j++) {
            if(j==5) {
                continue;
            }
            System.out.println(j);
        }
    }

}

运行之后可以发现,break的代码,只输出到0,1,2,3,4,continue的代码则是没有打印5.

有时候有多个循环嵌套,一个break只能退出它所在的循环,那怎么直接跳出所有循环呢?

通过给for循环起名字的方式,可以实现,参考代码如下:

public class Demo10 {

    /*
      对循环起名字退出多重循环
     */
    public static void main(String[] args) {
        loop1:for(int i=0;i<10;i++) {
            for(int j=0;j<10;j++) {
                System.out.println("i="+i+" , j="+j);
                if(i==5 && j==5) {
                    break loop1;
                }
            }
        }
    }
}