第4章循環(huán)結(jié)構(gòu)_第1頁(yè)
第4章循環(huán)結(jié)構(gòu)_第2頁(yè)
第4章循環(huán)結(jié)構(gòu)_第3頁(yè)
第4章循環(huán)結(jié)構(gòu)_第4頁(yè)
第4章循環(huán)結(jié)構(gòu)_第5頁(yè)
已閱讀5頁(yè),還剩56頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Chap 4 循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)4.1 用格里高利公式求用格里高利公式求的近似值的近似值 (while語(yǔ)句語(yǔ)句)4.2 統(tǒng)計(jì)一個(gè)整數(shù)的位數(shù)統(tǒng)計(jì)一個(gè)整數(shù)的位數(shù) (do-while語(yǔ)句語(yǔ)句)4.3 判斷素?cái)?shù)判斷素?cái)?shù) (break 和和 continue 語(yǔ)句語(yǔ)句)4.4 求求1!+2!+.+100! (循環(huán)嵌套循環(huán)嵌套)4.5 循環(huán)結(jié)構(gòu)程序設(shè)計(jì)循環(huán)結(jié)構(gòu)程序設(shè)計(jì)本章要點(diǎn)本章要點(diǎn)n什么是循環(huán)什么是循環(huán)? 為什么要使用循環(huán)為什么要使用循環(huán)? 如何實(shí)現(xiàn)循環(huán)如何實(shí)現(xiàn)循環(huán)?n實(shí)現(xiàn)循環(huán)時(shí),如何確定循環(huán)條件和循環(huán)體實(shí)現(xiàn)循環(huán)時(shí),如何確定循環(huán)條件和循環(huán)體?n怎樣使用怎樣使用while 和和do-while語(yǔ)句實(shí)現(xiàn)次數(shù)不

2、確定的語(yǔ)句實(shí)現(xiàn)次數(shù)不確定的循環(huán)循環(huán)?nwhile 和和do-while語(yǔ)句有什么不同語(yǔ)句有什么不同?n如何使用如何使用break語(yǔ)句處理多循環(huán)條件語(yǔ)句處理多循環(huán)條件?n如何實(shí)現(xiàn)多重循環(huán)如何實(shí)現(xiàn)多重循環(huán)?4.1 用格里高利公式求用格里高利公式求的近似值的近似值例例4-1 使用格里高利公式求使用格里高利公式求的近似值,的近似值,要求精確到最后一項(xiàng)的絕對(duì)值小于要求精確到最后一項(xiàng)的絕對(duì)值小于104。4.1.1 程序解析程序解析4.1.2 while語(yǔ)句語(yǔ)句 11114357#include /*程序中調(diào)用絕對(duì)值函數(shù),包含程序中調(diào)用絕對(duì)值函數(shù),包含math.h */int main(void) int

3、denominator, flag; double item, pi; /* pi 用于存放累加和用于存放累加和*/ /*循環(huán)初始化循環(huán)初始化*/ flag = 1; /* flag 表示第表示第i 項(xiàng)的符號(hào),初始為正項(xiàng)的符號(hào),初始為正*/ denominator = 1 ; /* denominator 表示第表示第i 項(xiàng)的分母,初始為項(xiàng)的分母,初始為1*/ item = 1.0; /* item中存放第中存放第i 項(xiàng)的值,初值取項(xiàng)的值,初值取1*/ pi = 0; /* 置累加和置累加和pi 的初值為的初值為0*/ while(fabs (item) = 0.0001) /*當(dāng)當(dāng)| ite

4、m |0.0001時(shí),執(zhí)行循環(huán)時(shí),執(zhí)行循環(huán)*/ item = flag * 1.0 / denominator; /*計(jì)算第計(jì)算第i項(xiàng)的值項(xiàng)的值*/ pi = pi + item; /*累加第累加第i項(xiàng)的值項(xiàng)的值*/ flag = -flag; /*改變符號(hào),為下一次循環(huán)做準(zhǔn)備改變符號(hào),為下一次循環(huán)做準(zhǔn)備*/ denominator = denominator +2; /*分母遞增分母遞增2,為下一次循環(huán)做準(zhǔn)備,為下一次循環(huán)做準(zhǔn)備*/ pi = pi * 4; /*循環(huán)計(jì)算的結(jié)果是循環(huán)計(jì)算的結(jié)果是pi /4*/ printf ( “pi = %.4fn”, pi); return 0;4.1.

5、1 程序解析求程序解析求的近似值的近似值pi = 3.1418 item=0.0 ?fabs(item) 0.0014.1.2 while 語(yǔ)句語(yǔ)句一般形式為:一般形式為:while (表達(dá)式表達(dá)式) 循環(huán)體語(yǔ)句循環(huán)體語(yǔ)句; 真真假假while下一條語(yǔ)句下一條語(yǔ)句表達(dá)式表達(dá)式循環(huán)體語(yǔ)句循環(huán)體語(yǔ)句循環(huán)條件循環(huán)條件循環(huán)體循環(huán)體一條語(yǔ)句一條語(yǔ)句while語(yǔ)句的執(zhí)行流程語(yǔ)句的執(zhí)行流程while 語(yǔ)句說明語(yǔ)句說明while語(yǔ)句的執(zhí)行流程:語(yǔ)句的執(zhí)行流程:當(dāng)表達(dá)式的值為當(dāng)表達(dá)式的值為“真真”時(shí),循環(huán)執(zhí)行,直到表時(shí),循環(huán)執(zhí)行,直到表達(dá)式的值為達(dá)式的值為“假假”,循,循環(huán)中止并繼續(xù)執(zhí)行環(huán)中止并繼續(xù)執(zhí)行whil

