程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> C語言初學者入門 第七講 循環結構

C語言初學者入門 第七講 循環結構

編輯:關於C

    循環結構是程序中一種很重要的結構。其特點是, 在給定條件成立時,反復執行某程序段,直到條件不成立為止。 給定的條件稱為循環條件,反復執行的程序段稱為循環體。 C語言提供了多種循環語句,可以組成各種不同形式的循環結構。

  while語句

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

  while語句的語義是:計算表達式的值,當值為真(非0)時, 執行循環體語句。其執行過程可用圖3—4表示。 統計從鍵盤輸入一行字符的個數。

#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);  

  本例程序中的循環條件為getchar()!='\n',其意義是, 只要從鍵盤輸入的字符不是回車就繼續循環。循環體n++完成對輸入字符個數計數。從而程序實現了對輸入一行字符的字符個數計數。

  使用while語句應注意以下幾點:

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

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);  

  本例程序將執行n次循環,每執行一次,n值減1。循環體輸出表達式a++*2的值。該表達式等效於(a*2;a++)

  2.循環體如包括有一個以上的語句,則必須用{}括起來, 組成復合語句。

  3.應注意循環條件的選擇以避免死循環。

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

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

  do-while語句

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

do
 語句;
while(表達式);

  其中語句是循環體,表達式是循環條件。

  do-while語句的語義是:

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

  do-while語句和while語句的區別在於do-while是先執行後判斷,因此do-while至少要執行一次循環體。而while是先判斷後執行,如果條件不滿足,則一次循環體語句也不執行。

  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);

  在本例中,循環條件改為--n,否則將多執行一次循環。這是由於先執行後判斷而造成的。

  對於do-while語句還應注意以下幾點:

  1.在if語句,while語句中, 表達式後面都不能加分號, 而在 do-while語句的表達式後面則必須加分號。

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

  3.在do和while之間的循環體由多個語句組成時,也必須用{}括起來組成一個復合語句。

  4.do-while和while語句相互替換時,要注意修改循環控制條件。

  for語句

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

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

  語句:

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

  表達式2 通常是循環條件,一般為關系表達式或邏輯表達式。

  表達式3 通常可用來修改循環變量的值,一般是賦值語句。

  這三個表達式都可以是逗號表達式, 即每個表達式都可由多個表達式組成。三個表達式都是任選項,都可以省略。

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

  1.首先計算表達式1的值。

  2.再計算表達式2的值,若值為真(非0)則執行循環體一次, 否則跳出循環。

  3.然後再計算表達式3的值,轉回第2步重復執行。在整個for循環過程中,表達式1只計算一次,表達式2和表達式,3則可能計算多次。循環體可能多次執行,也可能一次都不執行。for 語句的執行過程如圖所示。

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

  用for語句計算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語句中的表達式3為n++,實際上也是一種賦值語句,相當於n=n+1,以改變循環變量的值。

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個連續的偶數。

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

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

  在使用for語句中要注意以下幾點

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

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

  2.在循環變量已賦初值時,可省去表達式1,如例3.27即屬於這種情形。如省去表達式2或表達式3則將造成無限循環, 這時應在循環體內設法結束循環。例題即屬於此情況。

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);
}


  本例中省略了表達式1和表達式3,由循環體內的n--語句進行循環變量n的遞減,以控制循環次數。

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語句的表達式全部省去。由循環體中的語句實現循環變量的遞減和循環條件的判斷。當n值為0時,由break語句中止循環,轉去執行for以後的程序。在此情況下,for語句已等效於while( 1)語句。如在循環體中沒有相應的控制手段,則造成死循環。

  3.循環體可以是空語句。

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

  本例中,省去了for語句的表達式1,表達式3也不是用來修改循環變量,而是用作輸入字符的計數。這樣, 就把本應在循環體中完成的計數放在表達式中完成了。因此循環體是空語句。應注意的是,空語句後的分號不可少,如缺少此分號,則把後面的printf 語句當成循環體來執行。反過來說,如循環體不為空語句時, 決不能在表達式的括號後加分號, 這樣又會認為循環體是空語句而不能反復執行。這些都是編程中常見的錯誤,要十分注意。

  4.for語句也可與while,do-while語句相互嵌套,構成多重循環。以下形成都合法的嵌套。

(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");
 }
}

 

*
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved