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

 

循环结构
    循环结构完成的功能是循环执行某段代码多次。
    循环结构可以使用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 种形式:
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 循环中的循环体与修改循环状态的部分。
    例:假设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

你可能感兴趣的:(Java基础:第十二讲 循环结构)