C語言入門教程之六循環語句和循環控制

 Turbo C 2.0提供三種基本的循環語句: for語句、while語句和do-while語句。

一、循環語句
    (一)、for循環  它的一般形式爲:
        for(<初始化>;<條件表過式>;<增量>)
            語句;
        初始化總是一個賦值語句,它用來給循環控制變量賦初值;條件表達式是一個關係表達式,它決定什麼時候退出循環;增量定義循環控制變量每循環一次後按什麼方式變化。這三個部分之間用;分開。
        例如:
            for(i=1;i<=10;i++)
                語句;
        上例中先給i賦初值1,判斷i是否小於等於10,若是則執行語句,之後值增加1。再重新判斷,直到條件爲假,即i>10時,結束循環。
        注意: 
            (1).for循環中語句可以爲語句體,但要用{和}將參加循環的語句括起來。
            (2).for循環中的初始化、條件表達式和增量都是選擇項,即可以缺省,但;不能缺省。省略了初始化,表示不對循環控制變量賦初值。省略了條件表達式,則不做其它處理時便成爲死循環。省略了增量,則不對循環控制變量進行操作,這時可在語句體中加入修改循環控制變量的語句。
            (3).for循環可以有多層嵌套。
        例如:
            for(;;)  語句;
            for(i=1;;i+=2) 語句;
            for(j=5;;) 語句;
        這些for循環語句都是正確的。
        main() 
        {
            int i,j;
            printf(i  j/n);
            for(i=0;i<2;i++)
                for(j=0;j<3;j++)
                    printf(%d  %d/n,i,j);
        } 
        輸出結果爲: 
            i  j
            0  0
            0  1
            0  2
            1  0
            1  1
            1  2

        用for循環求1+2+……+100的和:
        main()
        {
            int sn=0,i;
            for(i=1;i<=100;i++)
                sn+=i;                /*1+2+……+100*/
            printf(%d/n,sn);
        }
       從程序可以看出,使用循環語句可以大大簡化代碼。
   (二)、while循環  它的一般形式爲: 
       while(條件)
           語句;
       while循環表示當條件爲真時,便執行語句。直到條件爲假才結束循環。並繼續執行循環程序外的後續語句。
       例如:
           #include stdio.h
           main() 
           { 
               char c; 
               c=&apos;/0&apos;;             /*初始化c*/
               while(c!=&apos;/n&apos;)      /*回車結束循環*/
                   c=getche();       /*帶回顯的從鍵盤接收字符*/
           } 
                
       上例中,while循環是以檢查c是否爲回車符開始,因其事先被初始化爲空,所以條件爲真,進入循環等待鍵盤輸入字符;一旦輸入回車,則c=&apos;/n&apos;,條件爲假,循環便告結束。與for循環一樣,while循環總是在循環的頭部檢驗條件,這就意味着循環可能什麼也不執行就退出。 
       注意: 
           (1).在while循環體內也允許空語句。 
               例如: 
                   while((c=getche())!=&apos;/n&apos;); 
               這個循環直到鍵入回車爲止。 
           (2).可以有多層循環嵌套。 
           (3).語句可以是語句體, 此時必須用{和}括起來。
               用while循環求1+2+……+100的和:
               main()
               {
                   int sn=0,i=0;
                   while(++i<=100)
                       sn+=i;                /*求1+2+……+100*/
                   printf(%d/n,sn);
               }
    (三)、do--while循環  它的一般格式爲:
        do
        {
            語句塊;
        }
        while(條件);
        這個循環與while循環的不同在於:它先執行循環中的語句,然後再判斷條件是否爲真,如果爲真則繼續循環;如果爲假,則終止循環。因此,do-while循環至少要執行一次循環語句。
        同樣當有許多語句參加循環時,要用{和}把它們括起來。
        
        用do--while循環求1+2+……+100的和:
        main()
        {
            int sn=0,i=1;
            do
                sn+=i;               /*求1+2+……+100*/
            while(++i<=100);
            printf(%d/n,sn);
        }
       從上面三個程序看出,使用for,while和do--while求解同樣的問題,基本思路都差不多,只是在第一次計算時,注意初值。

