循环结构
循环结构完成的功能是循环执行某段代码多次。
循环结构可以使用for循环、for-each循环、while循环和do-while循环。
1. for循环
for循环的基本结构如下:
for(表达式1;表达式2;表达式3)
{
//循环体
}
表达式1用于初始化,在整个循环过程只执行一次;表达式2的结果应该为逻辑值,决定是否循环,如果为true,则继续循环,如果为false,则结束循环;表达式3在每次循环完成之后执行,主要的作用是修改循环变量,循环多少次就会执行多少次;循环体就是要循环执行的部分。如果循环体只有一行代码,循环体的大括号可以省略。
执行的具体过程如下:
(1) 首先执行表达式1,进行初始化;
(2) 然后执行表达式2,如果结果为true,执行第(3)步,如果结果为false,执行第(5)步;
(3) 执行循环体;
(4) 执行表达式3,转向表达式2;
(5) 结束
从这个过程可以看出,表达式2à循环体à表达式3形成了一个循环,表达式1仅仅在循环之前来完成初始化,表达式2决定是否循环,下面看一个例子。
例:求1到100这100个数的和。
分析:如果人工计算可以这样来做1+2+3+4+……当然这样写让计算机做也可以,但是如果计算1到10000这10000个数的和怎么办呢?写起来太累了,所以不能这样来写。可以这样想,计算1到100这些数字的和,可以这样理解:刚开始“和”为0,第一次把1加到“和”上,第二次把2加到“和”上,第三次把3加到“和”上……加到100为止,最终就得到这个“和”了。相当于每次都向“和”上加一个数字,重复做100次,不同的是每次加的值不一样,这样可以设置一个变量,然后每次在计算之后修改这个变量的值就可以了,假设这个变量为i,可以先让i等于1,执行完之后,让i等于2……这样就可以使用for循环来完成了。
首先需要定义一个“和”,这里使用sum,初始值为0,可以这样写:
int sum = 0;
然后定义变量i,每次循环的时候使用:
int i;
刚开始i等于1,这个可以通过循环结构中的表达式1完成,表达式1完成的就是初始化任务,所以表达式1可以写成:
i=1;
循环中要完成的工作就是把i添加到和上,所以循环体应该这样写:
sum = sum + i;
每次循环完之后,需要改变i的值,怎么改变呢?从1到100,1用完了是2,2用完了是3,每次都是在原来的基础上加1,每次循环完之后都要改变i的值,所以可以使用表达式3,表达式3就是在完成循环之后执行的。所以表达式3可以写成:
i++;
后一个问题,就是循环到什么时候呢?要计算1到100的和,所以当i<=100时需要把i加到“和”上,如果i>100,就不需要再循环了,所以循环的条件是i<=100,表达式2用于控制循环是否继续,所以表达式2的内容就可以写成:
i<=100
这样循环结构的几个部分都有了,所以得到下面的代码:
【例】
// ForTest.java
public class ForTest {
public static void main(String[] args) {
// sum存储和
int sum = 0;
// i表示循环变量
int i;
// i=0完成循环变量的初始化,i<=100表示循环的条件,
// i++修改循环变量的值
for(i=0;i<=100;i++){
// 循环体
sum+=i;
}
System.out.println("和为:"+sum);
}
}
运行结果为:
和为:5050
在使用for循环的时候,必须明确几点:
(1) 要循环执行哪些语句,也就是循环体;
(2) 循环的初始状态是什么,也就是表达式1的内容;
(3) 每次循环的区别在什么地方,如何修改这些变化的内容,也就是表达式3的内容的确定;
(4) 确定循环的条件,循环到什么时候为止,也就是表达式2的内容。
上面介绍的是最一般的情况,可能会出现下面的一些特殊情况:
(1) 表达式1用于初始化,并且只执行一次,所以可以认为与循环无关,可以把初始化放在循环之前完成,这样就会形成下面的结构:
表达式1
for(;表达式2;表达式3)
{
//循环体
}
这样上面的求和代码可以变成下面的代码(main方法中的部分):
int sum = 0;
int i;
i=0;
// 表达式1是一个空,但是分号不能省略
for(;i<=100;i++)
sum+=i;
System.out.println("和为:"+sum);
(2) 每次循环之后使用表达式3修改循环变量的值,只要循环一次,表达式3就会执行一次,所以可以把表达式3放在循环体的里面,效果是完全相同的,所以就有了下面的格式:
for(表达式1;表达式2;)
{
//循环体
表达式3
}
上面的代码可以改成下面的样子了:
int sum = 0;
int i;
for(i=0;i<=100;)
{
sum+=i;
i++;
}
System.out.println("和为:"+sum);
(3) 表达式2也可以省略,如果省略,循环就没有条件,循环也就不会在这里结束,相当于表达式2的值为true。那么怎么让循环停止呢?可以在循环体内结束循环,使用后面将要讲到的break。可以把for循环改成下面的格式:
for(表达式1;;表达式3)
{
if(!表达式2)
break;
//循环体
}
【注意】因为原来表达式2是循环的条件,而现在需要的是结束循环的条件,所以需要对表达式2取反。
按照这种结构,上面的代码可以变成:
int sum = 0;
int i;
for(i=0;;i++)
{
if(!(i<=100))
break;
sum+=i;
}
System.out.println("和为:"+sum);
(4) 最典型的情况是3个表达式全部省略,形成下面的结构:
表达式1
for(;;)
{
if(!(表达式2))
break;
//循环体
表达式3
}
上面的代码也就变成了:
int sum = 0;
int i;
i=0;
for(;;)
{
sum+=i;
i++;
if(i>100)
break;
}
System.out.println("和为:"+sum);
【注意】
(1) 不管怎么变化,for循环中用于分割3部分的分号不能少。
(2) for()括号后不能加分号,如果加了,相当于循环体是空语句。
下面是for循环的8种形式:
n for(表达式1;表达式2;表达式3){…}
n for(;表达式2;表达式3){…}
n for(表达式1;;表达式3){…}
n for(表达式1;表达式2;){…}
n for(;;表达式3){…}
n for(;表达式2;){…}
n for(表达式1;;){…}
n for(;;){…}
2. while循环
while循环的作用与for循环基本相同,只是结构不一样。
基本结构如下:
while(表达式1)
{
//循环体
}
这个结构与for循环体中省略初始化部分和修改循环状态部分之后的结构基本相同,表达式1是循环的条件,与for循环中的表达式2的作用相同。这个结构更容易理解,只要表达式1的值为true,就执行循环体,否则,结束循环。表达式1的值会随着循环体的执行而发生变化,否则要么死循环,要么一次也不执行。所以这里的循环体相当于for循环中的循环体与修改循环状态的部分。
例:假设1到n的和最接近10000,求n。
分析:1到2的和是3,1到3的和是6,1到4的和是10,随着n的增加越来越接近10000,但是当和接近10000的时候,再增加的话就又远离10000,所以循环结束的条件就是这个和与10000之间的距离最小。如果距离没有达到最小,则继续循环。
首先需要定义和,定义差值,定义循环变量,并进行初始化:
表示和
int sum = 0;
表示原来的差距
int dis1 = 10000;
表示新的差距
int dis2 = 10000;
int i=1;
然后要明确循环的内容:
sum = sum+i;
dis1 = dis2;
dis2 = 10000-sum;
if(dis2<0)
dis2=sum-10000;
i++;
然后定义循环结束的条件:
dis2<=dis1
根据以上的分析,得到下面的代码:
【例】
// WhileTest.java
public class WhileTest {
public static void main(String[] args) {
// 表示和
int sum = 0;
// 表示上次和与10000的差值
int dis1 = 10000;
// 表示这次和与10000的差值
int dis2 = 10000;
// 循环变量
int i=1;
while(dis1>=dis2)
{
sum = sum+i;
dis1 = dis2;
dis2 = 10000-sum;
if(dis2<0)
dis2=sum-10000;
i++;
}
i = i-2;
System.out.println(i);
}
}
运行的结果为:
141
【注意】while循环的小括号后也不能加分号。
3. do-while循环
与while循环基本相同,格式如下:
do
{
//循环体
}while(表达式1);
表达式1仍然是循环的条件,与while循环基本相同,区别有以下两点:
(1) 先循环,然后判断条件,所以至少可以循环一次;
(2) while(表达式1)后面必须有分号。
【例】输出1到20之间的偶数。
// DoWhileTest.java
public class DoWhileTest {
public static void main(String[] args) {
int i=1;
do
{
if(i%2==0)
System.out.println(i+" ");
i++;
}while(i<=20);
}
}
while循环与do-while循环只有第一次循环的时候不一样,后面的过程完全一样,如果肯定能执行一次的话,两个的效果是完全一样的。
for循环与while循环的区别主要是:for循环通常是在知道循环次数的时候使用,而while循环通常是在不知道循环次数的时候使用。