C語言程序設計基礎(第二版)課件:循環結構實現語句-循環結構程序設計_第1頁
C語言程序設計基礎(第二版)課件:循環結構實現語句-循環結構程序設計_第2頁
C語言程序設計基礎(第二版)課件:循環結構實現語句-循環結構程序設計_第3頁
C語言程序設計基礎(第二版)課件:循環結構實現語句-循環結構程序設計_第4頁
C語言程序設計基礎(第二版)課件:循環結構實現語句-循環結構程序設計_第5頁
已閱讀5頁,還剩94頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

循環結構實現語句

——循環結構程序設計5.1while語句5.2do_while語句5.3for語句5.4用循環嵌套實現多重循環5.5改變循環控制的語句5.6循環結構程序設計實操訓練課外練習

5.1while語句

何謂當型循環?怎樣實現當型循環?

循環結構程序從控制流程上可分為當型循環和直到型循環。while語句是實現當型循環結構的語句。

while語句的一般形式為

while(表達式)

循環體語句;

其中,表達式用于控制循環是否進行,可以是關系表達式和邏輯表達式。當表達式的值為“真”(表達式的值為“非0”),即循環條件成立時,則執行循環體語句;當表達式的值為“假”(表達式的值為“0”),即循環條件不成立時,則結束循環。

while語句的執行流程如圖5.1所示。while語句執行時,先計算表達式的值,其值為“真”則執行循環體語句,為“假”則不執行循環體語句(結束循環)。圖5.1while語句的執行流程

構造循環控制表達式是循環結構程序設計的關鍵。表達式構造不當,就不可能按預期的規律循環。極端情況下,當進入循環時,表達式的值就為“0”,則循環體一次也不會被執行;表達式的值在循環中不變化,永遠保持“非0”,就會產生死循環。這兩種情況都應避免。

循環體語句必須是一個語句的形式。實際使用中循環體往往為多個語句,這就需要用一對花括號把這些語句括起來,構成復合語句。

例5.1編寫程序,實現求的值。

編程思路:定義一個變量i,初值為1,每加一次其值增1,既是累加次數的計數,作為循環控制變量,又形成了每次要累加的數。再定義一個累加和變量sum,初值設置為0,相當于將變量單元清零。因為變量代表一個存儲器單元,如不清0,會將該單元中原來未知的數帶進累加和中,造成結果不正確。其算法流程如圖5.2所示。圖5.2例5.1算法流程

分析:循環體語句被執行100次,實現了1~100中的整數累加。

5.2do_while語句

何謂直到型循環?怎樣實現直到型循環?do_while語句是實現直到型循環結構的語句。do_while語句的一般形式為do循環體語句;while(表達式)

其中,表達式的作用和循環體語句的組成形式同while語句。只是循環控制流程與while語句有所差別。其執行流程如圖5.3所示。do_while語句是先執行循環體語句,然后計算表達式的值,其值為“真”時執行循環體語句,為“假”則結束循環。也就是說,循環體語句至少要被執行一次。圖5.3do_while語句的執行流程

例5.2用do_while語句實現求的值。

編程思路:該例的編程思路基本與例5.1相同。其算法流程如圖5.4所示。圖5.4例5.2算法流程

分析:本例的執行結果同例5.1。先執行循環體語句,對i的當前值累加,再使i加1,當i的值增加到101時結束循環。

5.3for語句

怎樣實現各種條件的循環問題?for語句是C語言中最具特色的循環語句,使用最為靈活,既可以實現當型循環,又可以實現直到型循環,不僅可以用于循環次數確定的情況,還可以用于循環次數不確定而由邏輯判斷來結束的情況。

5.3.1for語句的形式與執行流程

for語句的一般形式為

for(表達式1;表達式2;表達式3)

循環體語句;

其執行流程如圖5.5所示。從流程圖可以看出,for語句的執行步驟如下:圖5.5for語句執行流程

(1)求解表達式1的值。

(2)求解表達式2的值,若其值為非0(“真”),則執行for語句中的循環體語句,然后執行下面第(3)步;若值為0(“假”),則結束循環。

(3)求解表達式3的值。

(4)轉回上面第(2)步繼續執行。