6、e的下一條語(yǔ)句。的下一條語(yǔ)句。 while語(yǔ)句中的語(yǔ)句中的表達(dá)式表達(dá)式可以是可以是任意合法的表達(dá)式任意合法的表達(dá)式,循環(huán)體循環(huán)體語(yǔ)句只能是一條語(yǔ)句語(yǔ)句只能是一條語(yǔ)句。與與for語(yǔ)句相比,語(yǔ)句相比,while語(yǔ)句構(gòu)成簡(jiǎn)單,只有一個(gè)表達(dá)式和語(yǔ)句構(gòu)成簡(jiǎn)單,只有一個(gè)表達(dá)式和一條循環(huán)體語(yǔ)句,分別對(duì)應(yīng)循環(huán)的兩個(gè)核心要素:一條循環(huán)體語(yǔ)句,分別對(duì)應(yīng)循環(huán)的兩個(gè)核心要素:循環(huán)條循環(huán)條件和循環(huán)體件和循環(huán)體,可以直接把循環(huán)問題的分析設(shè)計(jì)轉(zhuǎn)換為語(yǔ)句,可以直接把循環(huán)問題的分析設(shè)計(jì)轉(zhuǎn)換為語(yǔ)句實(shí)現(xiàn)。實(shí)現(xiàn)。指定次數(shù)的循環(huán)程序設(shè)計(jì),循環(huán)的實(shí)現(xiàn)一般包括指定次數(shù)的循環(huán)程序設(shè)計(jì),循環(huán)的實(shí)現(xiàn)一般包括4個(gè)部分,個(gè)部分,即即初始化初始化、條

7、件控制條件控制、重復(fù)操作重復(fù)操作以及以及通過改變循環(huán)變量的通過改變循環(huán)變量的值最終改變條件的真假性值最終改變條件的真假性,使循環(huán)能正常結(jié)束。這,使循環(huán)能正常結(jié)束。這4個(gè)部分個(gè)部分直接和直接和for語(yǔ)句中的語(yǔ)句中的4個(gè)成分個(gè)成分(表達(dá)式表達(dá)式1、表達(dá)式、表達(dá)式2、循環(huán)體語(yǔ)、循環(huán)體語(yǔ)句和表達(dá)式句和表達(dá)式3)相對(duì)應(yīng),當(dāng)相對(duì)應(yīng),當(dāng)while語(yǔ)句使用時(shí),由于它只有語(yǔ)句使用時(shí),由于它只有2個(gè)個(gè)成分成分(表達(dá)式和循環(huán)體語(yǔ)句表達(dá)式和循環(huán)體語(yǔ)句),就需要另加,就需要另加初始化部分初始化部分, while語(yǔ)句的循環(huán)體語(yǔ)句語(yǔ)句的循環(huán)體語(yǔ)句可包含可包含for語(yǔ)句的循環(huán)體語(yǔ)句和表達(dá)語(yǔ)句的循環(huán)體語(yǔ)句和表達(dá)式式3,所以,所

8、以while的循環(huán)體語(yǔ)句中必須包含的循環(huán)體語(yǔ)句中必須包含能最終改變循環(huán)能最終改變循環(huán)條件真假性的操作條件真假性的操作。while 和和 for 的比較說明的比較說明 while 語(yǔ)句和語(yǔ)句和for語(yǔ)句(執(zhí)行機(jī)制實(shí)質(zhì)是一樣的)語(yǔ)句(執(zhí)行機(jī)制實(shí)質(zhì)是一樣的)都是在都是在循環(huán)前先判斷條件,只有條件為循環(huán)前先判斷條件,只有條件為“真真”才進(jìn)入循環(huán)。才進(jìn)入循環(huán)。表達(dá)式表達(dá)式1;while (表達(dá)式表達(dá)式2) for的循環(huán)體語(yǔ)句的循環(huán)體語(yǔ)句; 表達(dá)式表達(dá)式3;把把for語(yǔ)句改寫成語(yǔ)句改寫成while語(yǔ)句語(yǔ)句for(表達(dá)式表達(dá)式1; 表達(dá)式表達(dá)式2; 表達(dá)式表達(dá)式3) 循環(huán)體語(yǔ)句循環(huán)體語(yǔ)句while 和和 f

