您現在的位置是:首頁 > 人文

一起學《C程式設計》第五課——迴圈控制及實戰練習

由 程式設計師魯大廚 發表于 人文2023-01-05
簡介程式設計找出1000之內的所有完數,並按下面的格式輸出其因子:6 its factors are 1,2,3這個題目還是要用迴圈巢狀來解,先迴圈1000以內數字,然後再迴圈分解每個數字的因子,參考如下:PS:本示例程式碼並沒有輸出各個因子,

if是怎樣跳出迴圈的

一起學《C程式設計》第五課——迴圈控制及實戰練習

C語言迴圈結構

注意,請認真學習完《C程式設計(第五版)》第五章後再閱讀本文會有更大的收穫。

透過之前的學習我們知道程式所處理的是資料,而日常的資料都儲存在資料庫裡,一般它們有著相同的資料結構,在批次處理這些資料的時候通常就會使用迴圈控制語句。對於輸入資料型別和結構一致、處理邏輯一致的程式一般都可以採用迴圈控制語句來實現,不僅簡化了程式碼結構,還使得後續程式碼擴充套件和維護更方便。

while迴圈

書本上講了while和do。。。while兩種迴圈結構,通過了解其特性得知其主要差別在於do。。。while不管條件滿足與否都會先執行一次迴圈體,所以,在日後的使用中不推薦使用do。。。while迴圈,因為常規的邏輯基本上都是隻有滿足條件才去執行,即使遇到可以使用do。。。while的情形,我們也用while去代替它以使整個專案的程式碼風格保持一致。

for迴圈

一起學《C程式設計》第五課——迴圈控制及實戰練習

for迴圈

書本最開始舉例求和就向我們展示了for迴圈,這次終於見識了廬山真面目。在使用過程中我們不要省略掉任何一個表示式,一味地追求簡潔反而會“適得其反”。

巢狀

不僅僅是迴圈之間可以互相巢狀,我們上一課學習的if語句也可以參與進來和while、for等一起形成複雜的多重巢狀程式,一般在迴圈體內常用if語句去做判斷處理。

一起學《C程式設計》第五課——迴圈控制及實戰練習

巢狀迴圈

跳出迴圈

常規跳出

這裡指的是程式碼執行迴圈體直到不能滿足迴圈條件的時候,程式會自動跳出迴圈,比如我們求1~100的和,當數字自增到101的時候會自然跳出迴圈。

手動跳出

在迴圈體處理資料時有差別對待,或者迴圈體執行過程中產生了不符合預期的結果,這時候我們要手動跳出迴圈——coutinue或者break。

情形1,在處理資料1~100的迴圈體中,要求對偶數進行一些計算,而忽略奇數。那我們判斷當前數是奇數的時候就可以用continue來跳出當前的迴圈而繼續進行下一次迴圈。

情形2,在處理資料1~100的迴圈體中,要求找出5個可以被3整除的數字即可。那當我們找到第五個滿足條件的數字之後就不用再執行下去了,此時用break來跳出整個迴圈。

死迴圈

如果一個迴圈控制程式裡不設定終止條件,或者迴圈體有問題導致不能觸發跳出迴圈的語句,這時候就是我們通常說的“死迴圈”。

我們在程式設計的過程中要避免死迴圈的出現,除非是寫那些需要一直執行著的指令碼程式。

實戰程式設計

輸入兩個正整數m和n,求其最大公約數和最小公倍數。

這是一道數學題,先搞清楚兩個及其以上正整數最大公約數和最小公倍數的定義,然後再來想清楚演算法去解題。

最大公約數:從m和n中取出任意一個數字比如m,然後從1開始找m的約數x,如果x也是n的約數則x就是m和n的公約數;直到迴圈數自增到m,整個迴圈過程中找出符合條件的公約數會越來越大,那麼最後一次賦值給x的公約數則為最大公約數(因為每次賦值會覆蓋上一次的公約數的值)。這裡無論m和n誰大誰小都不會影響程式的結果,如果提前判斷大小關係,從小數來找公約數會減少迴圈次數,感興趣的同學可以自己改程序序。

最小公倍數:先找到m和n中的最小數,然後從1開始相乘找最小數的倍數,一旦同時能被m和n整除,那麼這個數就是m和n的最小公倍數。

一起學《C程式設計》第五課——迴圈控制及實戰練習

PS:找最大公約數還有一種演算法:先找到m和n之中的最小數,然後從大到小迴圈這個最小數去找公約數,找到的第一個公約數就是最大公約數,這個演算法感興趣的去嘗試一下吧~

找最小公倍數也可以用另外一種演算法:先找到m和n之中的最大數,然後讓最大數自增加,注意不是相乘,這樣去判斷能否都被m和n整除,一旦符合條件即可得到最小公倍數。

之值,其中a是一個數字,n表示a的位數,n由鍵盤輸入。例如:2+22+222+2222+22222 (此時n=5)

這道題的思路分為二:一是迴圈構建n個數,二是每個數再迴圈生成,要用到巢狀迴圈。構建數字的演算法是解題核心,參考下面程式碼:

一起學《C程式設計》第五課——迴圈控制及實戰練習

本題和“水仙花數”有相似之處,可以用三層迴圈構造三位數去判斷是否符合“水仙花數”。

PS:程式碼裡用到pow()函式要在檔案開頭包含math。h標頭檔案:#include

一個數如果恰好等於它的各個因子之和,這個數就稱為“完數”。例如,6的因子為1,2,3,而6=1+2+3,因此6是“完數”。程式設計找出1000之內的所有完數,並按下面的格式輸出其因子:

6 its factors are 1,2,3

這個題目還是要用迴圈巢狀來解,先迴圈1000以內數字,然後再迴圈分解每個數字的因子,參考如下:

一起學《C程式設計》第五課——迴圈控制及實戰練習

PS:本示例程式碼並沒有輸出各個因子,在判斷是完數之後再重複上面的那個迴圈去輸出因子,同學們自己練習吧~

猴子吃桃問題:猴子第一天摘下若干個桃子,當即吃了一半,還不過癮,又多吃了一個。第二天早上又將第一天剩下的桃子吃掉一半,又多吃了一個。以後每天早上都吃了前一天剩下的一半零一個。到第 10 天早上想再吃時,發現只剩下一個桃子了。編寫程式求猴子第一天摘了多少個桃子。

又是數學問題。本題的關鍵是算清楚一個公式,前一天的桃子數記為before,後一天的桃子數記為after,根據題目得到after = before / 2 - 1,進而推匯出 before = (after + 1) * 2,這樣我們從最後一天開始往前推導就得出了第一天的桃子數量了,程式碼參考:

一起學《C程式設計》第五課——迴圈控制及實戰練習

總結

初學者對迴圈體可能有下面幾個迷惑點:

初始、終止條件設定

自增變數控制

跳出迴圈的時機

很多人一開始會糾結從0開始還是從1開始,在99終止還是在100終止這兩點,其實只要你寫程式碼去執行看結果,多改幾遍程式碼看看不同的條件對應什麼結果,自然就能熟練掌握了。跳出迴圈的時機主要看演算法的設計是怎樣的,不同的題目有多重演算法,解題的時候也要多去嘗試,多鍛鍊自己的解題思路,為今後學習演算法做好鋪墊。

強調一點,由於初學者沒有實際的專案經驗,所以書本上的練習題幾乎都是以數學題的形式出現,這個就考驗我們的數學功底了,這點在之前的文章中有提過。

學完if語句和本節課的迴圈語句,就可以寫出來很多程式了,大家有空多多練習吧,現階段還是演算法到程式設計轉換的關鍵時期,趁機會多鍛鍊自己的程式設計思維~

往期文章

一起學《C程式設計》第四課——if語句、switch語句及實戰練習

一起學《C程式設計》第三課——資料結構、運算子、表示式和語句

一起學《C程式設計》第二課——演算法

一起學《C程式設計》第一課——C語言概述和學習前的準備、意識

C程式設計(譚浩強)——第五版和第三版對比

推薦文章