機(jī)電之家資源網(wǎng)
單片機(jī)首頁|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
C語言初學(xué)者入門講座 第七講 循環(huán)結(jié)構(gòu)
C語言初學(xué)者入門講座 第七講 循環(huán)結(jié)構(gòu)
 更新時(shí)間:2008-7-27 16:04:59  點(diǎn)擊數(shù):2
【字體: 字體顏色
循環(huán)結(jié)構(gòu)是程序中一種很重要的結(jié)構(gòu)。其特點(diǎn)是, 在給定條件成立時(shí),反復(fù)執(zhí)行某程序段,直到條件不成立為止。 給定的條件稱為循環(huán)條件,反復(fù)執(zhí)行的程序段稱為循環(huán)體。 C語言提供了多種循環(huán)語句,可以組成各種不同形式的循環(huán)結(jié)構(gòu)。

  while語句

  while語句的一般形式為: while(表達(dá)式)語句; 其中表達(dá)式是循環(huán)條件,語句為循環(huán)體。

  while語句的語義是:計(jì)算表達(dá)式的值,當(dāng)值為真(非0)時(shí), 執(zhí)行循環(huán)體語句。其執(zhí)行過程可用圖3—4表示。 統(tǒng)計(jì)從鍵盤輸入一行字符的個(gè)數(shù)。

#include <stdio.h>
void main(){
int n=0;
printf("input a string:\n");
while(getchar()!='\n') n++;
printf("%d",n);
} int n=0;
printf("input a string:\n");
while(getchar()!='\n')
n++;
printf("%d",n);  

  本例程序中的循環(huán)條件為getchar()!='\n',其意義是, 只要從鍵盤輸入的字符不是回車就繼續(xù)循環(huán)。循環(huán)體n++完成對(duì)輸入字符個(gè)數(shù)計(jì)數(shù)。從而程序?qū)崿F(xiàn)了對(duì)輸入一行字符的字符個(gè)數(shù)計(jì)數(shù)。

  使用while語句應(yīng)注意以下幾點(diǎn):

  1.while語句中的表達(dá)式一般是關(guān)系表達(dá)或邏輯表達(dá)式,只要表達(dá)式的值為真(非0)即可繼續(xù)循環(huán)。

void main(){
 int a=0,n;
 printf("\n input n: ");
 scanf("%d",&n);
 while (n--)
 printf("%d ",a++*2);
} int a=0,n;
printf("\n input n: ");
scanf("%d",&n);
while (n--)
printf("%d ",a++*2);  

  本例程序?qū)?zhí)行n次循環(huán),每執(zhí)行一次,n值減1。循環(huán)體輸出表達(dá)式a++*2的值。該表達(dá)式等效于(a*2;a++)

  2.循環(huán)體如包括有一個(gè)以上的語句,則必須用{}括起來, 組成復(fù)合語句。

  3.應(yīng)注意循環(huán)條件的選擇以避免死循環(huán)。

void main(){
 int a,n=0;
 while(a=5)
  printf("%d ",n++);
} int a,n=0;
while(a=5)
printf("%d ",n++);  

  本例中while語句的循環(huán)條件為賦值表達(dá)式a=5, 因此該表達(dá)式的值永遠(yuǎn)為真,而循環(huán)體中又沒有其它中止循環(huán)的手段, 因此該循環(huán)將無休止地進(jìn)行下去,形成死循環(huán)。4.允許while語句的循環(huán)體又是while語句,從而形成雙重循環(huán)。

  do-while語句

  do-while語句的一般形式為:

do
 語句;
while(表達(dá)式);

  其中語句是循環(huán)體,表達(dá)式是循環(huán)條件。

  do-while語句的語義是:

  先執(zhí)行循環(huán)體語句一次, 再判別表達(dá)式的值,若為真(非0)則繼續(xù)循環(huán),否則終止循環(huán)。

  do-while語句和while語句的區(qū)別在于do-while是先執(zhí)行后判斷,因此do-while至少要執(zhí)行一次循環(huán)體。而while是先判斷后執(zhí)行,如果條件不滿足,則一次循環(huán)體語句也不執(zhí)行。

  while語句和do-while語句一般都可以相互改寫。

void main(){
 int a=0,n;
 printf("\n input n: ");
 scanf("%d",&n);
 do printf("%d ",a++*2);
 while (--n);
}
int a=0,n;
printf("\n input n: ");
scanf("%d",&n);
do printf("%d ",a++*2);
while (--n);

  在本例中,循環(huán)條件改為--n,否則將多執(zhí)行一次循環(huán)。這是由于先執(zhí)行后判斷而造成的。

  對(duì)于do-while語句還應(yīng)注意以下幾點(diǎn):

  1.在if語句,while語句中, 表達(dá)式后面都不能加分號(hào), 而在 do-while語句的表達(dá)式后面則必須加分號(hào)。

  2.do-while語句也可以組成多重循環(huán),而且也可以和while語句相互嵌套。

  3.在do和while之間的循環(huán)體由多個(gè)語句組成時(shí),也必須用{}括起來組成一個(gè)復(fù)合語句。

  4.do-while和while語句相互替換時(shí),要注意修改循環(huán)控制條件。

  for語句

  for語句是C語言所提供的功能更強(qiáng),使用更廣泛的一種循環(huán)語句。其一般形式為:

for(表達(dá)式1;表達(dá)式2;表達(dá)3)  

  語句:

  表達(dá)式1 通常用來給循環(huán)變量賦初值,一般是賦值表達(dá)式。也允許在for語句外給循環(huán)變量賦初值,此時(shí)可以省略該表達(dá)式。

  表達(dá)式2 通常是循環(huán)條件,一般為關(guān)系表達(dá)式或邏輯表達(dá)式。

  表達(dá)式3 通?捎脕硇薷难h(huán)變量的值,一般是賦值語句。

  這三個(gè)表達(dá)式都可以是逗號(hào)表達(dá)式, 即每個(gè)表達(dá)式都可由多個(gè)表達(dá)式組成。三個(gè)表達(dá)式都是任選項(xiàng),都可以省略。

  一般形式中的“語句”即為循環(huán)體語句。for語句的語義是:

  1.首先計(jì)算表達(dá)式1的值。

  2.再計(jì)算表達(dá)式2的值,若值為真(非0)則執(zhí)行循環(huán)體一次, 否則跳出循環(huán)。

  3.然后再計(jì)算表達(dá)式3的值,轉(zhuǎn)回第2步重復(fù)執(zhí)行。在整個(gè)for循環(huán)過程中,表達(dá)式1只計(jì)算一次,表達(dá)式2和表達(dá)式,3則可能計(jì)算多次。循環(huán)體可能多次執(zhí)行,也可能一次都不執(zhí)行。for 語句的執(zhí)行過程如圖所示。

void main(){
int n,s=0;
for(n=1;n<=100;n++)
s=s+n;
printf("s=%d\n",s);
}  

  用for語句計(jì)算s=1+2+3+...+99+100

int n,s=0;
for(n=1;n<=100;n++)
s=s+n;
printf("s=%d\n",s);  

  本例for語句中的表達(dá)式3為n++,實(shí)際上也是一種賦值語句,相當(dāng)于n=n+1,以改變循環(huán)變量的值。

void main(){
int a=0,n;
printf("\n input n: ");
scanf("%d",&n);
for(;n>0;a++,n--)
printf("%d ",a*2);
}

  用for語句修改例題。從0開始,輸出n個(gè)連續(xù)的偶數(shù)。

int a=0,n;
printf("\n input n: ");
scanf("%d",&n);
for(;n>0;a++,n--)
printf("%d ",a*2);

  本例的for語句中,表達(dá)式1已省去,循環(huán)變量的初值在for語句之前由scanf語句取得,表達(dá)式3是一個(gè)逗號(hào)表達(dá)式,由a++,n-- 兩個(gè)表達(dá)式組成。每循環(huán)一次a自增1,n自減1。a的變化使輸出的偶數(shù)遞增,n的變化控制循次數(shù)。

  在使用for語句中要注意以下幾點(diǎn)

  1.for語句中的各表達(dá)式都可省略,但分號(hào)間隔符不能少。如:for(;表達(dá)式;表達(dá)式)省去了表達(dá)式1。for(表達(dá)式;;表達(dá)式)省去了表達(dá)式2。

  for(表達(dá)式;表達(dá)式;)省去了表達(dá)式3。for(;;)省去了全部表達(dá)式。

  2.在循環(huán)變量已賦初值時(shí),可省去表達(dá)式1,如例3.27即屬于這種情形。如省去表達(dá)式2或表達(dá)式3則將造成無限循環(huán), 這時(shí)應(yīng)在循環(huán)體內(nèi)設(shè)法結(jié)束循環(huán)。例題即屬于此情況。

void main(){
int a=0,n;
printf("\n input n: ");
scanf("%d",&n);
for(;n>0;)
{ a++;n--;
 printf("%d ",a*2);
}
} int a=0,n;
printf("\n input n: ");
scanf("%d",&n);
for(;n>0;)
{ a++;n--;
printf("%d ",a*2);
}


  本例中省略了表達(dá)式1和表達(dá)式3,由循環(huán)體內(nèi)的n--語句進(jìn)行循環(huán)變量n的遞減,以控制循環(huán)次數(shù)。

void main(){
int a=0,n;
printf("\n input n: ");
scanf("%d",&n);
for(;;){
a++;n--;
printf("%d ",a*2);
if(n==0)break;
}
}
int a=0,n;
printf("\n input n: ");
scanf("%d",&n);
for(;;){
a++;n--;
printf("%d ",a*2);
if(n==0)break;
}

  本例中for語句的表達(dá)式全部省去。由循環(huán)體中的語句實(shí)現(xiàn)循環(huán)變量的遞減和循環(huán)條件的判斷。當(dāng)n值為0時(shí),由break語句中止循環(huán),轉(zhuǎn)去執(zhí)行for以后的程序。在此情況下,for語句已等效于while( 1)語句。如在循環(huán)體中沒有相應(yīng)的控制手段,則造成死循環(huán)。

  3.循環(huán)體可以是空語句。

#include"stdio.h"
void main(){
 int n=0;
 printf("input a string:\n");
 for(;getchar()!='\n';n++);
  printf("%d",n);
}

  本例中,省去了for語句的表達(dá)式1,表達(dá)式3也不是用來修改循環(huán)變量,而是用作輸入字符的計(jì)數(shù)。這樣, 就把本應(yīng)在循環(huán)體中完成的計(jì)數(shù)放在表達(dá)式中完成了。因此循環(huán)體是空語句。應(yīng)注意的是,空語句后的分號(hào)不可少,如缺少此分號(hào),則把后面的printf 語句當(dāng)成循環(huán)體來執(zhí)行。反過來說,如循環(huán)體不為空語句時(shí), 決不能在表達(dá)式的括號(hào)后加分號(hào), 這樣又會(huì)認(rèn)為循環(huán)體是空語句而不能反復(fù)執(zhí)行。這些都是編程中常見的錯(cuò)誤,要十分注意。

  4.for語句也可與while,do-while語句相互嵌套,構(gòu)成多重循環(huán)。以下形成都合法的嵌套。

(1)for(){…
  while()
   {…}
  …
    }
(2)do{
   …
  for()
   {…}
  …
  }while();
(3)while(){
      …
      for()
       {…}
      …
     }
(4)for(){
    …
    for(){
    …
     }
    }
void main(){
int i,j,k;
for(i=1;i<=3;i++)
{
 for(j=1;j<=3-i+5;j++)
  printf(" ");
  for(k=1;k<=2*i-1+5;k++)
  {
   if(k<=5) printf(" ");
   else printf("*");
  }
  printf("\n");
 }
}

  • 上一篇: C語言初學(xué)者入門講座 第八講 轉(zhuǎn)移語句
  • 下一篇: C語言初學(xué)者入門講座 第六講 分支結(jié)構(gòu)(2)
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對(duì)此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請(qǐng)聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1