9、or 的比較說明的比較說明while 和和 for 的比較的比較for (i = 1; i = 10; i+) sum = sum + i; i = 1; 循環(huán)變量賦初值循環(huán)變量賦初值while (i =0。循環(huán)的三種常見的控制方式(計(jì)數(shù)控制的循環(huán)、循環(huán)的三種常見的控制方式(計(jì)數(shù)控制的循環(huán)、條件控制的循環(huán)、標(biāo)記控制的循環(huán))條件控制的循環(huán)、標(biāo)記控制的循環(huán)) int main(void) int num,count; /* 用用num記錄輸入數(shù)據(jù)的個(gè)數(shù)記錄輸入數(shù)據(jù)的個(gè)數(shù),count記錄不及格人數(shù)記錄不及格人數(shù)*/double grade, total; /* grade 存放輸入的成績(jī),存放輸入的

10、成績(jī), total保存成績(jī)之和保存成績(jī)之和 */num = 0; total = 0;count=0;printf(“Enter grades: n”); /*輸入提示輸入提示*/scanf(“%lf”, &grade); /* 輸入第輸入第1個(gè)數(shù),個(gè)數(shù),%lf中的中的l是字母是字母*/ /*當(dāng)輸入數(shù)據(jù)當(dāng)輸入數(shù)據(jù)grade大于等于大于等于0時(shí),執(zhí)行循環(huán)時(shí),執(zhí)行循環(huán)*/ while (grade = 0) /* 輸入負(fù)數(shù),循環(huán)結(jié)束輸入負(fù)數(shù),循環(huán)結(jié)束 */ total = total + grade; /*累加成績(jī)累加成績(jī)*/ num+; /*計(jì)數(shù)計(jì)數(shù)*/ if(grade60) coun

11、t+; scanf (“%lf”, &grade); /*讀入一個(gè)新數(shù)據(jù),為下次循環(huán)做準(zhǔn)備讀入一個(gè)新數(shù)據(jù),為下次循環(huán)做準(zhǔn)備*/if(num != 0) printf(“Grade average is %.2fn, total/num); printf(“Number of failure is %dn, count); else printf( Grade average is 0n); return 0;Enter grades: 67 88 73 54 82 -1Grade average is 72.80Number of failures is 1Enter grades:

12、-1 67 88 73 54 82Grade average mark is 04.2 統(tǒng)計(jì)一個(gè)整數(shù)的位數(shù)統(tǒng)計(jì)一個(gè)整數(shù)的位數(shù)例例4-3 從鍵盤讀入一個(gè)整數(shù),統(tǒng)計(jì)該數(shù)的位從鍵盤讀入一個(gè)整數(shù),統(tǒng)計(jì)該數(shù)的位數(shù)。例如,輸入數(shù)。例如,輸入12534,輸出,輸出5;輸入;輸入-99,輸出輸出2;輸入;輸入0,輸出,輸出1。4.2.1 程序解析程序解析4.2.2 do - while語(yǔ)句語(yǔ)句 int main(void) int count, number; /*count記錄整數(shù)記錄整數(shù)number的位數(shù)的位數(shù)*/ count = 0;printf(“Enter a number: );scanf (%d

13、, &number) ;if (number 0) number = -number; /*將輸入的負(fù)數(shù)轉(zhuǎn)換為正數(shù)將輸入的負(fù)數(shù)轉(zhuǎn)換為正數(shù)*/ do number = number / 10; /*整除后減少一位個(gè)位數(shù),組成一個(gè)新數(shù)整除后減少一位個(gè)位數(shù),組成一個(gè)新數(shù)*/ count +; /*位數(shù)加位數(shù)加1*/ while (number != 0); /*判斷循環(huán)條件判斷循環(huán)條件*/printf(It contains %d digits.n, count); return 0;4.2.1 程序解析統(tǒng)計(jì)一個(gè)整數(shù)的位數(shù)程序解析統(tǒng)計(jì)一個(gè)整數(shù)的位數(shù)Enter a number: 12534I

14、t contains 5 digits.Enter a number: -99It contains 2 digits.Enter a number: 0It contains 1 digits.while (number != 0) number = number / 10; count +;if(number=0) count=1;4.2.2 do - while 語(yǔ)句語(yǔ)句一般形式為:一般形式為:do 循環(huán)體語(yǔ)句循環(huán)體語(yǔ)句 while (表達(dá)式表達(dá)式);先循環(huán)先循環(huán)后判斷后判斷真真假假表達(dá)表達(dá)式式循環(huán)體語(yǔ)句循環(huán)體語(yǔ)句do-while的下一條語(yǔ)句的下一條語(yǔ)句執(zhí)行流程:執(zhí)行流程:第一次進(jìn)入第一

15、次進(jìn)入循環(huán)時(shí),首先執(zhí)行循環(huán)循環(huán)時(shí),首先執(zhí)行循環(huán)體語(yǔ)句,然后再檢查循體語(yǔ)句,然后再檢查循環(huán)控制條件,即計(jì)算表環(huán)控制條件,即計(jì)算表達(dá)式,若值為達(dá)式,若值為“真真”,繼續(xù)循環(huán),直到表達(dá)式繼續(xù)循環(huán),直到表達(dá)式的值為的值為“假假”,循環(huán)結(jié),循環(huán)結(jié)束,執(zhí)行束,執(zhí)行do-while的下的下一條語(yǔ)句。一條語(yǔ)句。do-while語(yǔ)句執(zhí)行流程語(yǔ)句執(zhí)行流程n while 是先判斷條件,再?zèng)Q定是否循環(huán);是先判斷條件,再?zèng)Q定是否循環(huán);n do-while 是先至少循環(huán)一次,然后再根據(jù)是先至少循環(huán)一次,然后再根據(jù)循環(huán)的結(jié)果決定是否繼續(xù)循環(huán)。循環(huán)的結(jié)果決定是否繼續(xù)循環(huán)。while 和和 do-while 的比較的比較真真假

16、假表達(dá)式表達(dá)式循環(huán)體語(yǔ)句循環(huán)體語(yǔ)句do-while的下一條語(yǔ)句的下一條語(yǔ)句真真假假while的下一條語(yǔ)句的下一條語(yǔ)句表達(dá)式表達(dá)式循環(huán)體語(yǔ)句循環(huán)體語(yǔ)句udo_while語(yǔ)句的使用方法和語(yǔ)句的使用方法和 while語(yǔ)句類似,語(yǔ)句中的表達(dá)式可語(yǔ)句類似,語(yǔ)句中的表達(dá)式可是任意合法的表達(dá)式,循環(huán)體語(yǔ)句只能是一條語(yǔ)句;使用時(shí)要另加是任意合法的表達(dá)式,循環(huán)體語(yǔ)句只能是一條語(yǔ)句;使用時(shí)要另加初始化部分,循環(huán)體語(yǔ)句必須包含能最終改變條件真假性的操作。初始化部分,循環(huán)體語(yǔ)句必須包含能最終改變條件真假性的操作。udo_while語(yǔ)句適合于先循環(huán),后判斷循環(huán)條件的情況,一般在循語(yǔ)句適合于先循環(huán),后判斷循環(huán)條件的情況,

17、一般在循環(huán)體的執(zhí)行過程中明確循環(huán)控制條件。它每執(zhí)行一次循環(huán)體后,再環(huán)體的執(zhí)行過程中明確循環(huán)控制條件。它每執(zhí)行一次循環(huán)體后,再判斷條件,以決定是否進(jìn)行下一次循環(huán)。判斷條件,以決定是否進(jìn)行下一次循環(huán)。無(wú)論循環(huán)條件的值如何,無(wú)論循環(huán)條件的值如何,至少會(huì)執(zhí)行一次循環(huán)體。至少會(huì)執(zhí)行一次循環(huán)體。4.3 判斷素?cái)?shù)判斷素?cái)?shù)例例4-4 輸入一個(gè)正整數(shù)輸入一個(gè)正整數(shù)m,判斷它是否為素?cái)?shù)。判斷它是否為素?cái)?shù)。素?cái)?shù)就是只能被素?cái)?shù)就是只能被1和自身整除的正整數(shù),和自身整除的正整數(shù),1不是不是素?cái)?shù),素?cái)?shù),2是素?cái)?shù)。是素?cái)?shù)。4.3.1 程序解析程序解析4.3.2 break語(yǔ)句語(yǔ)句 和和continue語(yǔ)句語(yǔ)句4.3.1 程

18、序解析判斷素?cái)?shù)程序解析判斷素?cái)?shù)算法:除了算法:除了1和和m,不能被其它數(shù)整除。,不能被其它數(shù)整除。設(shè)設(shè) i 取值取值 2, m-1 n如果如果m不能被該區(qū)間上的任何一個(gè)數(shù)整除,即對(duì)不能被該區(qū)間上的任何一個(gè)數(shù)整除,即對(duì)每個(gè)每個(gè)i,m%i 都不為都不為0,則,則m是素?cái)?shù)是素?cái)?shù)n只要找到一個(gè)只要找到一個(gè)i,使使m%i為為0,則,則m肯定不是素?cái)?shù)肯定不是素?cái)?shù)m %2 %3 %4 %5 %(m-1)不是素?cái)?shù)不是素?cái)?shù) | =0 =0是素?cái)?shù)是素?cái)?shù) & !=0 !=0 m不可能被大于不可能被大于 m/2 的數(shù)整除的數(shù)整除 i 取值取值 2, m-1 、 2, m/2 、 2, mfor(i = 2;

19、i m/2 &m!=1 ) printf(yesn)else printf(non”);int main(void) int i, m;printf(“Enter a number: );scanf (%d, &m);for (i = 2; i m/2&m!=1 ) /*如果循環(huán)正常結(jié)束,說明如果循環(huán)正常結(jié)束,說明m不能被任何一個(gè)不能被任何一個(gè)i整除,整除, 則則m是素?cái)?shù)是素?cái)?shù)*/ printf(%d is a prime number! n, m); else printf(No!n); 例例4-4源程序判斷素?cái)?shù)源程序判斷素?cái)?shù)Enter a number: 9NoEn

20、ter a number: 1111 is a prime number!for (i = 2; i = m/2; i+) if (m % i = 0) printf(No!n); else printf(%d is a prime number! n, m); 循環(huán)條件循環(huán)條件?循環(huán)的結(jié)束條件循環(huán)的結(jié)束條件?for (i = 2; i = m/2; i+) if (m % i = 0) printf(No!n); else printf(%d is a prime number! n, m); break 語(yǔ)句語(yǔ)句while(exp) 語(yǔ)句語(yǔ)句1 if (expb) break; 語(yǔ)句語(yǔ)句2

21、真真假假 exp 語(yǔ)句語(yǔ)句1假假 expb 語(yǔ)語(yǔ) 句句2循環(huán)體循環(huán)體真真for (i = 2; i m/2 &m!=1 ) printf(Yes); else printf(No!n); 當(dāng)循環(huán)有多個(gè)出口時(shí):當(dāng)循環(huán)有多個(gè)出口時(shí): 表示循環(huán)條件表示循環(huán)條件 區(qū)分結(jié)束條件區(qū)分結(jié)束條件for(i = 2; i = m/2; i+) if(m%i = 0) printf(No!n); break; printf(Yes); u當(dāng)循環(huán)結(jié)構(gòu)中出現(xiàn)多個(gè)循環(huán)條件時(shí),當(dāng)循環(huán)結(jié)構(gòu)中出現(xiàn)多個(gè)循環(huán)條件時(shí),可以由循環(huán)語(yǔ)句中的表達(dá)式和可以由循環(huán)語(yǔ)句中的表達(dá)式和break語(yǔ)語(yǔ)句共同控制。句共同控制。break語(yǔ)句強(qiáng)

22、制循環(huán)結(jié)束。語(yǔ)句強(qiáng)制循環(huán)結(jié)束。ubreak語(yǔ)句應(yīng)該和語(yǔ)句應(yīng)該和if語(yǔ)句配合使用,語(yǔ)句配合使用,即條件滿足時(shí),才執(zhí)行即條件滿足時(shí),才執(zhí)行break跳出循環(huán);跳出循環(huán);否則,若否則,若break無(wú)條件執(zhí)行,意味著永無(wú)條件執(zhí)行,意味著永遠(yuǎn)不會(huì)執(zhí)行循環(huán)體中遠(yuǎn)不會(huì)執(zhí)行循環(huán)體中break后面的其他后面的其他語(yǔ)句。語(yǔ)句。continue 語(yǔ)句語(yǔ)句while(exp) 語(yǔ)句語(yǔ)句1 if (expb) continue; 語(yǔ)句語(yǔ)句2真真假假 exp 語(yǔ)句語(yǔ)句1假假e x pb 語(yǔ)語(yǔ) 句句2循環(huán)體循環(huán)體真真continue 語(yǔ)句的作用語(yǔ)句的作用是跳過循環(huán)體中是跳過循環(huán)體中continue后面的后面的語(yǔ)句,繼續(xù)下一

23、次循環(huán)。語(yǔ)句,繼續(xù)下一次循環(huán)。 continue 語(yǔ)句一般也需要語(yǔ)句一般也需要與與if語(yǔ)句配合使用。語(yǔ)句配合使用。break 和和 continue#include stdio.hint main(void) char c; int i; for (i = 0; i 10; i+) c = getchar(); if (c = n) break; putchar(c); abc efgh 123 abcabcefgh1continue;break語(yǔ)句和語(yǔ)句和 continue語(yǔ)句的區(qū)別:語(yǔ)句的區(qū)別:break結(jié)束循環(huán),而結(jié)束循環(huán),而continue只是跳過后面語(yǔ)句繼續(xù)循環(huán)。只是跳過后面語(yǔ)句繼續(xù)

