/* 預備 grade.h */ char grade(int score) { switch (score / 10) { case 10: case 9: return 'A'; case 8: return 'B'; case 7: return 'C'; case 6: return 'D'; case 5: case 4: case 3: case 2: case 1: case 0: return 'E'; default: return 0; } }
例1 的結構非常簡單易懂,但是書寫起來只有一個感覺--煩!同樣的三句話,居然重復了 5 次。假如這個班的人數不止 5 人,而是數十人的話,……天啊!簡直想都不敢想! C 語言當然不會笨得來一點方便都不給,這個"方便",就是循環結構。循環結構的目的就是減少重復代碼,減輕程序員的負擔。而其形式,在 C 語言中有三種:for 循環、while 循環和 do-while 循環。正面分別介紹如下:
for 循環的基本格式是 for (語句1; 邏輯表達式1; 語句2) {語句組1},大括號包括其中的語句組1 也可以是一條語句。其執行過程如下:先執行語句1,然后判定邏輯表達式1。假如邏輯表達式1 的值為"真(非0)",則執行語句組1,否則結束循環。在沒結束循環的情況下,執行了語句組1 之后,執行語句2。然后再對邏輯表達式1 進行判定,再……,如此循環直到邏輯表達式1 為"假(0)"時為止。于是,例1 可以改寫如下:
/* 例2 */ #include "grade.h" #include void main() { int n, i; for (i = 0; i < 5; i++) { printf("請輸入成績: "); scanf("%d", &n); printf("等級為: %c", grade(n)); } }
嘿,這么簡潔?!知道循環結構的便利之處了吧。例2 中 i 從 0 到 4,共執行了 5 次循環體。當然,也可以跟據個人的習慣,將例2 中的 for 語句改寫為:
for (i = 1; i <= 5; i++) {...}
這樣或許更輕易理解,但我不推薦這樣做,因為 C 語言中的數組下標是以 0 開始的,采用例1 中的 for 語句更輕易在循環體中讀寫數組元素。就上例,假如我們要把所有成績輸入完成之后再逐一將其等級打印出來,就需要用到數組:
/* 例3 */ #include "grade.h" #include
#define N 5
void main() { int n[N], i; for (i = 0; i < N; i++) { printf("請輸入成績: "); scanf("%d", &n[i]); } for (i = 0; i < N; i++) { printf("第 %d 個成績的等級為: %c", i, grade(n[i])); } }
例3 中,假如 i 從 1 到 N 循環的話,讀寫數組元素時就應該使用 n[i - 1] 而不是 n[i]。那么每執行一次循環體就會多一次減法運算,在一個循環 N 次的循環中,就會多進行 N 次減法運算,大大降低了程序效率。 C 語言是一種靈活的語言。它的 for 循環也不是一成不變,必須按照它的基本格式書寫。暫時賣個關子,先看看從例3 修改過來的例4:
/* 例4 */ #include "grade.h" #include
#define N 5
void main() { int n[N], i = 0; for (; i < N; ) { printf("請輸入成績: "); scanf("%d", &n[i++]); } for (i = 0; ; i++) { if (i == N) { break; } printf("第 %d 個成績的等級為: %c", i, grade(n[i])); } }
是不是很希奇,例4 中的兩個 for 循環中與上面兩個例子的 for 循環相比,都少用了一些語句,怎么回事?且聽我慢慢道來:
第一個 for 循環中,少了 i = 0 和 i++ 兩句。其實仔細一看,這兩句也沒少。i = 0 已經在給 i 賦初值的時候就實現了,而 i++ 是在 scnaf 語句中順便實現的。所以,雖然沒有 i = 0 一句,但循環開始之前 i 的值已經是 0 了;雖然沒有 i++ 一句,但循環體中實際也改變了 i 的值。
第二個 for 循環中少的只是那一句判定。而正是由于少了這一句判定,for 循環便不能自已結束。假如我在循環體中也不采取措施結束循環的話,這個循環將一直不停的執行下去,形成死循環。于是,我在循環體中對 i 進行判定,當它等于 N的時候執行一個 break 語句,跳出循環,填補了 for 語句中沒有邏輯表達式的缺陷。
甚至,一個 for 語句就可以寫成 for (; ; ) {...},這樣一個 for 語句,簡單的說,就是一個死循環。
break 和 continue 兩個語句在 C 語言的循環結構中有著舉足輕重的作用。雖然使用巧妙的結構化程序手段可以避免使用這兩個語句,但這兩個語句的確能使程序結構更加簡單明了。所以,只要能用上它們的地方,我極力推薦使用它們。 三種循環結構都說完了,但我還要強調 C 語言的靈活性。雖然循環結構有三種形式,但只使用其中仍意一種都能達到目的。例5 和例6 就展示了使用 while 和 do-while 兩種形式完成同要的任務。至于 for 循環,前面說它"似乎只能解決循環次數固定的情況",這"似乎"二字并非筆誤。它乍看只能解決循環次數固定的情況,但仔細一想,它也的確能解決循環次數不固定的情況。如例5 例6 用 for 循環的形式分別可以改寫為: