Java基础:第十二讲 循环结构

来源:互联网 发布:淘宝网络电话 编辑:程序博客网 时间:2024/05/21 11:59

 

循环结构
    循环结构完成的功能是循环执行某段代码多次。
    循环结构可以使用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决定是否循环,下面看一个例子。
    例:求1100100个数的和。
    分析:如果人工计算可以这样来做1+2+3+4+……当然这样写让计算机做也可以,但是如果计算11000010000个数的和怎么办呢?写起来太累了,所以不能这样来写。可以这样想,计算1100这些数字的和,可以这样理解:刚开始“和”为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的值,怎么改变呢?从11001用完了是22用完了是3,每次都是在原来的基础上加1,每次循环完之后都要改变i的值,所以可以使用表达式3,表达式3就是在完成循环之后执行的。所以表达式3可以写成:
                  i++;
    后一个问题,就是循环到什么时候呢?要计算1100的和,所以当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种形式:
for(表达式1;表达式2;表达式3){…}
for(;表达式2;表达式3){…}
for(表达式1;;表达式3){…}
for(表达式1;表达式2;){…}
for(;;表达式3){…}
for(;表达式2;){…}
for(表达式1;;){…}
for(;;){…}
2. while循环
         while循环的作用与for循环基本相同,只是结构不一样。
    基本结构如下:
        while(表达式1)
        {
               //循环体
         }
    这个结构与for循环体中省略初始化部分和修改循环状态部分之后的结构基本相同,表达式1是循环的条件,与for循环中的表达式2的作用相同。这个结构更容易理解,只要表达式1的值为true,就执行循环体,否则,结束循环。表达式1的值会随着循环体的执行而发生变化,否则要么死循环,要么一次也不执行。所以这里的循环体相当于for循环中的循环体与修改循环状态的部分。
    例:假设1n的和最接近10000,求n
    分析:12的和是313的和是614的和是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)后面必须有分号。
【例】输出120之间的偶数。
// 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 Bloghttp://blog.csdn.net/javaeeteacher
    邀请您为好友:http://student.csdn.net/invite.php?u=124362&c=7be8ba2b6f3b6cc5