C程式設計 | 迴圈結構程式設計
目錄
一、用while語句實現迴圈
一般格式:while(表示式) 語句
while迴圈的特點是先判斷條件表示式,後執行迴圈體語句。
while語句可簡單地記為: 只要當迴圈條件表示式為真(即給定的條件成立),就執行迴圈體語句。
“語句”就是迴圈體。迴圈體可以是一個簡單的語句,可以是複合語句(用花括號括起來的若干語句)。
執行迴圈體的次數是由迴圈條件控制的,這個迴圈條件就是上面一般形式中的“表示式”,它也稱為迴圈條件表示式。當此表示式的值為“真” (以非0值表示)時,就執行迴圈體語句;為“假” (以0表示)時,就不執行迴圈體語句。
例:使用while語句計算1+2+3+···+100
#include<stdio.h>
int main()
{
int i=1,sum=0; //定義變數i的初值為1,sum的初值為0
while(i<=100) //當i>100,條件表示式i<=100的值為假,不執行迴圈體
{ //迴圈體開始
sum=sum+i; //第1次累加後,sum的值為1
i++; //加完後,i的值加1,為下次累加做準備
} //迴圈體結束
printf("sum=%d\n",sum); //輸出1+2+3…+100的累加和
return 0;
}
執行結果:
程式分析:
(1) 迴圈體如果包含一個以上的語句,應該用花括號括起來,作為複合語句出現。
(2) 不要忽略給i和sum賦初值,否則它們的值是不可預測的,結果顯然不正確。
(3) 在迴圈體中應有使迴圈趨向於結束的語句。如本例中的“i++;”語句。如果無此語句,則i的值始終不改變,迴圈永遠不結束。
二、用do···while語句實現迴圈
一般形式:
do…while語句的特點是,先無條件地執行迴圈體,然後判斷迴圈條件是否成立。
例:使用do···while語句計算1+2+3+···+100
#include <stdio.h> int main() { int i=1,sum=0; do { sum=sum+i; i++; }while(i<=100); printf("sum=%d\n",sum); return 0; }
執行結果:
程式分析:在一般情況下,用while語句和用do…while語句處理同一問題時,若二者的迴圈體部分是一樣的,那麼結果也一樣。 但是如果while後面的表示式一開始就為假(0值)時,兩種迴圈的結果是不同的。
三、用for語句實現迴圈
一般形式:
- 表示式1: 設定初始條件,只執行一次。可以為零個、一個或多個變數設定初值。
- 表示式2: 是迴圈條件表示式,用來判定是否繼續迴圈。在每次執行迴圈體前先執行此表示式,決定是否繼續執行迴圈。
- 表示式3: 作為迴圈的調整,例如使迴圈變數增值,它是在執行完迴圈體後才進行的。
for語句更為靈活,不僅可以用於迴圈次數已經確定的情況,還可以用於迴圈次數不確定而只給出迴圈結束條件的情況,它完全可以代替while語句。
執行過程:
① 執行表示式1;
② 執行表示式2,若其值非0,則執行③;否則,結束迴圈;
③ 執行迴圈體;
④ 執行表示式3;
⑤ 轉②繼續執行。
注意:
- “表示式1”可以省略,即不設定初值,但表示式1後的分號不能省略。例如: for(;i<=100;i++)。應當注意: 由於省略了表示式1,沒有對迴圈變數賦初值,因此,為了能正常執行迴圈,應在for語句之前給迴圈變數賦以初值。
- 表示式2也可以省略,即不用表示式2來作為迴圈條件表示式,不設定和檢查迴圈的條件。此時迴圈無終止地進行下去,也就是認為表示式2始終為真。
- 表示式3也可以省略,但此時程式設計者應另外設法保證迴圈能正常結束。
- 甚至可以將3個表示式都可省略,即不設初值,不判斷條件(認為表示式2為真值),迴圈變數也不增值,無終止地執行迴圈體語句,顯然這是沒有實用價值的。
- 表示式1可以是設定迴圈變數初值的賦值表示式,也可以是與迴圈變數無關的其他表示式。表示式3也可以是與迴圈控制無關的任意表達式。但不論怎樣寫for語句,都必須使迴圈能正常執行。
- 表示式1和表示式3可以是一個簡單的表示式,也可以是逗號表示式,即包含一個以上的簡單表示式,中間用逗號間隔。
- 表示式2一般是關係表示式或邏輯表示式,但也可以是數值表示式或字元表示式,只要其值為非零,就執行迴圈體。
- for語句的迴圈體可為空語句,把本來要在迴圈體內處理的內容放在表示式3中,作用是一樣的。可見for語句功能強,可以在表示式中完成本來應在迴圈體內完成的操作。
- C 99允許在for語句的“表示式1”中定義變數並賦初值。
四、迴圈的巢狀
一個迴圈體內又包含另一個完整的迴圈結構,稱為迴圈的巢狀。內嵌的迴圈中還可以巢狀迴圈,這就是多層迴圈。
3種迴圈(while迴圈、do···while迴圈和for迴圈)可以相互巢狀。
五、幾種迴圈的比較
(1) 3種迴圈都可以用來處理同一問題,一般情況下它們可以互相代替。
(2) 在while迴圈和do…while迴圈中,只在while後面的括號內指定迴圈條件,因此為了使迴圈能正常結束,應在迴圈體中包含使迴圈趨於結束的語句(如i++,或i=i+1等)。
for迴圈可以在表示式3中包含使迴圈趨於結束的操作,甚至可以將迴圈體中的操作全部放到表示式3中。因此for語句的功能更強,凡用while迴圈能完成的,用for迴圈都能實現。
(3) 用while和do…while迴圈時,迴圈變數初始化的操作應在while和do…while語句之前完成。而for語句可以在表示式1中實現迴圈變數的初始化。
(4) while迴圈、do…while迴圈和for迴圈都可以用break語句跳出迴圈,用continue語句結束本次迴圈。
六、改變迴圈執行的狀態
1、用break語句提前終止迴圈
格式:break;
作用:使流程跳到迴圈體之外,接著執行迴圈體下面的語句。
注意:break語句只能用於迴圈語句和switch語句之中,而不能單獨使用。
例:在全系1000名學生中舉行慈善募捐,當總數達到10萬元時就結束,統計此時捐款的人數以及平均每人捐款的數目。
#include <stdio.h>
#define SUM 100000 //指定符號常量SUM代表10萬
int main()
{
float amount,aver,total;
int i;
for (i=1,total=0;i<=1000;i++)
{
printf("please enter amount:");
scanf("%f",&amount);
total=total+amount;
if(total>=SUM) break;
}
aver=total/i;
printf("num=%d\naver=%10.2f\n",i,aver);
return 0;
}
執行結果:
程式分析:for語句指定執行迴圈體1000次。每次迴圈中,輸入一個捐款人的捐款數,並累加到total中。設定了if語句,在每一次累加捐款數amount後,立即檢查累加和total是否達到或超過SUM(即100000),若超過就執行break語句,流程跳轉到迴圈體的花括號外,提前結束迴圈。
2、用continue語句提前結束本次迴圈
格式:continue;
作用:結束本次迴圈,即跳過迴圈體中下面尚未執行的語句,轉到迴圈體結束點之前,接著執行for語句中的“表示式3”,然後進行下一次是否執行迴圈的判定。
例:要求輸出100~200之間的不能被3整除的數。
#include <stdio.h>
int main()
{ int n;
for (n=100;n<=200;n++)
{ if (n%3==0)
continue;
printf("%d ",n);
}
printf("\n");
return 0;
}
執行結果:
程式分析:當n能被3整除時,執行continue語句,流程跳轉到表示迴圈體結束的右花括號的前面(注意不是右花括號的後面),從而跳過printf函式語句,結束本次迴圈,然後進行迴圈變數的增值(n++),只要n<=200,就會接著執行下一次迴圈。
七、迴圈程式舉例
1、用π/4 ≈ 1-1/3+1/5-1/7+···公式求π的近似值,直到發現某一項的絕對值小於10^-6為止(該項不累加)
解題思路:
找規律:
(1) 每項的分子都是1。
(2) 後一項的分母是前一項的分母加2。
(3) 第1項的符號為正,從第2項起,每一項的符號與前一項的符號相反。
(4) 在每求出一項後,檢查它的絕對值是否大於或等於10-6。
#include <stdio.h>
#include <math.h> //程式中用到數學函式fabs,應包含標頭檔案math.h
int main()
{ int sign=1; //sign用來表示數值的符號
double pi=0.0,n=1.0,term=1.0; //pi開始代表多項式的值,最後代表π的值, n代表分母,term代表當前項的值
while(fabs(term)>=1e-6) //檢查當前項term的絕對值是否大於或等於10-6
{ pi=pi+term; //把當前項term累加到pi中
n=n+2; //n+2是下一項的分母
sign=-sign; //sign代表符號,下一項的符號與上一項符號相反
term=sign/n; //求出下一項的值term
}
pi=pi*4; //多項式的和pi乘以4,才是π的近似值
printf("pi=%10.8f\n",pi); //輸出π的近似值
return 0;
}
執行結果:
2、求Fibonacci(斐波那契)數列的前8個數。(Fibonacci數列:前兩個數為1,1,從第三個數開始,該數是其前面兩個數之和)
#include <stdio.h>
int main()
{
int f1=1,f2=1,f3;
int i;
printf("%12d\n%12d\n",f1,f2);
for(i=1; i<=6; i++)
{
f3=f1+f2;
printf("%12d\n",f3);
f1=f2;
f2=f3;
}
return 0;
}
執行結果:
3、輸入一個大於3的整數n,判定它是否為素數(prime,又稱質數)。
#include <stdio.h>
int main()
{ int n,i;
printf("please enter a integer number,n=");
scanf("%d",&n);
for (i=2;i<n;i++)
if(n%i==0) break;
if(i<n) printf("%d is not a prime number.\n",n);
else printf("%d is a prime number.\n",n);
return 0;
}
執行結果: