循环结构
循环结构完成的功能是循环执行某段代码多次。
循环结构可以使用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
循环通常是在不知道循环次数的时候使用。
上一讲:
第十一讲选择结构
下一讲:第十三讲 基本语法练习(看看你会不会出错)
李绪成
CSDN Blog
:
http://blog.csdn.net/javaeeteacher
邀请您为好友:
http://student.csdn.net/invite.php?u=124362&c=7be8ba2b6f3b6cc5