1. 程式人生 > >C程式設計 | 迴圈結構程式設計

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

執行結果: