您現在的位置是:首頁 > 人文
一起學《C程式設計》第五課——迴圈控制及實戰練習
if是怎樣跳出迴圈的
C語言迴圈結構
注意,請認真學習完《C程式設計(第五版)》第五章後再閱讀本文會有更大的收穫。
透過之前的學習我們知道程式所處理的是資料,而日常的資料都儲存在資料庫裡,一般它們有著相同的資料結構,在批次處理這些資料的時候通常就會使用迴圈控制語句。對於輸入資料型別和結構一致、處理邏輯一致的程式一般都可以採用迴圈控制語句來實現,不僅簡化了程式碼結構,還使得後續程式碼擴充套件和維護更方便。
while迴圈
書本上講了while和do。。。while兩種迴圈結構,通過了解其特性得知其主要差別在於do。。。while不管條件滿足與否都會先執行一次迴圈體,所以,在日後的使用中不推薦使用do。。。while迴圈,因為常規的邏輯基本上都是隻有滿足條件才去執行,即使遇到可以使用do。。。while的情形,我們也用while去代替它以使整個專案的程式碼風格保持一致。
for迴圈
for迴圈
書本最開始舉例求和就向我們展示了for迴圈,這次終於見識了廬山真面目。在使用過程中我們不要省略掉任何一個表示式,一味地追求簡潔反而會“適得其反”。
巢狀
不僅僅是迴圈之間可以互相巢狀,我們上一課學習的if語句也可以參與進來和while、for等一起形成複雜的多重巢狀程式,一般在迴圈體內常用if語句去做判斷處理。
巢狀迴圈
跳出迴圈
常規跳出
這裡指的是程式碼執行迴圈體直到不能滿足迴圈條件的時候,程式會自動跳出迴圈,比如我們求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的最小公倍數。
PS:找最大公約數還有一種演算法:先找到m和n之中的最小數,然後從大到小迴圈這個最小數去找公約數,找到的第一個公約數就是最大公約數,這個演算法感興趣的去嘗試一下吧~
找最小公倍數也可以用另外一種演算法:先找到m和n之中的最大數,然後讓最大數自增加,注意不是相乘,這樣去判斷能否都被m和n整除,一旦符合條件即可得到最小公倍數。
求
個
之值,其中a是一個數字,n表示a的位數,n由鍵盤輸入。例如:2+22+222+2222+22222 (此時n=5)
這道題的思路分為二:一是迴圈構建n個數,二是每個數再迴圈生成,要用到巢狀迴圈。構建數字的演算法是解題核心,參考下面程式碼:
本題和“水仙花數”有相似之處,可以用三層迴圈構造三位數去判斷是否符合“水仙花數”。
PS:程式碼裡用到pow()函式要在檔案開頭包含math。h標頭檔案:#include
一個數如果恰好等於它的各個因子之和,這個數就稱為“完數”。例如,6的因子為1,2,3,而6=1+2+3,因此6是“完數”。程式設計找出1000之內的所有完數,並按下面的格式輸出其因子:
6 its factors are 1,2,3
這個題目還是要用迴圈巢狀來解,先迴圈1000以內數字,然後再迴圈分解每個數字的因子,參考如下:
PS:本示例程式碼並沒有輸出各個因子,在判斷是完數之後再重複上面的那個迴圈去輸出因子,同學們自己練習吧~
猴子吃桃問題:猴子第一天摘下若干個桃子,當即吃了一半,還不過癮,又多吃了一個。第二天早上又將第一天剩下的桃子吃掉一半,又多吃了一個。以後每天早上都吃了前一天剩下的一半零一個。到第 10 天早上想再吃時,發現只剩下一個桃子了。編寫程式求猴子第一天摘了多少個桃子。
又是數學問題。本題的關鍵是算清楚一個公式,前一天的桃子數記為before,後一天的桃子數記為after,根據題目得到after = before / 2 - 1,進而推匯出 before = (after + 1) * 2,這樣我們從最後一天開始往前推導就得出了第一天的桃子數量了,程式碼參考:
總結
初學者對迴圈體可能有下面幾個迷惑點:
初始、終止條件設定
自增變數控制
跳出迴圈的時機
很多人一開始會糾結從0開始還是從1開始,在99終止還是在100終止這兩點,其實只要你寫程式碼去執行看結果,多改幾遍程式碼看看不同的條件對應什麼結果,自然就能熟練掌握了。跳出迴圈的時機主要看演算法的設計是怎樣的,不同的題目有多重演算法,解題的時候也要多去嘗試,多鍛鍊自己的解題思路,為今後學習演算法做好鋪墊。
強調一點,由於初學者沒有實際的專案經驗,所以書本上的練習題幾乎都是以數學題的形式出現,這個就考驗我們的數學功底了,這點在之前的文章中有提過。
學完if語句和本節課的迴圈語句,就可以寫出來很多程式了,大家有空多多練習吧,現階段還是演算法到程式設計轉換的關鍵時期,趁機會多鍛鍊自己的程式設計思維~
往期文章
一起學《C程式設計》第四課——if語句、switch語句及實戰練習
一起學《C程式設計》第三課——資料結構、運算子、表示式和語句
一起學《C程式設計》第二課——演算法
一起學《C程式設計》第一課——C語言概述和學習前的準備、意識
C程式設計(譚浩強)——第五版和第三版對比
推薦文章
- 給NAS周全保護,2分鐘更換電池,讓APC BX650 UPS滿血復活
(此處並不是推薦該品牌,拆解後發現BX650原裝為廣隆蓄電池,大家可以照著買)樓主一開始沒仔細看別人的拆機介紹,直接把後面四顆螺絲拆掉,結果一開啟完全沒看不到電池在哪...
- 女性過了25這個時機很重要,保養馬虎不得,跟著這樣做準沒錯
3、學會使用眼膜過了25歲,眼角皺紋也隨之而來,所以做有補水功效的眼膜是很重要的,因為它很清涼,所以很容易被眼睛周圍的面板給吸收,使的眼部肌膚得到放鬆,因此建議每週做2-3次的眼膜,這樣可以避免眼周長細紋...
- 頂著“GMC 2.0混動首車”頭銜,廣汽傳祺影酷定價更自信?
影酷,傳祺實現上攻的重要拼圖一直以來,GS4都是傳祺在SUV市場的一張王牌,初代車型的登場,可謂驚豔四座,令不少消費者為之著迷...