for語句中三個表達式分別有不同的作用:

(1)表達式1有給循環提供初值的作用,可以是算術表達式、賦值表達式和逗號表達式。

(2)表達式2起控制循環的作用,可以是C語言中的各種表達式,只要表達式的值為“非0”,即為邏輯“真”,控制循環繼續進行;表達式的值為“0”,即為邏輯“假”,立即結束循環。

(3)表達式3起改變循環控制條件的作用,使循環向結束靠近。如果沒有表達式3,或表達式不合適,就可能導致死循環。在一些規律明顯的循環中,可以把表達式3稱為步長表達式。

注意:三個表達式之間必須用“;”作為分隔符。

例5.3為了便于三種循環語句的比較,仍以求值為例,用for循環來實現。

5.3.2for語句中三個表達式的靈活使用

for語句靈活運用的關鍵是三個表達式的設置。

(1)三個表達式都可以采用多種表達式。如for(i=1,sum=0;i<=100;i++,j++)中,表達式1和表達式3是逗號表達式。

(2)表達式1可以省略,但應在循環體外給循環控制變量賦初值,否則會導致死循環。如例5.3中,在循環體外給變量賦初值,則循環語句可改為

for(;i<=100;i++)sum=sum+i;

(3)從語言規則來說,表達式2也可以缺省,例如:

for(i=1;;i++)sum=sum+i;

但執行時將變為死循環,因此是不正確的循環。

(4)表達式3可以省略,例如:

for(i=1;i<=100;)sum=sum+i;

但要保證程序正常結束,需在循環體內改變循環控制變量。對例5.3可作如下修改:

(5)表達式1、表達式3可以同時缺省,但要使循環正常,必須在循環體外解決循環初值問題,在循環體內解決循環控制變量的改變問題。例如:

(6)從語言規則上講,三個表達式都可以缺省。例如:

for(;;)

但循環無法正常進行。

注意:不論表達式缺省還是不缺省,三個表達式之間的“;”分隔符都不能缺省。

5.4用循環嵌套實現多重循環

何謂多重循環?怎樣實現多重循環?C語言中把循環結構作為一個語句。既然循環結構是一個語句,當然可以出現在循環體語句中。這樣,在循環體中就包含了一個完整的循環結構語句,稱為循環嵌套,即循環中套循環。如此,可以形成多重循環。C語言中對循環嵌套層數沒有限制,但實際上循環嵌套層數越多,程序越不容易理解,出錯的機會也就越多。實際應用中,兩層以上的循環嵌套不多見。下面只對兩重循環嵌套的情況作一介紹。

三種循環結構語句可以相互嵌套,形成如下多種嵌套關系。

嵌套關系一:

嵌套關系二:嵌套關系三:

嵌套關系四:嵌套關系五:

嵌套關系六:

通常,把外層循環稱為外循環,內層循環稱為內循環。兩重循環嵌套中,內循環作為外循環的一個語句,外循環每循環一次,內循環都要循環一遍。設外循環執行i次,內循環執行j次,則內循環體要被執行i?×?j次。

程序中,循環嵌套要求內循環必須被完全包含在外層循環的循環體中,不允許出現內外層循環體交叉的情況。如圖5.6所示,在do_while循環體內開始while()循環,但是do_while循環結束在while()循環體內,它們相互交叉,因此這是非法結構。圖5.6循環交叉為非法結構

例5.4編寫程序,輸出如下平面字符圖形:

編程思路:要輸出5行,每一行輸出的“*”數與行號對應,可用兩重循環來實現。外循環控制每一行“*”輸出,循環5次。內循環控制一行中的“*”輸出,循環控制條件是輸出的“*”數小于或等于行號。

分析:外循環控制變量i控制第i行輸出(1≤i≤5),每行中的“*”個數是隨著行控制變量i的值變化而變化的(1≤j≤i)。內循環結束換行,使下一行從行首輸出。

5.5改變循環控制的語句

如何改變一般循環控制規律,提高程序效率?一個循環結構程序的執行由循環控制條件、循環控制變量以及循環體結構來決定。正常情況下,只有達到循環結束條件才能結束,而且在每次循環中循環體語句都要被執行。有些情況下,需要改變這種控制規律,或者需要提前結束循環,或者是循環體的部分語句在特定的條件下不被執行。C語言提供了改變循環控制的語句。

