Java从入门到项目实战(全程视频版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.3 循环结构

循环结构的主要特点是可以根据某些判断条件来重复执行某段程序代码的处理结构,Java语言的循环结构一共分为两种类型:while循环结构和for循环结构。

3.3.1 while循环结构

img

while循环是一种较为常见的循环结构,利用while语句可以实现循环条件的判断,当判断条件满足时则执行循环体的内容,Java中while循环结构有以下两类。

img

通过两类语法结构可以发现,while循环需要先判断循环条件后才可以执行程序代码,do...while循环可以先执行一次循环体,而后再进行后续循环的判断。所以如果循环条件都不满足的情况下,do...while至少执行一次,而while一次都不会执行,这两种操作语法的流程如图3-8和图3-9所示。

所有的循环语句里面都必须有循环的初始化条件。每次循环的时候都要去修改这个条件,以判断循环是否结束,下面通过具体的范例来解释两种while结构的使用。

img

图3-8 while循环

img

图3-9 do…while循环

注意:避免死循环。

对于许多的初学者而言,循环是需要面对的第一道程序学习的关口,相信不少的读者也遇见过死循环的问题,而造成死循环的原因也很容易理解,就是循环条件一直都满足,所以循环体一直都被执行,唯一的原因就是每次循环执行时没有修改循环的结束条件。

范例:使用while循环结构实现1~100数字累加计算

img

本程序利用了while结构实现了数字的累加处理,由于判断条件为“num 〈=100”,并且每一次num变量自增长为1,所以该循环语句会执行100次,本程序执行流程如图3-10和图3-11所示。

img

图3-10 while执行累加流程

img

图3-11 do…while执行累加流程

范例:使用do…while实现1~100数字累加

img

本程序使用了do…while实现了数字累加操作,可以发现在执行循环判断前都会先执行一次do语句的内容。

3.3.2 for循环结构

img

在明确知道了循环次数的情况下,可以利用for循环结构来实现循环控制,for循环的语法如下。

img

通过给定的格式可以发现,for循环在定义的时候是将循环初始化条件、循环判断、循环条件变更操作都放在了一行语句中,而在执行的时候循环初始化条件只会执行一次,而后循环判断在每次执行循环体前都会进行判断,并且每当循环体执行完毕后都会自动执行循环条件变更,本操作流程如图3-12所示。

范例:使用for循环实现1~100累加

img

本程序直接在for语句之中初始化循环条件,循环判断以及循环条件变更的操作,而在循环体中只是实现核心的累加操作,程序执行流程如图3-13所示。

img

图3-12 for循环结构图

img

图3-13 for实现累加

注意:for循环编写的时候尽量不要按照以下方式编写。

对于循环的初始值和循环条件的变更,在正常情况下可以由for语句自动进行控制,但是根据不同的需要也可以将其分开定义,如下代码所示。

范例:另一种for循环写法

img
img

这两种方式最终所实现的效果完全一样,但是除非有特殊的需要,本书并不推荐这种写法。

提问:用哪种循环好?

本书给出了3种循环的操作,那么在实际工作中如何去选择该使用不同的循环?

回答:主要使用while和for循环。

就笔者的经验来讲,在开发之中,while和for循环的使用次数较多,而这两种的使用环境如下。

imgwhile循环:在不确定循环次数,但是确定循环结束条件的情况下使用。

imgfor循环:在确定循环次数的情况下使用。

例如,现在要求一口一口地吃饭,一直吃到饱为止,可是现在并不知道到底要吃多少口,只知道结束条件,所以使用while循环会比较好;而如果说现在要求围着操场跑两圈,已经明确知道了循环的次数,那么使用for循环就更加方便了。而对于do…while循环在开发之中出现较少。

3.3.3 循环控制语句

img

在循环结构中只要循环条件满足,循环体的代码就会一直执行,但是在程序之中也提供有两个循环停止的控制语句:continue(退出本次循环)、break(退出整个循环)。循环控制语句在使用时往往要结合分支语句进行判断。

范例:使用continue控制循环

img

此时的程序中使用了continue语句,而结果中可以发现缺少了3的内容打印,这是因为使用了continue语句,当x=3时结束当次循环,而直接进行下一次循环的操作,本操作的流程如图3-14所示。

范例:使用break控制循环

img

本程序在for循环中使用了一个分支语句(x==3)判断是否需要结束循环,而通过运行结果也可以发现,当x的内容为3后,循环不再执行了,本操作的流程如图3-15所示。

img

图3-14 continue语句

img

图3-15 break语句

3.3.4 循环嵌套

img

循环结构可以在内部嵌入若干个子的循环结构,这样可以实现更加复杂的循环控制结构,但是需要注意的是,这类循环结构有可能会导致程序复杂度的提升。

范例:打印乘法口诀表

img
img

本程序使用了两层循环控制输出,其中第一层循环是控制输出行和乘法口诀表中左边的数字(7 * 3=21,x控制的是数字7,而y控制的是数字3),而另外一层循环是控制输出列,并且为了防止不出现重复数据(例如,“1 * 2”和“2 * 1”计算结果重复),让y每次的循环次数受到x的限制,每次里面的循环执行完毕后就输出一个换行。本程序的执行流程如图3-16所示。

img

图3-16 乘法口诀表流程

范例:打印三角形

img
img

在本程序中利用外层for循环进行了三角形行数的控制,并且在每行输出完毕后都会输出换行,在内层for循环进行了“空格”与“*”的输出,随着输出行数的增加,“空格”数量逐步减少,而“*”数量逐步增加,本程序的执行流程如图3-17所示。

img

图3-17 三角形流程

提示:关于continue与循环嵌套的使用问题。

在进行循环嵌套的代码中,可以使用continue并结合程序标记实现跳出处理。

范例:使用continue进行跳出处理

img
img

本程序在外层for循环上定义了point代码标记,在内层循环中利用continue语句跳转到外层指定标记代码处,对于这类结构本书并不推荐,读者有个印象即可。