——————————————————————————————————————————————————
while语句也称条件判断语句,它的循环方式是利用一个条件来控制是否要继续反复执行这个语句。语法如下:
while(条件表达式){
语句序列
}
当条件表达式的返回值为真时,则执行“{}”中的语句,当执行完“{}”中的语句后,重新判断条件表达式的返回值,直到表达式返回的结果为假时,退出循环。
例:计算1-1000的相加结果。
创建GetSum类,在主方法中通过while循环计算1~1000相加的和并输出最终的相加结果。
注意:初学者经常犯的错误就是在while表达式括号后加;
while(x == 5);
System.out.println(“x的值为5”);
这时程序会认为要执行一条空语句,而进入无限循环,java编译器又不会报错,这样会浪费很多调试时间。
——————————————————————————————————————————————————
do…while循环语句与while循环语句类似,它们之间的区别是,while语句先判断条件是否成立再执行循环体,而do…while循环语句则先执行一次循环后,再判断条件是否成立。也就是说,do…while循环语句“{}”中的程序段至少要被执行一次。语法如下:
do {
语句序列
}while(条件表达式);
do…while语句与while语句的一个明显区别是,do…while语句在结尾处多了一个分号。
例:使用do…while语句进行用户登录验证。
创建LoginService类,首先提示用户输入6位密码,然后使用Scanner扫描器类获取用户输入的密码,最后进入do…while语句中进行循环,以判断用户输入的密码是否正确,如果用户输入的密码不是“931567”,则让用户反复输入,直到输入正确的密码。
首先执行do{}里面的语句,在进行条件判断,成立的话就执行循环。
——————————————————————————————————————————————————
for循环是Java程序设计中最有用的循环语句之一。一个for循环可以用来重复执行某条语句,直到某个条件得到满足。for循环有两种语句,一种是传统的for语句,另一种是foreach语句。
——————————————————————————————————————————————————
传统的for语句中有3个表达式,其语法如下:
for (表达式1;表达式2;表达式3) {
语句序列
}
表达式1:初始化表达式,负责完成变量的初始化。
表达式2:它是循环条件表达式,该表达式的值为boolean型,该值指定循环条件。等同于while循环里的表达式。
表达式3:每次循环结束后执行的语句,通常用来改变循环条件。
在执行for循环时,首先执行表达式1,完成某一变量的初始化工作;下一步判断表达式2的值,若表达式2的值为true,则进入循环体;在执行完循环体后紧接着计算表达式3,这部分通常是增加或减少循环控制变量的一个表达式。这样一轮循环就结束了。第二轮循环从计算表达式2开始,若表达式2返回true,则继续循环,否则跳出整个for语句。
例:使用for循环,计算2~~100的所有偶数之和。
创建Circulate类,编写程序,使用for循环语句计算2~100的所有偶数的和并输出相加后的结果。
——————————————————————————————————————————————————
oreach语句是for语句的特殊简化版本,不能完全取代for语句,但任何foreach语句都可以被改写为for语句版本。foreach并不是一个关键字,习惯上将这种特殊的for语句格式称为foreach语句。foreach语句在遍历数组等方面为程序员提供了很大的方便。
for (元素类型 x:遍历对象obj) {
引用了x的java语句;
}
对于foreach语句中的元素变量x,不必对其进行初始化。
例:使用foreach语句遍历整型数组。
创建类Repetition,在主方法中定义一维数组,并用foreach语句遍历该数组。
——————————————————————————————————————————————————
循环有3种,即while、do…while和for,这3种循环可以相互嵌套。
例如,在for循环中套用for循环的代码如下:
for (....){
for(...)}
.....
}
}
在while循环中套用while循环的代码如下:
while (....){
while(...)}
.....
}
}
在while循环中套用for循环的代码如下:
while (....){
for(...)}
.....
}
}
例:使用嵌套for循环输出乘法口诀表。
创建Multiplication类,使用嵌套for循环实现在控制台上输出乘法口诀表。
这个结果是如何得出来?,最外层的循环负责控制输出的行数,i从1到9。当i=1时,输出第一行,然后进入内层循环,这里的j是循环变量,循环的次数与i的值相同,所以使用"j < i + 1"来控制,内层循环的次数决定本行有几列,所以先输出j的值,然后在输出*号,在输出i的值,最后输出j的结果。内层循环执行完毕,输出换行,开始下一行的循环。
System.out.print 与 System.out.println 都用来打印内容到控制台。区别:
System.out.print 打印完不换行。(参数)参数不能为空,必须有。在print(“\n”)可以达到和println一样的效果。
System.out.println 打印完会多追加一个换行符。(可以不写参数)
详细过程如下:
当程序遇到嵌套循环体,如果外层循环的循环条件允许,则开始执行外层循环的循环体,而内层循环将被外层循环体来执行,只是内层循环体需要反复执行自己的循环体。当内层循环体执行结束,则再次计算外层循环体的循环条件,决定是否再次执行外层循环体。
外层循环体:for (i = 1 ; i < 10; i++)
初始变量i=1,当i<10的时候执行代码块,执行后i自增。
内层循环体:for (j = 1; j < i + 1 ; j++)
初始变量j=1,当j
1、外层循环体,i=1,1<10,条件成立,执行内层循环,j=1,j
2、外层循环执行后,i自增,i=2,i<10,条件成立,执行内层循环。J=1,J
3、外层循环体执行后,i自增,i=3,i<10,条件成立,执行内层循环,j=1,J输出后J自增,J=2,判断J + " * " + i)2×3=6。输出后J自增,J=3,判断j
依次类推…
输出格式:
1 * 1=1 (退回外层循环,回车)
1 * 2=2 (\t) 2 * 2=4(\t) (退回外层循环,回车)
1 * 3=3 (\t) 2 * 3=6(\t) 3 * 3=9(\t) (退回外层循环,回车)
依次类推…
——————————————————————————————————————————————————
生物实验室做单细胞细菌繁殖实验,每一代细菌数量都会成倍数增长,一代菌落中只有一个细菌,二代菌落中的细胞经分裂变成两个细菌,三代菌落中的细胞经分裂变成4个细菌,以此类推,请计算第十代菌落中的细菌数量。
思路:一代~~10代,定义个变量int a = 1,循环条件:a <=10 , 从1代循环到10代。 使用while循环,以一个条件来反复判断。
在定义b菌落的值 int b = 1,每循环依次菌落就翻倍。
——————————————————————————————————————————————————
1, 1, 2, 3, 5, 8, 13, 21, 34, …是一组典型的斐波那契数列,前两个数相加等于第三个数。那么请问这组数中的第n个数的值是多少?
先要搞清楚这个斐波那契数列是什么东西?
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……其规律很明显,从第3个数开始,每个数都等于它前两个数的和。
确定了第一个数和第二个数都是1,从第三个数开始循环,进行前两个数相加求和,每次相加之后更新a和b,得出c。
——————————————————————————————————————————————————
循环控制包含两方面的内容,一方面是控制循环变量的变化方式,另一方面是控制循环的跳转。
控制循环的跳转需要使用break和continue两个关键字,这两条跳转语句的跳转效果不同,break语句是中断循环,continue语句是执行下一次循环。
——————————————————————————————————————————————————
使用break语句可以跳出switch结构。在循环结构中,同样也可用break语句跳出当前循环体,从而中断当前循环。
例:输出1~20出现的第一个偶数
创建BreakTest类,循环输出1~20的偶数值,在遇到第一个偶数时,使用break语句结束循环。
在循环嵌套情况下,break语句将只会使程序流程跳出包含它的最内层的循环结构,即只跳出一层循环。
如果想让break跳出外层循环,Java提供了“标签”的功能,语法如下:
标签名:循环体{
break标签名;
}
标签名:任意标识符。
循环体:任意循环语句。
break标签名:break跳出指定的循环体,此循环体的标签名必须与break的标签名一致。
带有标签的break可以指定跳出的循环,这个循环可以是内层循环,也可以是外层循环。
例:使用标签让break结束外层循环
创建BreakInsideNested类,在该类中写两层for循环,第一层for语句循环3次,第二层for语句循环5次。当第二层for语句循环至第4次时,强行用break中断循环。输出程序执行时外层循环和内层循环各循环了多少次。
从这个运行结果中可以看到以下内容。
循环中的if语句判断:当b等于4时,执行break语句,中断了内层的循环,所以输出的b值最大到3为止。
外层的循环没有受任何影响,输出的i值最大为3,正是for循环设定的最大值。
——————————————————————————————————————————————————
现在修改这段代码,给外层循环添加一个名为Loop的标签,让内层循环结束外层循环,再查看运行结果。
从这个结果中可以看出,当b的值等于4时,直接结束外层循环,a的值不再增加。
——————————————————————————————————————————————————
continue语句是针对break语句的补充。continue不是立即跳出循环体,而是跳过本次循环,回到循环的条件测试部分,重新开始执行循环。
在for循环语句中遇到continue后,首先执行循环的增量部分,然后进行条件测试。在while和do…while循环中,continue语句使控制直接回到条件测试部分。
例:输出1~20的奇数
创建ContinueTest类,编写一个for循环从1循环至20,如果当前循环的次数为偶数,则使用continue语句跳过循环。
与break语句一样,continue也支持标签功能,语法如下:
标签名:循环体{
continue标签名;
}
——————————————————————————————————————————————————
有一口井,深10米,一只蜗牛从井底向井口爬,白天向上爬2米,晚上向下滑1米,问多少天可以爬到井口?
定义长度变量和天数的变量。
int a = 0;
int day = 1;
循环 while判断,为真
a = a + 2, 长度加2米(白天)。
if判断,如果2米大于等于10,a >=10,那么中断。
a长度减去1,
日期+1。
——————————————————————————————————————————————————
某剧院发售演出门票,演播厅观众席有4行,每行有10个座位。为了不影响观众视角,在发售门票时,屏蔽掉最左一列和最右一列的座位。请编写程序,结合本节知识点模拟整个售票过程。