5.5.1break語句

break語句的一般形式為

break;

前面已經介紹,break語句可用在switch結構中,使執行流跳出switch結構。break語句也可用在循環結構中,使執行流跳出所在的循環,即提前結束循環。

例5.5使用break語句來改變循環控制。

分析:for循環中缺省了三個表達式,應該是一個死循環。但在程序中使用了“if(i>100)break;”語句,使i達到101時就結束循環。這也是循環程序設計中巧用break語句的一種方法。

5.5.2continue語句

continue語句的一般形式為

continue;

其功能是結束本次循環,即跳過循環體中continue語句后面尚未執行的循環體語句,轉向循環頭部,檢測是否進行下一次循環。

例5.6輸出100以內能被9整除的數。

編程思路:逐一檢測9~100的整數能否被9整除,如能整除則輸出該數,不能整除則不輸出。

分析:“if(n%9!=0)continue;”語句判斷當前數是否能被9整除,若能整除,不執行continue語句,則執行printf函數調用,輸出該數;若不能整除,則執行continue語句而跳過printf函數調用,不輸出該數,結束本次循環,返回循環頭部,開始下一次循環,直到滿足循環結束條件。

例5.7編寫程序,從鍵盤輸入字符后顯示,按Enter鍵,則結束字符輸入;按Esc鍵,則放棄當前輸入的字符。

分析:程序中使用字符輸入/輸出庫函數,程序開頭要使用預處理命令#include<stdio.h>。for(;;)不控制循環,是通過兩個if語句來實現對循環的控制。當按Enter鍵時,執行break語句,立即結束字符輸入;當按Esc鍵時,執行continue語句,跳過“putchar(ch);”,返回循環頭部,輸入下一個字符。

5.6循環結構程序設計

循環結構程序設計時應考慮哪些問題?如何準確地設計循環結構程序?

一般來說,循環結構程序在設計時需考慮以下幾方面的問題:

(1)循環初始化問題。循環初始化包括對循環控制變量設置初值和對循環體中相關變量設置初值。循環控制變量初值設置得恰當與否,關系到循環規律能否實現。如例5.1~例5.3中,如果循環控制變量i的初值設置為0,則要循環101次,第一次循環累加和變量加0,毫無意義。如果設置為大于1的數,循環次數不到100次,造成累加和不正確。給循環體中操作變量設置初值,需要根據具體問題具體分析。一般來說,要給加法和變量清零,乘積變量置1,以防未知數據帶入,導致結果不正確。

(2)循環控制條件設置問題。按循環控制方式,循環可有計數控制和條件控制。計數控制循環是循環次數已知,一般用關系表達式作循環控制條件。對于循環次數未知的循環,一般要認真分析循環控制過程,找出規律,列出邏輯表達式。

(3)循環控制變量改變問題。循環控制變量要在循環過程中加以改變,使循環控制條件向循環結束轉變。循環控制變量的改變方式要依據循環規律來確定。

(4)循環體結構問題。循環體語句是循環問題的重復執行部分,可包含三種結構語句。復雜循環體語句一定要注意結構語句的嵌套層次,嵌套層次之間不能相互交叉,即一個結構語句必須完全包含在另一個結構語句中。

(5)循環控制變量的引用問題。循環控制變量可以在循環結束后引用,但要注意量值的準確性。如例5.1~例5.3中,循環控制變量i在循環結束時值是101,而不是100。

循環結構程序設計要比順序結構和選擇結構程序設計復雜一些,一定要認真分析規律和算法,然后選擇便于實現的循環語句。

例5.8編寫程序,計算s?=?1?-?3?+?5?-?7…?-?99?+?101。

編程思路:這個問題可看成數的累加,相加數是1~101之間的質數,且一個為正數,一個為負數,即累加數的符號在交替變化。找出這個規律,可以設置一個符號變量flag,初值設置為1,在循環中使用flag?=?-flag,即可實現符號的交替變換。算法可依照數的累加。

分析:變量i既用于循環控制,又作為累加數的絕對值,flag產生累加數的符號。