24、循環(huán)。 break除了可以終止循環(huán)外,還用于除了可以終止循環(huán)外,還用于switch語(yǔ)句,而語(yǔ)句,而continue只能用于循環(huán)。只能用于循環(huán)。例例 break舉例:輸出圓面積,面積大于舉例:輸出圓面積,面積大于100時(shí)停止時(shí)停止#define PI 3.14159main() int r; float area; for(r=1;r100) break; printf(r=%d,area=%.2fn,r,area); break 和和 continue例如例如 以下程序段輸出以下程序段輸出100200之間所有能被之間所有能被3整除的數(shù)。整除的數(shù)。for(i = 100;i = 200;i+)

25、if( i % 3 != 0 )continue; printf(“%d ”,i);for(i = 100;i = 200;i+) if(i % 3 = 0) printf(“%d ”,i);例例4-5 簡(jiǎn)單的猜數(shù)游戲。最多允許猜簡(jiǎn)單的猜數(shù)游戲。最多允許猜5次。次。# include int main(void) int mynumber = 38; /* 計(jì)算機(jī)指定被猜的數(shù)計(jì)算機(jī)指定被猜的數(shù) */ int count = 0,yournumber; for(count = 1;count mynumber ) printf(Sorry! your number is bigger than

26、my number! n); else printf(Sorry! your number is smaller than my number! n); printf(Game is over!n); return 0; Input your number:48Sorry! your number is bigger than my number!Input your number:38Ok! you are right!Game is over!4.4 求求1! + 2! + . + 100!for (i = 1; i = 100; i+) item = i ! sum = sum + it

27、em;4.4.1 程序解析程序解析調(diào)用函數(shù)調(diào)用函數(shù) fact(i) 計(jì)算計(jì)算 i 的階乘的階乘4.4.2 嵌套循環(huán)嵌套循環(huán)用循環(huán)計(jì)算用循環(huán)計(jì)算 i 的階乘的階乘#include double fact (int n); /*函數(shù)聲明函數(shù)聲明*/int main(void) int i; double sum; sum = 0; for(i = 1; i = 100; i+ ) sum = sum + fact (i); /*調(diào)用調(diào)用fact (i)求求i!,共重復(fù),共重復(fù)100次次*/ printf(“1! + 2! + 3! + + 100! = %en”, sum);/*用指數(shù)用指數(shù)形式輸

28、出形式輸出 結(jié)果結(jié)果*/ return 0;double fact (int n) /*定義求定義求n!的函數(shù)的函數(shù)*/ int i; double result = 1; /*變量變量result 存放階乘的值,并置初值為存放階乘的值,并置初值為1*/ for (i = 1; i = n; i+) /*循環(huán)執(zhí)行循環(huán)執(zhí)行n次,計(jì)算次,計(jì)算n!*/ result = result * i ; return result ; /*把結(jié)果回送主函數(shù)把結(jié)果回送主函數(shù)*/4.4.1 程序解析程序解析例例4-6 求求1! + 2! + . + 100! 要求定義和調(diào)用函要求定義和調(diào)用函數(shù)數(shù)fact(n)計(jì)

29、算計(jì)算n的階乘的階乘。1! + 2! + + 100! = 9.426900e+157 4.4.2 嵌套循環(huán)嵌套循環(huán)累加求和的累加求和的for語(yǔ)句為:語(yǔ)句為:for (i = 1; i = 100; i+) item = i ! sum = sum + item;for(i = 1; i = 100; i+) /*外層循環(huán)執(zhí)行外層循環(huán)執(zhí)行100次,求累加和次,求累加和*/ item = 1; /*置置item的初值為的初值為1,以保證每次求階乘都從,以保證每次求階乘都從1開始連乘開始連乘*/ for (j = 1; j = i; j+) /*內(nèi)層循環(huán)重復(fù)內(nèi)層循環(huán)重復(fù)i次,算出次,算出 item

30、=i!*/ item = item * j; sum = sum + item; /*累加累加i!*/i!=1i!=1* *2 2* * *i,i,是個(gè)連乘的是個(gè)連乘的重復(fù)過程,每次循環(huán)完成重復(fù)過程,每次循環(huán)完成一次乘法,循環(huán)一次乘法,循環(huán)i i次求出次求出 i!i!的值。的值。例例4-7 求求1! + 2! + . + 100! 要求使用要求使用嵌套循環(huán)。嵌套循環(huán)。#include int main(void) int i, j;double item, sum; /* 變量變量item中中 存放階乘的值存放階乘的值 */sum = 0; for(i = 1; i = 100; i+) /*

31、外層循環(huán)執(zhí)行外層循環(huán)執(zhí)行100次,求累加和次,求累加和*/ item = 1; /*置置item的初值為的初值為1,以保證每次求階乘都從,以保證每次求階乘都從1開始連乘開始連乘*/ for (j = 1; j = i; j+) /* 內(nèi)層循環(huán)算出內(nèi)層循環(huán)算出 item = i! */ item = item * j; /*內(nèi)層循環(huán)重復(fù)內(nèi)層循環(huán)重復(fù)i次,算出次,算出 item=i!*/ sum = sum + item; /* 把把i!累加到累加到sum中中*/printf(“1! + 2! + 3! + + 100! = %en”, sum); /*用指數(shù)用指數(shù)形式輸形式輸 出結(jié)果出結(jié)果*/1

