愛伊米

C語言簡明教程(五)迴圈程式設計

迴圈程式設計

實驗介紹

前幾節課我們學習程式中常用到的順序結構和選擇結構,但是隻有這兩種結構結構是不夠的,還需要用到迴圈結構。

知識點

用  語句實現迴圈

用  語句實現迴圈

用  語句實現迴圈

改變迴圈的執行狀態

迴圈的巢狀

迴圈結構、順序結構和選擇結構是結構化程式設計的 3 種基本結構,它們是包含各種複雜程式的基本構成單元。例如在日常生活中或是在程式所處理的問題中常常遇到需要重複處理的問題:

計算 1+2+3……+100 的和 (重複相同的加法操作)

統計班級裡面所有學生考試成績在 80 分以上的人 (重複判別操作)

計算全班 50 個人的考試平均成績 (重複的計算操作)

按照我們之前學到的知識,如果計算全班 50 個人的平均成績,我們會先編寫求一個人的平均成績段。

然後再重複寫 49 個同樣的程式段。這種方法雖然可以實現要求,但是顯然不可取的,因為這樣工作量大、程式冗長,難以閱讀,這是程式設計中最笨的方法。在 C 語言中我們可以採取這樣的迴圈語句來處理上述問題:

接下來,我們將透過例子,來熟悉 C 語言的幾種不同的迴圈結構。

用 while 語句實現迴圈

迴圈的迴圈特點是先判斷表示式後執行迴圈體語句。一般語法如下:

和  既可以是單個語句也可以是語法塊,其語法結構如下:

C語言簡明教程(五)迴圈程式設計

我們透過一個例子來學習怎樣利用  語句進行迴圈程式設計,求 1+2+3+4+5+6……+100。

這是我們從小學到初中經常看到的一個練習題,我們會用很多簡便方法去計算,而對於計算機我們可能需要用最笨的方法計算了。

作為一個累加問題,需要重複進行 100 次的加法運算,顯然可以用迴圈結構來實現,重複執行迴圈體 100 次,每次加一個數。

我們會發現每次累加的數是有規律的,後一個數是前一個數加 1,因此不需要每次透過用 scanf 語句從鍵盤臨時輸入資料,只需要再加完一個數 i 後,使 i 加 1 就可得到下一個數。

編寫源程式 7-1。c:

編譯並執行

執行結果如下:

迴圈體如果包含一個以上的語句,應該用花括號括起來,作為複合語句出現。如果不加花括號,則  語句的範圍只到  後面第一個分號處。如本例中的  語句如果無花括號,則  語句範圍只到

用 do。。。while 語句實現迴圈

迴圈體是先判斷再迴圈,而  語句是先迴圈後判斷。  語句的一般形式如下:

編寫源程式 7-2。c:

執行結果如下:

透過 7-1。c 和 7-2。c 可以看到,對同一個問題可以用  語句處理,也可以用  語句處理。  語句結構可以轉換成  結構,很多情況兩者是等價的。但是如果  後面的表示式一開始為假的時候,兩者迴圈結構是不同的。

我們舉例說明  和  迴圈的比較。

用  迴圈編寫源程式 7-3。c:

用  迴圈編寫源程式 7-4。c:

每個程式執行兩次,結果如下:

C語言簡明教程(五)迴圈程式設計

我們可以得到以下結論:當  後面的表示式的第一次值為“真”時,兩種迴圈得到的結果是相同的;否則,二者結果不相同。

用 for 語句實現迴圈

除了可以用  語句和  語句實現迴圈外。C 語言還提供 for 語句實現迴圈,for 語言十分靈活,很多情況下他完全可以替代  語句。

語句的一般形式如下:

for(表示式 1;表示式 2;表示式 3) 語句

3 個表示式的作用如下:

表示式 1:設定初始條件,只執行一次。可以為零個、一個或者多個表示式賦初值。

表示式 2:是迴圈條件表示式,用來判定是否繼續迴圈。在每次執行迴圈體前先執行此表示式,決定是否繼續執行迴圈。

表示式 3:作為迴圈的調整,例如迴圈變數的增值,是在執行完迴圈體後才進行的。

我們依然用 1 到 100 的和這個計算題來理解  語句。

編寫源程式 7-5。c:

執行結果如下:

語句的執行過程如下:

先求解表示式 1。本例中的表示式 1 就是 i=1,即把整數 1 賦值給 i。

求解表示式 2。若此條件表示式的值為真(非 0),則執行  語句的迴圈體,然後執行第三步。若為假(0),則結束迴圈,轉到第(5)步。

求解表示式 3。在本例中,執行 ,使 i 的值加 1,i 的值變成 2。

轉回步驟 2 繼續執行。由於此時 ,表示式  的值為真,再次執行迴圈體中的語句。然後再執行步驟(3)。如此反覆,直到 i 的值變到了 101,此時表示式  的值為假,不再執行迴圈體,而轉到步驟(5)。