例5.9用for循環語句求n!。

編程思路:可用迭代公式n!=n*(n-1)!。利用循環很容易實現迭代計算問題。設置變量i,既作循環控制變量i(1≤i≤n),又作本次循環求階乘的數,用變量fac存放i!,初始化為fac=1。第i次循環前,fac中存放(i-1)!,第i次循環后,fac中存放i!,實現了相繼兩次的迭代。用for語句可實現。

分析:fac作為循環中的乘積變量,在循環外賦初值1,在循環中實現1?×?2?×?…?×?n求值運算,即求得n的階乘值。

例5.10編寫程序求1~1000之間滿足“用3除余2,用5除余3,用7除余2”的數,且一行只打印5個數。

編程思路:求余數用取模運算符%。3個條件是“與”的關系。一行打印5個數,可以通過計數到5再回車換行。用do_while循環來實現。

分析:變量i既作循環控制變量,又是當前要檢測的數,取1~1000之間的整數。變量j用于輸出數據的計數,控制一行輸出5個數。

例5.11編程實現電文加密。電文加密規律為:將字母變成其后面的第4個字母,其他字符保持不變。例如,a→e,A→E,W→A。編寫一個程序,輸入一行字符,要求轉換成加密電文輸出。

編程思路:電文的加密規律如圖5.7所示。輸入字符賦給變量ch,如果是字符,則其ASCII碼值加4,即ch?=?ch+4。加密后判斷ch的值是否超出字母的范圍,如果超過,則

ch?=?ch-26。如輸入x,其ASCII碼值是120,加4得124,大于z的ASCII碼值122,減26后得98,是b的ASCII碼值,即把x轉換成b。從鍵盤輸入字符并轉換為循環實現,循環控制條件為ch!='\n'。圖5.7例5.11的電文加密規律

分析:用while循環實現從鍵盤輸入一個電文字符序列,每輸入一個字符按加密規律進行加密轉換,一直到輸入回車鍵結束。第1層if語句中的條件表達式“ch>='a'&&ch<='z'||(ch>='A')&&ch<='Z'”判斷輸入的字符是否是26個大寫或小寫字母,是則進行ASCII碼值加4轉換,不是則不轉換。第2層if語句中的條件表達式“(ch>'Z'&&ch<'a')||(ch>'z')”判斷字母ASCII碼值加4轉換后是否越界,如果越界則按加密循環規律將其減26。

例5.12編寫程序,求出100~1000之間各位數字之和是5的數,一行輸出5個數,并統計個數。

編程思路:該問題要對100~1000中的每一個數逐一進行判定,而且每一個數要進行逐位求和,是一個雙重循環問題。取遍100~1000之間的所有數可選用for循環結構語句來解決。但在判定100~1000之間的每一個數其各位數字之和是否為5時,由于循環次數隨數位的變化而不同,宜選用while循環結構語句。

分析:程序采用雙重循環,外循環用for語句,內循環用while語句。在內循環實現對每位數字分離并累加。“s=s+k%10;”語句的作用是分離出當前數的低位并累加,“k=k/10;”語句的作用是截取當前數的高位部分,作為下一次要分離的數。例如123,第1次循環分離出低位數字3,截取高位部分12;第2次循環分離出低位數字2,截取高位部分1;第3次循環分離出低位數字1,截取高位部分0,循環結束。外循環利用變量i依次產生100~1000之間的一個整數,根據內循環計算各位數字之和是否為5,確定是否輸出,并進行計數。

例5.13編寫程序,找出3~500之間的全部素數并輸出,在一行輸出15個數。

編程思路:

(1)素數是除1和它本身之外不能被任何一個整數整除的自然數(1除外)。如2、3、5、7是素數,1、4、6、8、10不是素數。判斷某數i是否為素數的一個簡單辦法是用2,3,4,…,i-1這些數據逐個去除i,只要被其中的一個數整除了,則i就不是素數。數學上已證明,對于自然數i只需用2,3,4,…,i1/2測試。