32、!+2!+100!=9.42690e+157內(nèi)層循環(huán)的初始化內(nèi)層循環(huán)的初始化for(i = 1; i = 100; i+) item = 1; for (j = 1; j = i; j+) item = item * j; sum = sum + item; 求求1! + 2! + . + 100!item = 1;for(i = 1; i = 100; i+) for (j = 1; j = i; j+) item = item * j; sum = sum + item; 求求1! + 1!*2! + + 1!*2!*100! 分析嵌套循環(huán)分析嵌套循環(huán)(二重循環(huán)二重循環(huán))的執(zhí)行過程的執(zhí)行過

33、程for(i = 1; i = 100; i+) item = 1; for (j = 1; j = i; j+) item = item * j; sum = sum + item; n 外層循環(huán)變量外層循環(huán)變量 i 的每個(gè)值的每個(gè)值內(nèi)層循環(huán)變量?jī)?nèi)層循環(huán)變量 j 變化一個(gè)輪次;變化一個(gè)輪次;n 內(nèi)外層循環(huán)變量不能相同內(nèi)外層循環(huán)變量不能相同分別用分別用 i 和和 jfor (i = 1; i = 100; i+) for (j = 1; j = i; j+) printf (%d %dn, i, j );二重循環(huán)的執(zhí)行過程二重循環(huán)的執(zhí)行過程 使用嵌套的循環(huán)體時(shí),應(yīng)注意以下問題使用嵌套的循環(huán)體時(shí)

34、,應(yīng)注意以下問題 n在嵌套的各層循環(huán)體中,使用復(fù)合語(yǔ)句(即用一對(duì)大花括號(hào)將循環(huán)體語(yǔ)句括起來)保證邏輯上的正確性 n內(nèi)層和外層循環(huán)控制變量不應(yīng)同名,以免造成混亂 n嵌套的循環(huán)最好采用右縮進(jìn)格式書寫,以保證層次的清晰性 n循環(huán)嵌套不能交叉,即在一個(gè)循環(huán)體內(nèi)必須完整的包含著另一個(gè)循環(huán) 合法的嵌套循環(huán)合法的嵌套循環(huán) 外層循環(huán) 內(nèi)層循環(huán) 內(nèi)層循環(huán) 內(nèi)層循環(huán) 合法的嵌套循環(huán) 課堂練習(xí)課堂練習(xí)1: 編寫程序,實(shí)現(xiàn)以下圖形輸出編寫程序,實(shí)現(xiàn)以下圖形輸出(輸出輸出行數(shù)可變行數(shù)可變)。*#include #include #define N 10#define N 10void main() void main(

35、) intint i,ji,j; ; for(i=1;i= for(i=1;i=N;iN;i+) +) /控制行數(shù)控制行數(shù) for(j=1;j=N- for(j=1;j=N-i;ji;j+)+)/隨著行數(shù)的增加,輸出遞減數(shù)目的空格隨著行數(shù)的增加,輸出遞減數(shù)目的空格 printfprintf( );( ); for(j=1;j=2 for(j=1;j=2* *i-1;j+)i-1;j+) printfprintf(* *);); printf(nprintf(n);); 課堂練習(xí)課堂練習(xí)2: 輸出九九乘法表輸出九九乘法表4.5 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)n循環(huán)程序的實(shí)現(xiàn)要點(diǎn):循環(huán)程序的實(shí)現(xiàn)要點(diǎn):歸

36、納出歸納出哪些操作需要反復(fù)執(zhí)行?哪些操作需要反復(fù)執(zhí)行? 循環(huán)體循環(huán)體這些操作在什么情況下重復(fù)執(zhí)行這些操作在什么情況下重復(fù)執(zhí)行? 循環(huán)條件循環(huán)條件n選用合適的循環(huán)語(yǔ)句選用合適的循環(huán)語(yǔ)句for while do-whilen循環(huán)具體實(shí)現(xiàn)時(shí)分兩種情況考慮(循環(huán)條件):循環(huán)具體實(shí)現(xiàn)時(shí)分兩種情況考慮(循環(huán)條件):事先給定循環(huán)次數(shù),首選事先給定循環(huán)次數(shù),首選for語(yǔ)句語(yǔ)句通過其他條件控制循環(huán),考慮通過其他條件控制循環(huán),考慮while或或do-while語(yǔ)語(yǔ)句句循環(huán)語(yǔ)句的選擇循環(huán)語(yǔ)句的選擇一般說來,如果題目中給出了循環(huán)次數(shù),首選一般說來,如果題目中給出了循環(huán)次數(shù),首選for語(yǔ)句,它看起來最清晰,循環(huán)的語(yǔ)句,

37、它看起來最清晰,循環(huán)的4個(gè)組成個(gè)組成部分一目了然;如果循環(huán)次數(shù)不明確,需要部分一目了然;如果循環(huán)次數(shù)不明確,需要通過其他條件控制循環(huán),通常選用通過其他條件控制循環(huán),通常選用while語(yǔ)語(yǔ)句;如果必須先進(jìn)入循環(huán),經(jīng)循環(huán)體運(yùn)算得句;如果必須先進(jìn)入循環(huán),經(jīng)循環(huán)體運(yùn)算得到循環(huán)控制條件后,再判斷是否進(jìn)行下一次到循環(huán)控制條件后,再判斷是否進(jìn)行下一次循環(huán),使用循環(huán),使用do-while語(yǔ)句最合適。語(yǔ)句最合適。循環(huán)語(yǔ)句的選擇循環(huán)語(yǔ)句的選擇用類用類C語(yǔ)言的格式描述如下:語(yǔ)言的格式描述如下:if(循環(huán)次數(shù)已知)循環(huán)次數(shù)已知) 使用使用for語(yǔ)句語(yǔ)句else /* 循環(huán)次數(shù)未知循環(huán)次數(shù)未知 */if (循環(huán)條件在進(jìn)

38、入循環(huán)時(shí)明確循環(huán)條件在進(jìn)入循環(huán)時(shí)明確)使用使用while語(yǔ)句語(yǔ)句else /* 循環(huán)條件需要在循環(huán)體中明確循環(huán)條件需要在循環(huán)體中明確 */使用使用do-while語(yǔ)句語(yǔ)句選擇三種循環(huán)的一般思路選擇三種循環(huán)的一般思路n如果循環(huán)次數(shù)已知,用如果循環(huán)次數(shù)已知,用forn如果循環(huán)次數(shù)未知,用如果循環(huán)次數(shù)未知,用whilen如果循環(huán)體至少要執(zhí)行一次,用如果循環(huán)體至少要執(zhí)行一次,用do-whilen只是思路,不是定律只是思路,不是定律死循環(huán)死循環(huán)n永遠(yuǎn)不會(huì)退出的循環(huán)為死循環(huán)永遠(yuǎn)不會(huì)退出的循環(huán)為死循環(huán)for (;) while (1) do while (1)除非確實(shí)需要死循環(huán),否則不要使用這樣的形除非確實(shí)

