版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第5章
循環(huán)結(jié)構(gòu)實現(xiàn)語句——循環(huán)結(jié)構(gòu)程序設(shè)計5.1while語句5.2do_while語句5.3for語句5.4用循環(huán)嵌套實現(xiàn)多重循環(huán)5.5改變循環(huán)控制的語句5.6循環(huán)結(jié)構(gòu)程序設(shè)計實訓(xùn)任務(wù)九
熟悉循環(huán)結(jié)構(gòu)控制語句實訓(xùn)任務(wù)十
學(xué)習(xí)循環(huán)結(jié)構(gòu)程序設(shè)計的方法 5.1while語句
何謂當(dāng)型循環(huán)?怎樣實現(xiàn)當(dāng)型循環(huán)?
循環(huán)結(jié)構(gòu)程序從控制流程上可分為當(dāng)型循環(huán)和直到型循環(huán)。while語句是實現(xiàn)當(dāng)型循環(huán)結(jié)構(gòu)的語句。
while語句的一般形式為
while(表達(dá)式)
循環(huán)體語句;
其中,表達(dá)式用于控制循環(huán)是否進(jìn)行,可以是關(guān)系表達(dá)式和邏輯表達(dá)式。當(dāng)表達(dá)式的值為“真”(表達(dá)式的值為“非0”)時,即循環(huán)條件成立,則執(zhí)行循環(huán)體語句;當(dāng)表達(dá)式的值為“假”(表達(dá)式的值為“0”)時,即循環(huán)條件不成立,則結(jié)束循環(huán)。圖5.1while語句的執(zhí)行流程
while語句的執(zhí)行流程如圖5.1所示。while語句執(zhí)行時,先計算表達(dá)式的值,其值為“真”則執(zhí)行循環(huán)體語句,為“假”則不執(zhí)行循環(huán)體語句(結(jié)束循環(huán))。
構(gòu)造循環(huán)控制表達(dá)式是循環(huán)結(jié)構(gòu)程序設(shè)計的關(guān)鍵。表達(dá)式構(gòu)造不當(dāng),就不可能按預(yù)期的規(guī)律循環(huán)。極端情況下,當(dāng)進(jìn)入循環(huán)時,表達(dá)式的值就為“0”,則循環(huán)體一次也不會被執(zhí)行;表達(dá)式的值在循環(huán)中不變化,永遠(yuǎn)保持“非0”,就會產(chǎn)生死循環(huán)。這兩種情況都應(yīng)避免。
循環(huán)體語句必須是一個語句的形式。實際使用中循環(huán)體往往有多個語句,這就需要用一對花括號把這些語句括起來,構(gòu)成復(fù)合語句。
例5.1
編寫程序,實現(xiàn)求
的值。
編程思路:定義一個變量i,初值為1,每加一次其值增1,既是累加次數(shù)的計數(shù),作為循環(huán)控制變量,又形成了每次要累加的數(shù)。再定義一個累加和變量sum,初值設(shè)置為0,相當(dāng)于將變量單元清零。因為變量代表一個存儲器單元,如不清0,會將該單元中原來未知的數(shù)帶進(jìn)累加和中,造成結(jié)果不正確。其算法流程如圖5.2所示。
圖5.2例5.1算法流程運行結(jié)果:
分析:循環(huán)體語句被執(zhí)行100次,實現(xiàn)了1~100中的整數(shù)累加。
思考:在循環(huán)體外,把語句“i=1;”改為語句“i=0;”,循環(huán)體被執(zhí)行多少次?執(zhí)行結(jié)果會正確嗎?
5.2do_while語句
何謂直到型循環(huán)?怎樣實現(xiàn)直到型循環(huán)?
do_while語句是實現(xiàn)直到型循環(huán)結(jié)構(gòu)的語句。
do_while語句的一般形式為
do
循環(huán)體語句;
while(表達(dá)式)
其中,表達(dá)式的作用和循環(huán)體語句的組成形式同while語句。只是循環(huán)控制流程與while語句有所差別。其執(zhí)行流程如圖5.3所示。do_while語句是先執(zhí)行循環(huán)體語句,然后計算表達(dá)式的值,其值為“真”時執(zhí)行循環(huán)體語句,為“假”則結(jié)束循環(huán)。也就是說,循環(huán)體語句至少要被執(zhí)行一次。圖5.3do_while語句的執(zhí)行流程
例5.2
用do_while語句實現(xiàn)求
的值。
編程思路:該例的編程思路基本與例5.1相同。其算法流程如圖5.4所示。
圖5.4例5.2算法流程分析:本例的執(zhí)行結(jié)果同例5.1。先執(zhí)行循環(huán)體語句,對i的當(dāng)前值累加,再使i加1,當(dāng)i的值增加到101時結(jié)束循環(huán)。
思考:與例5.1比較,程序結(jié)構(gòu)有何異同?程序執(zhí)行時的循環(huán)控制過程相同嗎?循環(huán)結(jié)束時,變量i的值應(yīng)是多少?
5.3for語句
5.3.1for語句的形式與執(zhí)行流程
for語句的一般形式為
for(表達(dá)式1;表達(dá)式2;表達(dá)式3)
循環(huán)體語句;
其執(zhí)行流程如圖5.5所示。從流程圖可以看出,for語句的執(zhí)行步驟如下:
(1)求解表達(dá)式1的值。
(2)求解表達(dá)式2的值,若其值為非0(“真”),則執(zhí)行for語句中的循環(huán)體語句,然后執(zhí)行下面第(3)步。若值為0(“假”),則結(jié)束循環(huán)。
(3)求解表達(dá)式3的值。
(4)轉(zhuǎn)回上面第(2)步繼續(xù)執(zhí)行。
for語句中三個表達(dá)式分別有不同的作用:
表達(dá)式1有給循環(huán)提供初值的作用,可以是算術(shù)表達(dá)式、賦值表達(dá)式和逗號表達(dá)式。
表達(dá)式2起控制循環(huán)的作用,可以是C語言中的各種表達(dá)式,只要表達(dá)式的值為“非0”,即為邏輯“真”,控制循環(huán)繼續(xù)進(jìn)行;表達(dá)式的值為“0”,即為邏輯“假”,立即結(jié)束循環(huán)。表達(dá)式3起改變循環(huán)控制條件的作用,使循環(huán)向結(jié)束靠近。如果沒有表達(dá)式3,或表達(dá)式不合適,就可能導(dǎo)致死循環(huán)。在一些規(guī)律明顯的循環(huán)中,可以把表達(dá)式3稱為步長表達(dá)式。
需注意的是,三個表達(dá)式之間必須用“;”作為分隔符。
圖5.5for語句執(zhí)行流程
例5.3
為了便于三種循環(huán)語句的比較,仍以求值為
例,用for循環(huán)來實現(xiàn)。
編程思路:同前。
源程序:
分析:運行結(jié)果同前。與while、do_while實現(xiàn)程序相比,本例的程序結(jié)構(gòu)簡單緊湊。i賦初值可用for語句的表達(dá)式1來實現(xiàn),變量i的值增1可用表達(dá)式3來實現(xiàn)。
5.3.2for語句中三個表達(dá)式的靈活使用
for語句靈活運用的關(guān)鍵是三個表達(dá)式的設(shè)置。
(1)三個表達(dá)式都可以采用多種表達(dá)式。如for(i=1,sum=0;i<=100;i++,j++)中,表達(dá)式1和表達(dá)式2是逗號表達(dá)式。
(2)表達(dá)式1可以省略,但應(yīng)在循環(huán)體外給循環(huán)控制變量賦初值,否則會導(dǎo)致死循環(huán)。如例5.3中,在循環(huán)體外給變量賦初值,則循環(huán)語句可改為
for(;i<=100;i++)sum=sum+i;
(3)從語言規(guī)則來說,表達(dá)式2也可以缺省,例如:
for(i=1;;i++)sum=sum+i;
但執(zhí)行時將變?yōu)樗姥h(huán),因此是不正確的循環(huán)。
5.4用循環(huán)嵌套實現(xiàn)多重循環(huán)
何謂多重循環(huán)?怎樣實現(xiàn)多重循環(huán)?
C語言中把循環(huán)結(jié)構(gòu)作為一個語句。既然循環(huán)結(jié)構(gòu)是一個語句,當(dāng)然可以出現(xiàn)在循環(huán)體語句中。這樣,在循環(huán)體中就包含了一個完整的循環(huán)結(jié)構(gòu)語句,稱為循環(huán)嵌套,即循環(huán)中套循環(huán)。如此,可以形成多重循環(huán)。C語言中對循環(huán)嵌套層數(shù)沒有限制,但實際上,循環(huán)嵌套層數(shù)越多,程序越不容易理解,出錯的機會也就越多。實際應(yīng)用中,兩層以上的循環(huán)嵌套不多見。下面只對兩重循環(huán)嵌套的情況作一介紹。
三種循環(huán)結(jié)構(gòu)語句可以相互嵌套,形成如下6種嵌套關(guān)系。
通常,把外層循環(huán)稱為外循環(huán),內(nèi)層循環(huán)稱為內(nèi)循環(huán)。兩重循環(huán)嵌套中,內(nèi)循環(huán)作為外循環(huán)的一個語句,外循環(huán)每循環(huán)一次,內(nèi)循環(huán)要循環(huán)一遍。設(shè)外循環(huán)執(zhí)行i次,內(nèi)循環(huán)執(zhí)行j次,則內(nèi)循環(huán)體要被執(zhí)行i?×?j次。
程序中,循環(huán)嵌套要求內(nèi)循環(huán)必須被完全包含在外層循環(huán)的循環(huán)體中,不允許出現(xiàn)內(nèi)外層循環(huán)體交叉的情況。如圖5.6所示,在do_while循環(huán)體內(nèi)開始while()循環(huán),但是do-while循環(huán)結(jié)束在while()循環(huán)體內(nèi),它們互相交叉,這是非法結(jié)構(gòu)。
圖5.6循環(huán)交叉為非法結(jié)構(gòu)
5.5改變循環(huán)控制的語句
5.5.1break語句
break語句的一般形式為
break;
前面已經(jīng)介紹,break語句可用在switch結(jié)構(gòu)中,使執(zhí)行流跳出switch結(jié)構(gòu)。break語句也可用在循環(huán)結(jié)構(gòu)中,使執(zhí)行流跳出所在的循環(huán),即提前結(jié)束循環(huán)。
例5.5
使用break語句來改變循環(huán)控制。
運行結(jié)果:
分析:for循環(huán)中缺省了三個表達(dá)式,應(yīng)該是一個死循環(huán)。但在程序中使用了“if(i>100)break;”語句,使i達(dá)到101時就結(jié)束循環(huán)。這也是循環(huán)程序設(shè)計中,巧用break語句的一種方法。
5.5.2continue語句
continue語句的一般形式為
continue;
其功能是結(jié)束本次循環(huán),即跳過循環(huán)體中continue語句后面尚未執(zhí)行的循環(huán)體語句,轉(zhuǎn)向循環(huán)頭部,檢測是否進(jìn)行下一次循環(huán)。
例5.6
輸出100以內(nèi)能被9整除的數(shù)。
編程思路:逐一檢測9~100的整數(shù)能否被9整除,如能整除則輸出該數(shù),不能整除則不輸出。
分析:“if(n%9!=0)continue;”語句判斷當(dāng)前數(shù)是否能被9整除,若能整除,不執(zhí)行“continue;”語句,則執(zhí)行printf函數(shù)調(diào)用,輸出該數(shù);若不能整除,則執(zhí)“continue;”語句而跳過printf函數(shù)調(diào)用,不輸出該數(shù),結(jié)束本次循環(huán),返回循環(huán)頭部,開始下一次循環(huán),直到滿足循環(huán)結(jié)束條件。
例5.7
編寫程序,從鍵盤輸入字符后顯示,按Enter鍵,則結(jié)束字符輸入;按Esc鍵,則放棄當(dāng)前輸入的字符。運行結(jié)果:
分析:程序中使用字符輸入/輸出庫函數(shù),程序開頭要使用預(yù)處理命令#include<conio.h>。for(;;)不控制循環(huán),是通過兩個if語句來實現(xiàn)對循環(huán)的控制。當(dāng)按Enter鍵時,執(zhí)行“break;”語句,立即結(jié)束字符輸入;當(dāng)按Esc鍵時,執(zhí)行“continue;”語句,跳過“putchar(ch);”語句,返回循環(huán)頭部,輸入下一個字符。
5.6循環(huán)結(jié)構(gòu)程序設(shè)計
循環(huán)結(jié)構(gòu)程序設(shè)計時應(yīng)考慮哪些問題?如何準(zhǔn)確地設(shè)計循環(huán)結(jié)構(gòu)程序?
一般來說,循環(huán)結(jié)構(gòu)程序在設(shè)計時需考慮以下幾方面的問題:
(1)循環(huán)初始化問題。循環(huán)初始化包括對循環(huán)控制變量設(shè)置初值和對循環(huán)體中相關(guān)變量設(shè)置初值。循環(huán)控制變量初值設(shè)置得恰當(dāng)與否,關(guān)系到循環(huán)規(guī)律能否實現(xiàn)。如例5.1~例5.3中,如果循環(huán)控制變量i的初值設(shè)置為0,則要循環(huán)101次,第一次循環(huán)累加和變量加0,毫無意義。如果設(shè)置為大于1的數(shù),循環(huán)次數(shù)不到100次,造成累加和不正確。給循環(huán)體中操作變量設(shè)置初值,需要根據(jù)具體問題具體分析。一般來說,要給加法和變量清零,乘積變量置1,以防未知數(shù)據(jù)帶入,導(dǎo)致結(jié)果不正確。
(2)循環(huán)控制條件設(shè)置問題。按循環(huán)控制方式,循環(huán)可有計數(shù)控制和條件控制。計數(shù)控制循環(huán)是循環(huán)次數(shù)已知,一般用關(guān)系表達(dá)式作循環(huán)控制條件。對于循環(huán)次數(shù)未知的循環(huán),一般要認(rèn)真分析循環(huán)控制過程,找出規(guī)律,列出邏輯表達(dá)式。
(3)循環(huán)控制量改變問題。循環(huán)控制變量要在循環(huán)過程中加以改變,使循環(huán)控制條件向循環(huán)結(jié)束方面轉(zhuǎn)變。循環(huán)控制變量的改變方式要依據(jù)循環(huán)規(guī)律來確定。
(4)循環(huán)體結(jié)構(gòu)問題。循環(huán)體語句是循環(huán)問題的重復(fù)執(zhí)行部分,可包含三種結(jié)構(gòu)語句。復(fù)雜循環(huán)體語句一定要注意結(jié)構(gòu)語句的嵌套層次,嵌套層次之間不能相互交叉,即一個結(jié)構(gòu)語句必須完全包含在另一個結(jié)構(gòu)語句中。
(5)循環(huán)控制變量的引用問題。循環(huán)控制量可以在循環(huán)結(jié)束后引用,但要注意量值的準(zhǔn)確性。如例5.1~例5.3中,循環(huán)控制變量i在循環(huán)結(jié)束時值是101,而不是100。
循環(huán)結(jié)構(gòu)程序設(shè)計要比順序結(jié)構(gòu)和選擇結(jié)構(gòu)程序設(shè)計復(fù)雜一些,一定要認(rèn)真分析規(guī)律和算法,然后選擇便于實現(xiàn)的循環(huán)語句。
例5.8
編寫程序,計算s=1-3+5-7…-99+101。
編程思路:這個問題可看成數(shù)的累加,相加數(shù)是1~101之間的質(zhì)數(shù),且一個為正數(shù),一個為負(fù)數(shù),即累加數(shù)的符號在交替變化。找出這個規(guī)律,可以設(shè)置一個符號變量flag,初值設(shè)置為1,在循環(huán)中使用flag=-flag,即可實現(xiàn)符號的交替變換。算法可依照數(shù)的累加。
例5.9
用for循環(huán)語句求n!。
編程思路:可用迭代公式n!=n*(n-1)!。利用循環(huán)很容易實現(xiàn)迭代計算問題。設(shè)置變量i,既作循環(huán)控制變量i(1≤i≤n),又作本次循環(huán)求階乘的數(shù),用變量fac存放i!,初始化為fac=1。第i次循環(huán)前,fac中存放(i-1)!,第i次循環(huán)后,fac中存放i!,實現(xiàn)了相繼兩次的迭代。可用for語句實現(xiàn)。
運行結(jié)果:
分析:fac作為循環(huán)中的乘積變量,在循環(huán)外賦初值1,在循環(huán)中實現(xiàn)1?×?2?×?…?×?n求值運算,即求得n的階乘值。
例5.10
編寫程序求1~1000之間滿足“用3除余2,用5除余3,用7除余2”的數(shù),且一行只打印5個數(shù)。
編程思路:求余數(shù)用取模運算符%。3個條件是“與”的關(guān)系。一行打印5個數(shù),可以通過計數(shù)到5再回車換行。用do_while循環(huán)來實現(xiàn)。
運行結(jié)果:
分析:變量i既作循環(huán)控制變量,又是當(dāng)前要檢測的數(shù),取1~1000之間的整數(shù)。變量j用于輸出數(shù)據(jù)的計數(shù),控制一行輸出5個數(shù)。
例5.11
編程實現(xiàn)電文加密。電文加密規(guī)律為:將字母變成其后面的第4個字母,其他字符保持不變。例如,a→e,A→E,W→A。編寫一個程序,輸入一行字符,要求轉(zhuǎn)換成加密電文輸出。
編程思路:電文的加密規(guī)律如圖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轉(zhuǎn)換成b。從鍵盤輸入字符并轉(zhuǎn)換為循環(huán)實現(xiàn),循環(huán)控制條件為ch!='\n'。
圖5.7例5.11的電文加密規(guī)律運行結(jié)果:
分析:用while循環(huán)實現(xiàn)從鍵盤上輸入一個電文字符序列,每輸入一個字符按加密規(guī)律進(jìn)行加密轉(zhuǎn)換,一直到輸入“回車”鍵結(jié)束。第1層if語句中的條件表達(dá)式“ch>='a'&&ch<='z'||(ch>='A')&&ch<='Z'”判斷輸入的字符是否是26個大寫或小寫字母,是則進(jìn)行ASCII碼加4轉(zhuǎn)換,不是則不轉(zhuǎn)換。第2層if語句中的條件表達(dá)式“(ch>'Z'&&ch<'a')||(ch>'z')”判斷字母ASCII碼加4轉(zhuǎn)換后是否越界,如果越界則按加密循環(huán)規(guī)律,將其減26。
例5.12
編寫程序,求出100~1000之間各位數(shù)字之和是5的數(shù),一行輸出5個數(shù),并統(tǒng)計個數(shù)。
編程思路:該問題要對100~1000中的每一數(shù)逐一進(jìn)行判定,而且每一數(shù)要進(jìn)行逐位求和,是一個雙重循環(huán)問題。取遍100~1000之間的所有數(shù)可選用for循環(huán)結(jié)構(gòu)語句來解決。但在判定100~1000之間的每一個數(shù)其各位數(shù)字之和是否為5時,由于循環(huán)次數(shù)隨數(shù)位的變化而不同,宜選用while循環(huán)結(jié)構(gòu)語句。
運行結(jié)果:
分析:程序采用雙重循環(huán),外循環(huán)用for語句,內(nèi)循環(huán)用while語句。在內(nèi)循環(huán)實現(xiàn)對每位數(shù)字分離并累加。“s=s+k%10;”語句的作用是分離出當(dāng)前數(shù)的低位并累加,“k=k/10;”語句的作用是截取當(dāng)前數(shù)的高位部分,作為下一次要分離的數(shù)。例如123,第1次循環(huán)分離出低位數(shù)字3,截取高位部分12;第2次循環(huán)分離出低位數(shù)字2,截取高位部分1;第3次循環(huán)分離出低位數(shù)字1,截取高位部分0,循環(huán)結(jié)束。外循環(huán)利用變量i依次產(chǎn)生100~1000之間的一個整數(shù),根據(jù)內(nèi)循環(huán)計算各位數(shù)字之和是否為5,確定是否輸出,并進(jìn)行計數(shù)。
例5.13
編寫程序,找出3~500之間的全部素數(shù)并輸出,在一行輸出15個數(shù)。
編程思路:
(1)素數(shù)是除1和它本身之外不能被任何一個整數(shù)整除的自然數(shù)(1除外)。如2,3,5,7是素數(shù),1,4,6,8,10不是素數(shù)。判斷某數(shù)i是否為素數(shù)的一個簡單辦法是用2,3,4,…,i-1這些數(shù)據(jù)逐個去除i,只要被其中的一個數(shù)整除了,則i就不是素數(shù)。數(shù)學(xué)上已證明,對于自然數(shù)i只需用2,3,4,…,i1/2測試。
(2)需要判定3~500之間的每一數(shù)是否為素數(shù)。判定一個數(shù)是否是素數(shù),又要用2,3,4,…,i1/2逐一進(jìn)行測試,測試到被其中的某一個數(shù)整除,則可判定不是素數(shù),就不需要再進(jìn)行測試了。顯然這是一個雙重循環(huán)問題。為了結(jié)束內(nèi)循環(huán)時能方便識別當(dāng)前判定的數(shù)是否為素數(shù),設(shè)置一個標(biāo)志變量flag,在內(nèi)循環(huán)外設(shè)初值0,在內(nèi)循環(huán)中遇到能被整除的測試,使flag賦值1。程序流程如圖5.8所示。
圖5.8
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年安全生產(chǎn)責(zé)任基金抵押合同
- 2025年在線醫(yī)療健康平臺用戶注冊協(xié)議
- 2025年保密協(xié)議信息轉(zhuǎn)換書
- 2025年代理渠道合作協(xié)議
- 2025年旅游項目管理標(biāo)準(zhǔn)協(xié)議
- 《英語選修課》課件
- 2024 浙江公務(wù)員考試行測試題(A 類)
- 2025版美容護(hù)膚中心場地租賃合同范本4篇
- 2025版基礎(chǔ)設(shè)施建設(shè)工程施工合同終止補充協(xié)議2篇
- 買賣墓地合同(2024版)
- 2025年度房地產(chǎn)權(quán)證辦理委托代理合同典范3篇
- 柴油墊資合同模板
- 湖北省五市州2023-2024學(xué)年高一下學(xué)期期末聯(lián)考數(shù)學(xué)試題
- 城市作戰(zhàn)案例研究報告
- 【正版授權(quán)】 ISO 12803:1997 EN Representative sampling of plutonium nitrate solutions for determination of plutonium concentration
- 道德經(jīng)全文及注釋
- 2024中考考前地理沖刺卷及答案(含答題卡)
- 多子女贍養(yǎng)老人協(xié)議書范文
- 彩票市場銷售計劃書
- 骨科抗菌藥物應(yīng)用分析報告
- 支付行業(yè)反洗錢與反恐怖融資
評論
0/150
提交評論