第五章、流程控制

5.1 分支语句

if else

isLeapYear(int year) 方法用来判断某一年是否为闰年。

public boolean isLeapYear(int year) {
    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) 
        return true;
    else 
        return false;
}

if 后面的表达式必须是布尔表达式,而不能为数字类型,这一 点与 C/C++ 语言不同。

switch

在 switch(expr) 语句中, expr 表达式的类型包括以下几种:

  • 与 int 类型兼容的基本类型,所谓与 int 类型兼容,就是指能自动转换为 int。类型 。 因此 expr 表达式的合法类型包括: byte 、 short 、 char 和 int 类型。 long和浮点类型不能自动转换为 int 类型,因此不能作为 expr 表达式的类型,
  • 字符串类型。
  • 枚举类型。
String color = "red";
switch(color) {
    case "blue":
        /* TODO */
        break;
    case "red":
        /* TODO */
        break;
    ...
}
public class SwitchTest {
    enum Color{red, blue, yellow};
    public static void main(String[] args)  {
        Color c = Color.blue;
        switch(c) {
            case blue:
                /* TODO */
                break;
            case red:
                /* TODO */
                break;
            ...
        } 
    }
}

5.2 循环语句

Java 语言提供 3 种循环语句: for 语句、 while 语句和 do while 语句 。 for 和 while语句在执行循环体之前测试循环条件,而 do while 语句在执行完循环体之后测试循环条件。这意味着 for 和 while 语句有可能连一次循环体都未执行,而 do while 循环至少执行一次循环体。

max(int[] array)方法能返回整数数组中的最大值。

public static int max(int[] array) {
    if (array == null || array.length == 0)
        throw new IllegalArgumentException("Invaid");
    int index = 0, location = 0;
    do {
        if (array[location] < array[[index]])
            location = index;
        index++;
    } while (index < array.length);
    return array[location];
}

在初始化部分和迭代部分可以使用逗号语句。逗号语句是用逗号分隔的语句序列。以下 inverse()方法用于颠倒数组中元素的顺序。在 for 语句的初始化部分定义了两个变量 i 和 j,这两个变量的作用域都是当前 for 语句。

public static int[] inverse(int[] oldArray) {
    if (array == null || array.length == 0)
        throw new IllegalArgumentException("Invalid");
    int[] newArray = new int[oldArray.length];
    for (int i = 0, j = oldArray.length - 1; i < oldArrat.length; i++, j--) {
        newArray[j] = oldArray[i];
    }
    return newArray;
}

使用 for 语句时,有以下注意事项:

  • 如果 for 语句的循环体只有 一条语句,可以不用大括号。
  • 控制 for 循环的变量常常只用于本循环,而不用在程序的其他地方。
  • 在初始化部分和迭代部分可以使用逗号语句。
  • for 语句的初始化部分、循环条件或者迭代部分都可以为空。
  • 作为一种编程惯例, for 语句一般用在循环次数事先可确定的情况,而 while 和 do while 用在循环次数事先不可确定的清况。

foreach 语句是 for 语句的特殊简化版本,它可以简化遍历数组和集合的程序代码。

for (Element e : Collection) {
    /* DO e */
}

5.3 流程跳转语句

break、continue 和 return 语句用来控制流程的跳转。

  • break: 从 switch 语句、循环语句或标号标识的代码块中退出。
  • continue: 跳过本次循环,执行下一次循环,或执行标号标识的循环体。
  • return: 退出本方法,跳到上层调用方法:如果本方法的返回类型不是 void,需要提供相应的返回值。

break 语句和 continue 沿句可以与标号联合使用。标号用来标识程序中的语句 ,标号的名字可以是行总的合法标识符。

int counter = 0;
tag1:
for (int i = 0; i < 5; i++) {
    tag3:counter--;
    tag2:
    switch(i) {
        case 0:
            break;              //exit switch
        case 1:
            break tag2;         //exit switch
        case 3:
            break tag1;         //exit for loop
        default:
            continue tag1;      //结束本轮for循环,执行下一次for循环
    }
}

在使用标号时,有以下注意事项:

  • 在语法上 ,标号可用来标识除变量声明语句之外的任何有效语句。
  • continue 语句中的标号必须定义在 while、 do while 和 for 循环语句前面。
  • break 语句中的标号必须定义在 while、 do while 和 for 循环语句或 switch 语句前面。

为了简化程序的结构,目前的 Java 语言不支持 goto 语句,在其他编程语言中, goto 语句用于直接跳转到标号所在的语句 。 例如在 C 语言 中, goto tag3 表示跳转到 tag3 所标识的语句 counter++。但由于 Java 语言不支持 goto 语句,因此 tag3 标号没有任何意义。目前只有在 while 、 do while 和 for 循环语句或 switch 语句前面的标号才有实际意义。

5.4 综合例子:八皇后问题

public class Queen{
    private final int size;                 //棋盘大小
    private int[] location;                 //皇后在棋盘每行上的列位置
    private int[] colsOccupied;             //皇后在棋盘上占据的列
    private int[] cross1Occupied;
    private int[] cross2Occupied;           //皇后在棋盘上占据的正反对角线
    private static int count;               //解决方案

    private static final int STATUS_OCCUPIED = 1;               //占领状态
    private static final int STATUS_OCCUPY_CANCELD = 0;         //未占领状态

    public Queen(int size) {                //初始化
        this.size = size;
        location = new int[size];
        colsOccupied = new int[size];
        cross1Occupied = new int[2 * size];
        cross2Occupied = new int[2 * size];
    }

    public void printLocation() {
        System.out.println("第" + count + "种摆放方案");
        for (int i = 0; i < size; i++)
            System.out.println("行:" + i + "列:" + location[i]);
    }

    private boolean isOccupied(int i, int j) {
        return (colsOccupied[j] == STATUS_OCCUPIED)
                || (cross1Occupied[i - j + size - 1] == STATUS_OCCUPIED)
                || (cross2Occupied[i + j] == STATUS_OCCUPIED);
    }

    private void setStatus(int i, int j, int flag) {
        colsOccupied[j] = flag;
        cross1Occupied[i - j + size - 1] = flag;
        cross2Occupied[i + j] = flag;
    }


    public void place(int i) {
        for (int j = 0; j < size; j++) {
            if (!isOccupied(i, j)) {
                location[i] = j;
                setStatus(i, j, STATUS_OCCUPIED);
                if (i < size - 1)
                    place(i + 1);
                else {
                    count++;
                    printLocation();
                }
                setStatus(i, j, STATUS_OCCUPY_CANCELD);
            }
        }
    }

    public void start() {
        place(0);
    }

    public static void main(String[] args) {
        new Queen(8).start();
    }
}

运行以上程序,会得到 92 种摆放 8 个皇后的方案。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值