39、需要死循環(huán),否則不要使用這樣的形式。它們使循環(huán)的中止條件變得不明朗式。它們使循環(huán)的中止條件變得不明朗n一般情況下,要極力避免死循環(huán)一般情況下,要極力避免死循環(huán)絕大多數(shù)程序不需要死循環(huán)。如果出現(xiàn),往往絕大多數(shù)程序不需要死循環(huán)。如果出現(xiàn),往往都是都是bug時(shí)間過長(zhǎng)的循環(huán)會(huì)造成時(shí)間過長(zhǎng)的循環(huán)會(huì)造成“假死假死”現(xiàn)象,也要考現(xiàn)象,也要考慮解決慮解決/*從輸入的從輸入的n個(gè)成績(jī)中選出最高分,用個(gè)成績(jī)中選出最高分,用for語(yǔ)句實(shí)現(xiàn)語(yǔ)句實(shí)現(xiàn)*/#include int main(void) int i, mark, max, n; /* max 中放最高分中放最高分*/ printf(“Enter n: ”)

40、; scanf (“%d”, &n); /*輸入數(shù)據(jù)個(gè)數(shù)輸入數(shù)據(jù)個(gè)數(shù)*/ printf(“Enter %d marks: ”, n); /*提示輸入提示輸入n個(gè)成績(jī)個(gè)成績(jī)*/ scanf (%d, &mark); /* 讀入第一個(gè)成績(jī)讀入第一個(gè)成績(jī) */ max = mark; /* 假設(shè)第一個(gè)成績(jī)是最高分假設(shè)第一個(gè)成績(jī)是最高分 */ for (i = 1; i n; i+ )/*由于已經(jīng)讀了一個(gè)數(shù),循環(huán)執(zhí)行由于已經(jīng)讀了一個(gè)數(shù),循環(huán)執(zhí)行n-1次次*/ scanf (“%d”, &mark); /* 讀入下一個(gè)成績(jī)讀入下一個(gè)成績(jī) */ if (max mark) /* 如

41、果該成績(jī)比最高分高如果該成績(jī)比最高分高 */ max = mark; /* 再假設(shè)該成績(jī)?yōu)樽罡叻衷偌僭O(shè)該成績(jī)?yōu)樽罡叻?*/ printf(Max = %dn, max); return 0;例例4-8求最值問題。求最值問題。 輸入一批學(xué)生的成績(jī),求最高分輸入一批學(xué)生的成績(jī),求最高分(for)mark maxmaxmarkEnter n: 5Enter 5 marks:67 88 73 54 82Max = 88Enter n: 0Enter 0 marks:67Max = 67/*從輸入的一批以負(fù)數(shù)結(jié)束的成績(jī)中選出最高分,用從輸入的一批以負(fù)數(shù)結(jié)束的成績(jī)中選出最高分,用while語(yǔ)句實(shí)現(xiàn)語(yǔ)句實(shí)現(xiàn)

42、*/#include int main(void) int mark, max; /* max中放最高分中放最高分*/ printf(“Enter marks:); scanf (%d, &mark); /* 讀入第一個(gè)成績(jī)讀入第一個(gè)成績(jī) */ max = mark; /* 假設(shè)第一個(gè)成績(jī)是最高分假設(shè)第一個(gè)成績(jī)是最高分 */ /*當(dāng)輸入的成績(jī)大于等于當(dāng)輸入的成績(jī)大于等于0時(shí),執(zhí)行循環(huán)時(shí),執(zhí)行循環(huán)*/ while (mark = 0) if(max mark) /* 如果讀入的成績(jī)比最高分高如果讀入的成績(jī)比最高分高 */ max = mark ; /* 再假設(shè)該成績(jī)?yōu)樽罡叻衷偌僭O(shè)該成績(jī)?yōu)?/p>

43、最高分 */ scanf (“%d”, &mark ); /* 讀入下一個(gè)成績(jī)讀入下一個(gè)成績(jī)*/ printf(Max = %dn, max); return 0;例例4-8求最值問題求最值問題.輸入一批學(xué)生的成績(jī),求最高分輸入一批學(xué)生的成績(jī),求最高分(while)Enter marks:67 88 73 54 82 -1Max = 88Enter marks:-1Max = -1#include int main(void) int mark, max; /* max中放最高分中放最高分*/ max = -1; /* 給給max賦一個(gè)小初值賦一個(gè)小初值 */ printf(“Ente

44、r marks: ); do scanf (%d, &mark ); if (max = 0); printf(Max = %dn, max);例例4-8 求最值問題。輸入一批學(xué)生的成績(jī),求最高分求最值問題。輸入一批學(xué)生的成績(jī),求最高分(do-while)Enter marks: 67 88 73 54 82 -1Max = 88Enter marks: -1Max = -1例例4-9 逆序問題。輸入一個(gè)正整數(shù),將其逆逆序問題。輸入一個(gè)正整數(shù),將其逆序輸出。例如,輸入序輸出。例如,輸入12345,輸出,輸出54321。確定:確定:循環(huán)條件循環(huán)條件和和循環(huán)體循環(huán)體(循環(huán)不變式循環(huán)不變式)