二、循環控制
    (一)、break語句
        break語句通常用在循環語句和開關語句中。當break用於開關語句switch中時,可使程序跳出switch而執行switch以後的語句;如果沒有break語句,則將成爲一個死循環而無法退出。break在switch中的用法已在前面介紹開關語句時的例子中碰到,這裏不再舉例。                
        當break語句用於do-while、for、while循環語句中時,可使程序終止循環而執行循環後面的語句,通常break語句總是與if語句聯在一起。即滿足條件時便跳出循環。
        例如:
        main()
        {
            int sn=0,i;
            for(i=1;i<=100;i++)
            {
                if(i==51) break;      /*如果i等於51,則跳出循環*/
                sn+=i;                /*1+2+……+50*/
            }
            printf(%d/n,sn);
        }
                
       可以看出,最終的結果是1+2+……+50。因爲在i等於51的時候,就跳出循環了。自己寫寫怎樣在while和do--while循環中增加break語句。
       注意: 
           1. break語句對if-else的條件語句不起作用。
           2. 在多層循環中,一個break語句只向外跳一層。
           例如:
               main() 
               {
                   int i,j;
                   printf(i  j/n);
                   for(i=0;i<2;i++)
                       for(j=0;j<3;j++)
                       {
                           if(j==2) break;
                           printf(%d  %d/n,i,j);
                       }
               } 
                輸出結果爲: 
                 i  j
                 0  0
                 0  1
                 1  0
                 1  1
                當i==0,j==2時,執行break語句,跳出到外層的循環,i變爲1。
    (二)、continue語句
        continue語句的作用是跳過循環本中剩餘的語句而強行執行下一次循環。
        continue語句只用在for、while、do-while等循環體中, 常與if條件語句一起使用,用來加速循環。
        例如:
            main()
            {
                int sn=0,i;
                for(i=1;i<=100;i++)
                {
                    if(i==51) continue; /*如果i等於51,則結束本次循環*/
                    sn+=i;              /*1+2+……+50+52+……+100*/
                }
                printf(%d/n,sn);
           }
       從程序中可以看出,continue語句只是當前的值沒有執行,也就是說當前的值跳過去了,接着執行下次循環。
       main() 
       {
           int i,j;
           printf(i  j/n);
           for(i=0;i<2;i++)
               for(j=0;j<3;j++)
               {
                   if(j==1) continue;
                   printf(%d  %d/n,i,j);
               }
       } 
         輸出結果爲: 
            i  j
            0  0
            0  2
            1  0
            1  2
    (三)、goto語句
        goto語句是一種無條件轉移語句,與BASIC中的goto語句相似。goto語句的使用格式爲: 
            goto  標號; 
        其中標號是Turbo C 2.0中一個有效的標識符,這個標識符加上一個:一起出現在函數內某處,執行goto語句後,程序將跳轉到該標號處並執行其後的語句。標號既然是一個標識符,也就要滿足標識符的命名規則。另外標號必須與goto語句同處於一個函數中,但可以不在一個循環層中。通常goto語句與if條件語句連用,當滿足某一條件時,程序跳到標號處運行。goto語句通常不用,主要因爲它將使程序層次不清,且不易讀,但在多層嵌套退出時,用goto語句則比較合理。
        main()
        {       
            int sn=0,i;
            for(i=1;i<=100;i++)
            {
                if(i==51) goto loop;  /*如果i等於51,則跳出循環*/
                sn+=i;                /*1+2+……+50*/
            }
            loop: ;
            printf(%d/n,sn);
        }
        可以看出,這兒的goto語句和break作用很類似。
        這兒的loop: ;
              printf(%d/n,sn);
        也可以寫成loop: printf(%d/n,sn);
        main()
        {
            int sn=0,i;
            for(i=1;i<=100;i++)
            {
                if(i==51) goto loop; /*如果i等於51,則跳出本次循環*/
                sn+=i;               /*1+2+……+50+52+……+100*/
                loop: ;
            }
            printf(%d/n,sn);
        }
        可以看出這兒的loop語句和continue的作用類似。
        但是某些情況下又必須使用goto語句,否則會讓程序大大臃腫。如:
        main() 
        {
            int i,j,k;
            printf(i  j  k/n);
            for(i=0;i<2;i++)
                for(j=0;j<3;j++)
                    for(k=0;k<3;k++)
                    {
                        if(k==2) goto loop;
                        printf(%d  %d  %d/n,i,j,k);
                    }
                    loop: ;
        } 
          輸出結果爲: 
            i  j  k
            0  0  0
            0  0  1
        如果不使用goto語句,而使用break,continue語句,應該這樣
        main() 
        {
            int i,j,k;
            printf(i  j/n);
            for(i=0;i<2;i++)
            {
                for(j=0;j<3;j++)
                {
                    for(k=0;k<3;k++)
                    {
                        if(k==2) break;
                        printf(%d  %d  %d/n,i,j,k);
                    }
                    if(k==2) break;
                }
                if(k==2) break;
            }
        }
             輸出結果爲: 
              i  j  k
              0  0  0
              0  0  1
       所以在同時跳出多層循環時,應該使用goto語句。記住,所有的goto語句其實都是可以用break,continue代替的。

     下面舉幾個例子:
     1.求兩個整數的最大公約數。例如10和15的最大公約數是5。
         分析:最大公約數一定小於等於最小的那個數一半,同時能被兩數整除。
     main()
     {
         int num1,num2,i,min;
         scanf(%d%d,&num1,&num2);
         min=num1<num2?num1:num2;       /*得到最小值*/
         for(i=min/2;i>0;i--)
             if(num1%i==0&&num2%i==0) break;
         printf(最大公約數爲%d/n,i);
     }
    
     2.求1!+2!+……+n!(n<10)
     main()
     {
          int n,i;
          long temp=1,sn=0; /*從9!以後,所得的值就超過了int範圍*/
          scanf(%d,&n);
          for(i=1;i<=n;i++)
          {
              temp*=i;
              sn+=temp;       /*如果沒有這一步,求的就是n!*/
          }
          printf(%ld/n,sn);
     }
     那麼想想,如果求1!+3!+5!+……+n!應該怎麼辦?
       
     3.判斷一個整數是不是素數(素數就是隻能被本身和1整除的數)。
     #include math.h
     main()
     {
         int num,i,flag=0;
         scanf(%d,&num);
         for(i=2;i<sqrt(num);i++)  /*這裏面使用sqrt()是爲了減少循環步驟,如果寫成i<num也可以,但是所花費的時間將多很多。*/
         {
             flag=0;                /*標誌變量復位*/
             if(num%i==0)
             {
                 flag=1;
                 break;
             }
         }
         if(flag==0) printf(是素數/n);
         else printf(不是素數/n);
     }      
     可以說,在所有的C語言書上,都有判斷素數的例題。它的編程思想是:把一個變量作爲標誌變量,用來標誌是不是素數;循環體是從2到sqrt(num),因爲如果一個數不是素數的話,一定能分解成num=num1*num2,它們中的最小值一定小於sqrt(num),所以循環的時候只要到sqrt(num)就可以了。同時要注意變量復位的問題。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章