#Java系列课程#循环语句
循环语句
循环结构可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体。当反复执行这段循环体时,需要在合适 时候把循环条件改为假,从而结束循环,否则循环讲一直执行下去,形成死循环。
循环语句可能包含如下四个部分:
-
初始化语句:一条或多条语句,这些代码用于完成翁一些初始化工作,初始化语句在循环开始之前执行。
-
循环条件:这是一个boolean表达式,这个表达式能决定是否执行循环体。
-
循环体:这个部分是循环的主体,如果循环条件允许,这个代码块将被重复执行。如果这个代码块只有一行语句,则这个代码块的花括号是可以省略的。
-
迭代语句:这个部分在一次循环体执行结束后,对循环条件求值之前执行,通常用于控制循环条件中的变量,使得循环再合适时候结束。
这些都是一般分类,并不是每个循环都能清晰的看出以上四个部分。循环语句是用来控制那些根据运行期情况需要反复执行的语句系列
也就是让他反反复复执行,想让其执行十次,二十次,就可以用循环语句,但是如果复制十个语句不就也可以实现么,是可以实现,但是用循环语句的话三句就搞定了,而且如果是反复执行成千上万条语句的话该怎么办呢,所以就要用到循环语句。
就是说如果现在让你输出10个hello你怎么办,肯定是打十次System语句,复制粘贴就可以了。如下:
public class Niukewang{
public static void main(String [] args){
System.out.println("hello");
System.out.println("hello");
System.out.println("hello");
System.out.println("hello");
System.out.println("hello");
System.out.println("hello");
System.out.println("hello");
System.out.println("hello");
System.out.println("hello");
System.out.println("hello");
}
}
不知道循环语句的时候就是这样,一个劲的复制粘贴,但是学习了循环语句之后就是可以用循环语句了,先看for循环
for循环
for循环一共有三个部分组成,
for(;;){
}
但是直接这样写的话是死循环,你要在里面输入东西的。
for(int i=0;i<10;i=i+1){
System.out.println("hello");
}
i<10代表只能运行10次,i=i+1也就是i++,所以你直接写i++就可以了
那如果说我只写成这样子呢?
for(int i=0;i<10;){
System.out.println("hello");
}
肯定不行,因为i始终为0,一直不增加,永远到不了10,所以也是死循环。
这样子呢?
for(int i=0;i<10;i=i+2){
System.out.println("hello");
}
每次i增加两个,所以肯定就是最后输出5个hello啦!
一开始是0,然后判断小于10,就走语句System。。。
然后增加2,i=2了,判断小于10,再执行System语句。以此类推。
现在我们来拆写一下,
public class Niukewang{
public static void main(String [] args){
int i=0;
for(;;){
if(i>10){
break;
}
System.out.println("hello"+i);
i++;
}
}
}
也就是说相当于是这样的过程,并不是说上来就直接全部的一个平面思维去执行for循环里面的语句。
从这个拆写的就能看出来,i=0就执行1次,之后就不再执行了。
现在来个小练习:
从1加到100怎样计算呢,不要跟我说高斯定理哈,我们是计算机,我们是编程,是用编程来解决事情的,用循环就搞定!
public class Niukewang{
public static void main(String [] args){
//0+1+2+3+4+5+6+7+。。。。。100
for(int i=0;i<=100;i++){
int sum=0;
sum=sum+i;
System.out.println(sum);
}
}
}
细心的你应该会发现这个是错误的,这种是一个非常严重的错误,是为了程序而程序,不是真正的写代码。最后输出的应该是从0到100,而不是1到100相加的总和。
你原来在里面每次都要将sum设为0,你这个sum就是用来存储值的,所以这样就根本没有这个功能,所以要放在外面
那么怎么做呢?
public class Niukewang{
public static void main(String [] args){
int sum=0;
for(int i=0;i<=100;i++){
sum=sum+i;
System.out.println(sum);
}
}
}
这回对是对了,但是可以看到结果的话就是他这个是把每一次的结果都输出一遍,那么该怎样优化呢?
因为每次想要循环的部分就有输出结果,所以才会导致每次结果都输出,所以想改正的话就把这个输出和放在外面,只执行一次就可以啦!
如下:
public class Niukewang{
public static void main(String [] args){
int sum=0;
for(int i=0;i<=100;i++){
sum=sum+i;
}
System.out.println(sum);
}
}
那么现在想要输出1-100的所有偶数的和怎么办呢?
public class Niukewang{
public static void main(String [] args){
int sum=0;
for(int i=0;i<=100;i=i+2){
sum=sum+i;
}
System.out.println(sum);
}
}
这样就可以了!
那如果不允许改变i++你又该怎么办呢?
public class Niukewang{
public static void main(String [] args){
int sum=0;
for(int i=0;i<=100;i++){
if(i%2==0){
sum=sum+i;
}
}
System.out.println(sum);
}
}
练习:输出如下图形
$$$$$$
$$$$$$
$$$$$$
$$$$$$
$$$$$$
$$$$$$
涉及到行和列了,肯定一个循环搞不定我们这个了,那么一定就要两层循环了,其中一个控制行,一个控制列。如下:
public class Niukewang{
public static void main(String [] args){
for(int i=0;i<6;i++){
for(int j=0;j<6;j++){
System.out.println("$");
}
System.out.println();
}
}
}
练习:
下列for循环的循环体执行次数为
for(int i=10, j=1; i=j=0; i++, j--)
A 0
B 1
C 无限
D 以上都不对
循环语句while
while语句格式
init_statements;
while(boolean_expression){
statement or block;
alter_expression;
}
while循环每次执行循环体之前,先对boolean_expression循环条件求值,如果循环条件为true,则运行循环体部分,从上面语法格式中来看,迭代语句iteration_statements总是位于循环体的最后,所以呢直邮当循环体能成功执行完成时,while循环才会执行iteration_statements迭代语句。
这样看来,while循环也可以被当成是条件语句,如果test_expression条件一开始就为false,则循环体部分将永远不会获得执行。
那么想循环一个简单的while循环语句怎么样循环呢
public class Niukewang{
public static void main(String [] args){
int i=0;
while(i<10){
System.out.println(i);
i++;
}
}
}
如果while循环的循环体部分和迭代语句合并在一起,并且只有一行代码,则可以省略while循环后面的花括号,但是这种省略花括号的做法,可能会降低程序的可读性。
使用while循环时,一定要保证循环条件有编程false的时候,否则这个循环将成为一个死循环,永远无法结束这个循环,来个程序
public class Niukewang{
public static void main(String [] args){
int a=0;
while(a<10){
System.out.println(a);
a--;
}
System.out.println("永远都跳不出这个循环了哦");
}
}
因为a的值越来越小,这将导致a永远小于10,循环条件一直未真,所以这个循环永远都无法结束。
还有很多容易犯的错误,就是while循环体后面跟了一个分号
这里需要特别注意的就是while表达式的括号后面一定不能加“;”
也就是说
public class Niukewang{
public static void main(String [] args){
int a=0;
while(a<10);
{
System.out.println(a);
a--;
}
System.out.println("永远都跳不出这个循环了哦");
}
}
这也是很多初学者甚至是非初学者容易犯的错误,比如哪里多了一个空格啊,哪里多了一个分号啊,全角半角总是弄错啊,所以这些一定要注意
do while循环语句
循环语句(do...while)
do...while语句格式:
init_expression
do{
statement;
}while(test_expression);
while(boolean_expression){
statement or block;
alter_expression;
}
这个do while就不一样啦,循环条件后面必须有个分号,这个分号来表明循环结束。
public class Niukewang{
public static void main(String [] args){
int i=1;
do{
System.out.println(i);
i++;
}
while(i<10);
System.out.println("结束");
}
}
那么while和do while到底有何区别呢?
while循环是先判断循环条件,如果条件为真才执行循环体;而do...while循环则是先执行循环体,然后再判断循环条件,如果循环条件为真,则执行下一个循环,否则中止循环。
那么关于上节课的那个关于行和列涉及到的是嵌套循环,很多人好像对这个不是特别理解
嵌套循环就是把一个循环放在另外一个循环里,形成了嵌套循环,嵌套循环既可以是for循环嵌套,也可以是while循环等等,一般来说用for循环的比较普遍和方便。
当程序遇到嵌套循环的时候,如果外层循环的条件荀彧,就开始执行外层循环的循环体,而内层循环将被外层循环的循环体来执行--只是内层循环需要反复执行自己的循环体而已。当内层循环执行结束,并且外层循环的循环体执行结束,则再次计算外层循环的循环条件,决定是否再次开始执行外层循环的循环体。
这样的话,假设外层循环的循环次数是n次,内层循环的循环次数为m次那么内层循环的循环体实际上需要执行n*m次
这样再去看昨天的那个就能理解了,一点点看进入嵌套循环,循环变量i开始是0,进入外层循环,进入外层循环后,内层循环把i当成一个普通变量,值为0,在外层循环的档次循环里,内层循环流是一个普通循环。
而且不仅仅可以两层循环,还可以三层,四层等等,不论循环如何嵌套,我们都可以把内层循环当成外层循环的循环体来对待,区别就是这个循环体力包含了需要反复执行的代码。
因为之前的一些例子都是用for循环演示的,大家可以参考练习一下用其他循环怎么写
练习:来一个挑战一点的题目
142857是一个六位数,我们发现:
142857 * 1 = 142857
142857 * 2 = 285714
142857 * 3 = 428571
142857 * 4 = 571428
142857 * 5 = 714285
142857 * 6 = 857142
即用1到6的整数去乘142857,会得到一个将原来的数首尾相接循环移动若干数字再在某处断开而得到的数字。
也就是说,如果把原来的数字和新的数字都首尾相接,他们得到的环是相同的。只是两个数的起始数字不一定相同。
请写一个程序,判断给定的数不是循环数。
输入描述:
输入包括多组数据。
每组数据包含一个正整数n,n是2到60位的正整数,并且允许前缀0。即001也是合法的输入数据。
输出描述:
对应每一组数据,如果是循环数,则输出“Yes”;否则,输出“No”。
输入例子:
142857
012345
输出例子:
Yes
No
在Java语言中,没有goto语句控制程序的跳转,但是有continue和break,return来控制循环结构。
我们分别来说一下
使用break结束循环
有时候我们想让某种条件出现就停止循环,而不是等到循环条件为假的时候才停止,这个时候就可以用break来循环了,break用于完全结束一个循环,跳出循环体。不管是哪一种循环,只要循环体中遇到break,系统将完全结束该循环,开始执行循环之后的代码。使用break语句可以终止switch语句或者循环语句的执行。我们来看一下这个程序:
public class Niukewang{
public static void main(String [] args){
for(int i=0;i<10;i++){
System.out.println(i);
if(i==2){
break;
}
}
}
}
也就是说运行这个程序,i循环到2的时候就结束了,当i等于2的时候,循环体内遇到break语句,程序跳出该循环。
需要注意的是break语句不仅仅可以技术所在的循环,还可以直接结束其外层循环。此时需要在break后紧跟一个标签,这个标签用于标识一个外层循环。
Java中的标签就是一二个紧跟着英文冒号(:)的标识符,与其他语言不同的是,Java中的标签直邮放在循环语句之前才有作用,来看这段代码:
public class Niukewang{
public static void main(String [] args){
outer:
for(int i=0;i<5;i++){
for(int j=0;j<3;j++){
System.out.println(i);
System.out.println(j);
if(j==1){
break outer;
}
}
}
}
}
当程序从外层循环进入内层循环后,当j=1的时候,程序遇到一个break outer语句,这行代码将会导致结束outer标签制定的循环,不是结束break所在的循环,而是结束break循环的外层循环。
需要注意的是,break后标签必须是一个有效的标签,也就是说这个标签必须在break语句所在的循环之前定义,或者在其所在循环的外层循环之前定义。当然啦,如果这个标签放在break语句所在循环之前定义,也就失去了标签的意义,因为break默认就是结束其所在的循环。
通常紧跟break之后的标签,必须在break所在循环的外层循环之前定义才有意义。