45、 12345 5 4 3 2 112345 % 10 = 5 12345 / 10 = 1234 1234 % 10 = 4 1234 / 10 = 123 123 % 10 = 3 123 / 10 = 12 12 % 10 = 2 12 / 10 = 1 1 % 10 = 1 1 / 10 = 0 結(jié)束結(jié)束循環(huán)不變式循環(huán)不變式 x%10 x=x/10循環(huán)結(jié)束條件循環(huán)結(jié)束條件 x=0經(jīng)過歸納得到:經(jīng)過歸納得到:重復(fù)以下步驟:重復(fù)以下步驟:(a) x%10,分離一位,分離一位(b) x=x/10,為下一次分離做準(zhǔn)備,為下一次分離做準(zhǔn)備直到直到x=0,循環(huán)結(jié)束循環(huán)結(jié)束/*逆序輸出一個(gè)正整數(shù)逆序輸

46、出一個(gè)正整數(shù)*/#include int main(void) int x;printf(“Enter x:”);scanf( “%d”, &x);while (x != 0) printf( %d , x %10); x = x/10 ;Enter x: 123455 4 3 2 1用用do-while實(shí)現(xiàn)?實(shí)現(xiàn)?例例4-9 逆序問題。輸入一個(gè)正整數(shù),將其逆逆序問題。輸入一個(gè)正整數(shù),將其逆序輸出。例如,輸入序輸出。例如,輸入12345,輸出,輸出54321。例例4-10 素?cái)?shù)問題。求素?cái)?shù)問題。求500以內(nèi)的全部素?cái)?shù),每行輸出以內(nèi)的全部素?cái)?shù),每行輸出10個(gè)。個(gè)。for (m = 2;

47、m = 500; m+) if (m是素?cái)?shù)是素?cái)?shù)) printf( “%d”, m); /*輸出素?cái)?shù)輸出素?cái)?shù)*/n = sqrt(m);for(i = 2; i n) printf(yesn)else printf(non”);for (m = 2; m = 500; m+) n=sqrt(m); for(i = 2; i n) printf(%d, m) 例例4-10 源程序源程序#include #include int main(void) int count, i, m, n; count = 0; /* count 記錄素?cái)?shù)的個(gè)數(shù),用于控制輸出格式記錄素?cái)?shù)的個(gè)數(shù),用于控制輸出格式*/

48、 for (m = 2; m = 100; m+) n = sqrt(m); for (i = 2; i n) /* 如果如果m是素?cái)?shù)是素?cái)?shù) */ printf(“%6d”, m); /* 輸出輸出m */ count+; /* 累加已經(jīng)輸出的素?cái)?shù)個(gè)數(shù)累加已經(jīng)輸出的素?cái)?shù)個(gè)數(shù) */ if (count %10 = 0) printf(“n”); /* 如果如果count是是10的倍數(shù),換行的倍數(shù),換行 */ printf(“n”);例例4-11斐波那契數(shù)列問題。輸出斐波那契斐波那契數(shù)列問題。輸出斐波那契(Fibonacci)序列的前序列的前10項(xiàng)項(xiàng) 1, 1, 2, 3, 5, 8, 13,21

49、,34,55x1 x2 x x1 x2 xx1 = x2 = 1;x = x1 + x2;x1 = x2;x2 = x;int main(void) int I,x1,x2,x; /*x1和和x2依次代表前兩項(xiàng),依次代表前兩項(xiàng),x表示其后一項(xiàng)表示其后一項(xiàng)*/x1 = 1; /*頭兩項(xiàng)都是頭兩項(xiàng)都是1*/x2 = 1;printf (“%6d%6d”, x1, x2 ); /* 先輸出頭兩項(xiàng)先輸出頭兩項(xiàng) */for (i = 1; i = 8; i+) /* 循環(huán)輸出后循環(huán)輸出后8項(xiàng)項(xiàng) */ x = x1 + x2; /* 計(jì)算新項(xiàng)計(jì)算新項(xiàng) */ printf(%6d, x); x1 = x2;

50、 /* 更新更新x1和和x2,為下一次計(jì)算新項(xiàng),為下一次計(jì)算新項(xiàng)x作準(zhǔn)備作準(zhǔn)備 */ x2 = x; 雞兔共有雞兔共有30只,腳共有只,腳共有90只,編寫只,編寫一個(gè)程序計(jì)算雞兔各有多少只。一個(gè)程序計(jì)算雞兔各有多少只。解:設(shè)其中雞有解:設(shè)其中雞有x只,兔有只,兔有y只,列方程組得:只,列方程組得:x+y=302x+4y=90解得:解得:x=15y=15答:其中雞有答:其中雞有15只,兔有只,兔有15只。只。 雞兔共有雞兔共有30只,腳共有只,腳共有90只,編寫只,編寫一個(gè)程序計(jì)算雞兔各有多少只。一個(gè)程序計(jì)算雞兔各有多少只。#includevoid main( ) int x,y; if (x+y=30)&(2x+4y=90)printf(“x=%d,y=%d”,x,y); 雞兔共有雞兔共有30只,腳共有只,腳共有90只,編寫只,編寫一個(gè)程序計(jì)算雞兔各有多少只。一個(gè)程序計(jì)算雞兔各有多少只。改進(jìn)?改進(jìn)?例例4-12 窮舉算法窮舉算法(古典算術(shù)問題古典算術(shù)問題)搬磚頭搬磚頭某工地需要搬運(yùn)磚塊,已知男人一人搬某工地需要搬運(yùn)磚塊,已知男人一人搬3塊

溫馨提示

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

評(píng)論

0/150

提交評(píng)論