Java基本语法
循环结构
循环结构,是能够在某种条件下,循环执行一段代码的结构。
- 这种结构能够实现代码的循环执行,也就是反复执行。
- 这种循环性是由某种条件来控制的。
- 这里的循环,是指一段代码执行后又能再次执行,也就是说一段代码执行完后,接下来执行的代码仍然是这段代码。
- 循环结构本质上是,使一段代码只要执行完就会检查一个条件,不满足这个条件就不会执行这段代码,满足则会执行这段代码,这就实现了一段代码反复执行的执行线路。这段代码执行时会变动一个信息,该信息能够控制检查条件是否被满足,这就实现代码在某种条件下的反复执行。
循环结构的四大要素
- 初始化条件:理解为循环控制信息,初始化循环控制信息的部分。循环控制信息的变动能够控制是否继续循环。
- 循环条件:理解为将循环控制信息包装为一个条件表达式,值为
boolean
型,以实现变动控制信息通过循环条件来控制是否继续循环。 - 循环体:反复执行的一段代码。
- 迭代部分:变动循环控制信息的部分。
两种循环结构,如下:
- 循环结构一:执行流程为
1->2->3->4->2->3->...->2
- 循环结构二:执行流程为
1->3->4->2->3->4->...->2
- 循环结构一:执行流程为
- Java中的循环结构:
for循环
,while循环
,do-while循环
for循环
- for循环结构属于循环结构一,即循环体初始时就由循环条件控制着。
- for循环结构:其中
1, 2, 3, 4
分别对应循环结构4要素,执行流程按照循环结构一的执行流程走。 note:
- 对于一个要实现的循环问题,要知道虽然是
循环
,但每一次仍然是循环体执行一次,只不过是通过执行多次循环体实现循环,因此循环体中主要解决的是执行一次的循环体是什么。 for
循环中的逗号:可以在初始化条件
和迭代部分
两部分使用逗号
来分隔多个语句,但要注意,通常在初始化条件
中会写int i = 10, j = 20
这样是没问题的,不能这样int i = 10, System.out.println("xx")
,这会报错,因为这段代码相当于把输出语句声明为int
。总之,逗号分隔容易出错,具体也没搜到。因此,慎用。for
循环中声明的变量的作用域就是这个for
循环的范围,出了循环,则就相当于没有这个变量了。for
循环中1, 2, 4
要素,即小括号()
中代表控制的三部分可以为空,如果为空,正常执行,初始条件和迭代部分为空表示没有代码需要执行,循环条件为空表示没有条件,即无条件执行3
代表的循环体。
- 对于一个要实现的循环问题,要知道虽然是
练习题:
- 第一题:对应note 1。
- 第二题:
- 第三题:
- 第四题:
- 第五题:
- 第一题:对应note 1。
while循环
- while循环属于循环结构一,即循环体初始时就由循环条件控制着。
- while循环:其中
1, 2, 3, 4
分别对应循环结构4要素,执行流程按照循环结构一的执行流程走。
do-while循环
- do-while循环属于循环结构二,即循环体初始时没有被循环条件控制着,循环体至少会被执行一次,循环控制信息至少会变动一次。
- do-while循环:其中
1, 2, 3, 4
分别对应循环结构4要素,执行流程按照循环结构二的执行流程走。 - do-while循环与for循环和while循环,只有在循环条件初始时已经不满足时才有区别,其他时候都没有区别。
循环结构习题
第一题:
- 解法一:do-while
- 解法二:while or for
note: 跳出循环的两种方式,循环条件不满足
&break
- 解法一:do-while
嵌套循环
- 嵌套循环:一个循环结构中的循环体中,嵌套着另一个循环结构,这就构成了嵌套循环。相当于,一个循环的循环体是一个循环。
- 练习:
嵌套循环的应用
- 九九乘法表:
100以内的所有质数
质数:大于1的,只能被1和其本身整除的自然数。如15,15 / 3 = 5,因此15可以被3和5整除,不是质数。
note:System.currentTimeMillis()
:返回从1970年1月1日00:00到当前时间的毫秒数,long
型。- 在一般领域,对正整数n,如果用2到$\sqrt{n}$之间的所有整数去除,均无法整除,则n为质数。
理解:一个数如果能被整除,那么就存在两个因子,一个因子大,一个因子就隐含地指示了另一个因子,比如12的可以被3整除,也说明了12可以被4整除。因此只需要考虑一部分数就能说明一个范围的数是否存在因子。从i=2开始,如果n不能被2整除,也说明了不能被n/2的结果整除;如果n不能被3整除,也说明了不能被n/3的结果整除;以此类推,显然随着i的增大,n/i在减小,最终当i=$\sqrt{n}$时,就相当于判断完了从i=2到n本身这一范围的所有数是否为i的因子。 Math.sqrt(double a)
:表示$\sqrt{a}$。break
的使用和根号的方法,实际上是一种优化,这里感觉不到优化了,有两个原因,第一是2~100太少,第二是每次输出操作是很花时间的,影响了计算性能的体现。以下将操作范围改为2~10000
,删除每次输出的操作,换为最后只输出一次的操作,以体现优化。
- 九九乘法表:
流程控制语句:break和continue关键字
break
:- 使用范围:
switch-case
语句,循环结构。 - 作用:跳出当前结构,比如跳出循环或跳出
switch-case
。 - note:默认
break
是跳出当前这一层循环,但也可以通过使用标签,指定break
跳出其他层的循环。
使用标签就是在指定的循环结构前用一个标签加冒号来标识,如label: for(;;)
,然后在break
后加上标签即可,如break label;
- 使用范围:
continue
:- 使用范围:循环结构。
- 作用:跳过当次循环。
- note:默认
continue
是跳出当前这一层循环的当次循环,但也可以通过使用标签,指定continue
跳出其他层的当次的循环。
使用标签就是在指定的循环结构前用一个标签加冒号来标识,如label: for(;;)
,然后在continue
后加上标签即可,如continue label;
break
和continue
后面都不能接语句,接了也没有意义,因为始终执行不了,但是做这种无意义的事编译都过不了。- 利用带标签的
continue
实现质数的输出问题。