(2)需要判定3~500之間的每一個數是否為素數。判定一個數是否是素數,又要用2,3,4,…,i1/2逐一進行測試,測試到被其中的某一個數整除,則可判定不是素數,就不需要再進行測試了。顯然這是一個雙重循環問題。為了結束內循環時能方便識別當前判定的數是否為素數,設置一個標志變量flag,在內循環外設初值0,若在內循環中遇到能被整除的測試,則給flag賦值1。程序流程如圖5.8所示。圖5.8例5.13程序流程

分析:外循環中由變量i依次生成3~500之間的一個整數,內循環中由變量j依次生成一個測試數,在if語句中由表達式i%j==0來測試當前數是否為素數,如遇到一次整除,就建立標志,結束內循環。結束內循環時,如果標志變量flag為0,說明該數是素數,則計數并輸出。

實操訓練

實訓任務五學習循環程序設計的方法實訓項目1設計程序,實現如下形式的等差/等比數列求和。輸入/輸出界面可參照圖5.9所示。圖5.9實訓項目1界面式樣

實訓指導

1.算法分析

等差/等比數列求和是一個逐項累加的過程,可用循環算法實現,關鍵是產生當前的累加項。

設等差數列首項為a1,公比為d,項數為n,則遞推公式為

ai?=?ai-1?+?d,1<i≤n

設等比數列首項為a1,公比為q,項數為n,則遞推公式為

ai?=?ai-1?*?q,1<i≤n

2.設計程序

(1)定義變量。

(2)調用格式輸出函數,設計輸入界面的提示信息。.

(3)調用格式輸入函數,輸入初始數據。

(4)用for循環產生當前項,并累加。輸出運算式,需在循環體中輸出當前項及“+”,但需判斷,如果是最后一項,就不輸出“+”,可參考如下語句:

if(i==n)printf("%d",t);

elseprintf("%d+",t);

(5)等差數列和等比數列求和過程是一樣的,只是產生的累加項不同。先設計等差數列求和程序,在此基礎上稍加修改,可實現等比數列求和。

3.調試運行程序

(1)輸入首項為1、公差為1、項數從小到大的不同值(便于判定計算結果),求第①式的值,檢測結果是否正確。

(2)輸入首項為1、公差為2、項數從小到大的不同值,求第②式的值,檢測結果是否正確。

(3)輸入首項為2、公差為3、項數從小到大的不同值,求第③式的值,檢測結果是否正確。

(4)修改程序,實現等比數列求和。

輸入首項為1、公比為2、項數從小到大的不同值,求第④式的值,檢測結果是否正確。

輸入首項為1、公比為0.5、項數從小到大的不同值,求第⑤式的值,檢測結果是否正確。

實訓項目2設計程序,求解下面算式的值。輸入/輸出界面可參照圖5.10所示。

1!+2!+3!+4!+5!+… ①

1!+3!+5!+7!+9!+… ②

2!+5!+8!+11!+… ③圖5.10實訓項目2界面式樣

實訓指導

1.設計程序

可以把求解問題看作數列求和,數列中的數可以看作等差數列,只是對該數的階乘值求和。求一個數的階乘可用循環結構來實現,所以應該采用雙重循環。外循環中用等差數列算法,求出每一項的階乘數,內循環求出該數的階乘值,然后在外循環中累加。

2.調試運行程序

(1)輸入首項為1、公差為1、項數從小到大的不同值(便于判定計算結果),求第①式的值,檢測結果是否正確。

(2)輸入首項為1、公差為2、項數從小到大的不同值,求第②式的值,檢測結果是否正確。

(3)輸入首項為2、公差為3、項數從小到大的不同值,求第③式的值,檢測結果是否正確。

實訓項目3設計程序,輸出等腰三角形字符圖形。輸入/輸出界面可參照圖5.11所示。圖5.11實訓項目3界面式樣

實訓指導

1.設計程序

輸出平面字符圖形,應用雙重循環。外循環一次控制一行字符的輸出,需要輸出多少行,就應該循環多少次;內循環一次輸出當前行的一個字符,當前行有多少個字符,就應該循環多少次。圖形中的每行輸出空格和“*”兩種字符。每一行輸出的空格數和“*”數都與行號有關。設行數為n,當前行號為i,則當前行輸出的空格數為n-i,輸出的“*”數為2*i-1。若總行

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論