迴圈結束,執行  語句下面的一個語句。

上面的  語句:

其執行過程和下面語句相當:

顯然用  語句更簡單、方便。

關於  語句的一些說明:

語句的一般形式:

for(表示式 1;表示式 2;表示式 3)語句

可以改寫成為  迴圈的形式:

表示式 1;

while (表示式 2)

{

語句

表示式 3

}

兩者是無條件等價的。

表示式 1 可以省略,即為不初值。但是表示式 1 後面的分號不能省略。例如:

2。1 表示式 2 也可以省略。程式碼如下:

此時迴圈將會無終止的進行下去,預設為表示式 2 是真。

表示式 3 也可以省略,程式碼如下:

i++操作不放在表示式 3 原本的位置,放到迴圈體中效果是一樣的。

透過以上介紹,我們知道了 C 語言的  迴圈語句變化多端,十分靈活。但是我們應該注意的是不要過分利用這一特點,這樣會使的  語句顯得雜亂,可讀性差。

改變迴圈的執行狀態

我們上一章節在  語句中使用過  語句。它的作用是終止  塊中程式碼的執行,並繼續執行跟在 後的第一行語句。 語句在迴圈體內的作用和  基本相同。

例:某電商網站某天做促銷活動,當天新註冊的使用者(1000 人)購物全部 9 折,當新註冊使用者購買商品總金額超過 10 萬,停止活動。統計此時購物的新註冊使用者人數以及平均每人購物的金額。

語句本來迴圈 1000 次。在每一次迴圈中,輸入一個新註冊使用者的購買金額,然後把它累加到 total 中,如果沒有  語句,則執行迴圈體 1000 次。現在設定一個 if 語句,在每一次累加了購買金額 amount 後,立即檢查累加和 total 是否達到或者超過 SUM ,當  時,就執行 break 語句,流程跳轉到迴圈體的花括號外,即不再繼續執行其餘的幾次迴圈,提前結束迴圈。此時的 i 是什麼呢?是已經購買商品的新註冊使用者。

實現中的核心程式碼如下:

語句與  語句不同,並不停止迴圈,而是跳出當前迴圈的狀態繼續執行下一輪的迴圈。求取 100-200 之間所有不可以被 3 整除的數,並打印出來。實現過程中凡是遇到可以被 3 整除的數則跳過迴圈內的後面所有的程式碼,繼續執行下一輪迴圈。

編寫源程式 7-6。c:

執行結果如下:

的作用為結束本次迴圈,就是跳過迴圈體中下面尚未執行的語句,然後接著下一次的迴圈操作。  語句是結束本次迴圈,而不是終止整個迴圈的執行。而  語句則是結束整個迴圈過程,不在判斷執行迴圈的條件是否成立。

迴圈的巢狀

一個迴圈體內又包含另外一個完整的迴圈結構,稱為迴圈的巢狀。內嵌的迴圈中還可以巢狀迴圈,這就是多層迴圈。 迴圈、 迴圈和  迴圈可以互相巢狀。我們在這裡不敞開一一講述,舉一個  迴圈的巢狀供大家理解,以後的學習中我們還會經常遇到其他巢狀。輸出下面的 4*5 的矩陣:

1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20

我們可以使用巢狀來處理此問題,用內迴圈來輸出一行資料,用外迴圈來輸出一列資料。要注意設法輸出以上矩陣的格式(每行 5 個數據),即每輸出完 5 個數據後換行。

編寫源程式 7-7。c:

程式碼  中的  是一個逗號表示式。在這裡,我們不關心表示式的值(感興趣的同學可以自己下來查閱資料)。我們關心的是這個表示式怎麼執行,它的流程非常簡單:它先執行 (等同於  再執行 (等同於 ),這裡我們可以就看作是  和  都步進 1,與之前只有一個變數做步進操作是一樣的。

執行結果如下:

該程式包含一個雙重迴圈,是  迴圈的巢狀。外迴圈變數 i 由 1 變到 4,用來控制輸出的 4 行資料,內迴圈變數 j 由 1 變到 5,用來控制輸出中的 5 個數據。輸出的值是 i*j。在執行第 1 次外迴圈體時,i=1,j 由 1 變到 5,因此 i*j 就是 1,2,3,4,5。在執行第二次外迴圈時,i=2,j 由 1 變到 5,因此 i*j 的值就是 2,4,6,8,10。以此類推。

我們本節課講述了 C 語言的迴圈語句,大家可以透過練習體驗  , 和  語句之間的區別和聯絡,同時講述迴圈的中斷與巢狀。迴圈語句想要真正的掌握就必須大量的進行程式設計練習。

課後練習題

輸出下面圖案: 提示:找到跳出迴圈的判斷條件是關鍵

C語言簡明教程(五)迴圈程式設計

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

參考答案