第03章 程序的控制結(jié)構(gòu)(循環(huán))簡易版_第1頁
第03章 程序的控制結(jié)構(gòu)(循環(huán))簡易版_第2頁
第03章 程序的控制結(jié)構(gòu)(循環(huán))簡易版_第3頁
第03章 程序的控制結(jié)構(gòu)(循環(huán))簡易版_第4頁
第03章 程序的控制結(jié)構(gòu)(循環(huán))簡易版_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 廈門理工學(xué)院計算機科學(xué)與技術(shù)系廈門理工學(xué)院高級語言程序設(shè)計教學(xué)課件廈門理工學(xué)院高級語言程序設(shè)計教學(xué)課件 第第3 3章程序的控制結(jié)構(gòu)章程序的控制結(jié)構(gòu)循環(huán)結(jié)構(gòu)(重復(fù)結(jié)構(gòu))循環(huán)結(jié)構(gòu)(重復(fù)結(jié)構(gòu))廈門理工學(xué)院計算機科學(xué)與技術(shù)系廈門理工學(xué)院計算機科學(xué)與技術(shù)系2022-7-62022-7-6教師教師: : 謝小竹謝小竹E-Mail: E-Mail: 廈門理工學(xué)院計算機科學(xué)與技術(shù)系2本章主要內(nèi)容本章主要內(nèi)容u3.1 3.1 算法算法u3.2 3.2 語句概述語句概述u3.3 3.3 順序結(jié)構(gòu)順序結(jié)構(gòu)u3.5 3.5 循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)u3.6 3.6 綜合例子綜合例子u3.4 3.4 選擇結(jié)構(gòu)選擇結(jié)構(gòu) 廈門理

2、工學(xué)院計算機科學(xué)與技術(shù)系0 0 循環(huán)的必要性循環(huán)的必要性int result1,result2,result3;int result4,result5;result1 = 1 * 10;printf(1 10 %d n,result1);result2 = 2 * 10;printf(2 10 %d n,result2);result3 = 3 * 10;printf(3 10 %d n,result3);result4 = 4 * 10;printf(4 10 %d n,result4);result5 = 5 * 10;printf(5 10 %d n,result5); 1 10 102

3、 10 203 10 304 10 405 10 50輸出結(jié)果重復(fù)語句 廈門理工學(xué)院計算機科學(xué)與技術(shù)系0 0 循環(huán)的必要性循環(huán)的必要性1 10 = 102 10 = 203 10 = 304 10 = 405 10 = 500 + 11 + 12 + 1上個數(shù)字 + 1.重復(fù) (上個數(shù)字 +1) 10 廈門理工學(xué)院計算機科學(xué)與技術(shù)系53.5 3.5 循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu) 循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)又稱又稱重復(fù)結(jié)構(gòu)重復(fù)結(jié)構(gòu),可用來完成重復(fù)性、規(guī)律,可用來完成重復(fù)性、規(guī)律性的操作。是結(jié)構(gòu)化程序設(shè)計的基本結(jié)構(gòu)之一,它和順性的操作。是結(jié)構(gòu)化程序設(shè)計的基本結(jié)構(gòu)之一,它和順序結(jié)構(gòu)、選擇結(jié)構(gòu)共同作為各種復(fù)雜程序的基本構(gòu)造

4、單序結(jié)構(gòu)、選擇結(jié)構(gòu)共同作為各種復(fù)雜程序的基本構(gòu)造單元。元。 循環(huán)結(jié)構(gòu)的循環(huán)結(jié)構(gòu)的特點特點是:在給定條件成立時,反復(fù)執(zhí)行是:在給定條件成立時,反復(fù)執(zhí)行某程序段,直到條件不成立為止。給定的條件稱為循環(huán)某程序段,直到條件不成立為止。給定的條件稱為循環(huán)條件,反復(fù)執(zhí)行的程序段稱為循環(huán)體。語言主要提供條件,反復(fù)執(zhí)行的程序段稱為循環(huán)體。語言主要提供了了whilewhile、do-whiledo-while和和forfor三種循環(huán)語句,來組成各種不同三種循環(huán)語句,來組成各種不同形式的循環(huán)結(jié)構(gòu)。形式的循環(huán)結(jié)構(gòu)。 廈門理工學(xué)院計算機科學(xué)與技術(shù)系C C 語言中的各種循環(huán)語言中的各種循環(huán)需要多次重復(fù)執(zhí)行一個或多個任務(wù)

5、的問題考慮使用 循環(huán)來解決 廈門理工學(xué)院計算機科學(xué)與技術(shù)系7 3.5.1 while 3.5.1 while語句語句whilewhile語句的一般形式為:語句的一般形式為: while (while (表達式表達式) ) 語句語句 其中表達式是循環(huán)條件,語句為循環(huán)體。其中表達式是循環(huán)條件,語句為循環(huán)體。 while while語句的語句的語義語義是:計算表達式的值,當值為真是:計算表達式的值,當值為真( (非非0)0)時,時,執(zhí)行循環(huán)體語句。其執(zhí)行過程如圖執(zhí)行循環(huán)體語句。其執(zhí)行過程如圖3-9(a)3-9(a)、(b)(b)所示。所示。 表表達達式式語語句句真真(非非0 )假假(0 )圖圖3 -

6、 9 (a ) wh i l e 語語句句 廈門理工學(xué)院計算機科學(xué)與技術(shù)系#includevoid main () int num=1,result; while (num=10) result=num*10; printf(%d 10 %d n,num,result); num+; while while 循環(huán)示例循環(huán)示例內(nèi)存內(nèi)存numresult1null102輸出:1 10 102 10 203 10 304 10 405 10 506 10 607 10 708 10 809 10 9010 10 10011100 廈門理工學(xué)院計算機科學(xué)與技術(shù)系 廈門理工學(xué)院計算機科學(xué)與技術(shù)系10例題

7、例題3-143-14例例3-14 3-14 用用whilewhile語句求語句求n!=1n!=1* *2 2* *3 3* * * *n n的值。的值。分析:這是一個累乘求積的問題,與累加求和類似。引入分析:這是一個累乘求積的問題,與累加求和類似。引入變量變量 facfac和和 i i 分別表示被乘數(shù)和乘數(shù),積也用變量分別表示被乘數(shù)和乘數(shù),積也用變量 fac fac 表表示,則求示,則求n!=1n!=1* *2 2* *3 3* * * *n n可以轉(zhuǎn)化為對語句:可以轉(zhuǎn)化為對語句: fac=facfac=fac* *i; i;的多次反復(fù)運行即可。令的多次反復(fù)運行即可。令facfac的初值為的初

8、值為1 1,并讓,并讓i i從從1 1變化到變化到n n,即可得到即可得到n!n!的值了。的值了。用傳統(tǒng)流程圖表示算法,如圖用傳統(tǒng)流程圖表示算法,如圖3-103-10所示:所示:開開 始始輸輸 入入 n 值值 i= 1 ,f a c = 1NYf a c = f a c * ii= i+ 1輸輸 出出 f a c 值值結(jié)結(jié) 束束圖圖 3 - 1 0 例例 3 - 1 4 算算 法法 描描 述述i = n#include #include main()main() int i=1, n; int i=1, n; / /* *定義定義i i和和n n變量,并為變量,并為i i賦初值賦初值* */

9、/ long int fac=1; long int fac=1; printf( printf(“ “Please input n:Please input n:” ”) ; ) ; scanf( scanf(“ “%d%d” ”, &n); , &n); / /* *輸入輸入n n值值* */ / while(i=n) while(i=n) / /* *先判斷后執(zhí)行,循環(huán)先判斷后執(zhí)行,循環(huán)n n次。本行為循環(huán)控制部分次。本行為循環(huán)控制部分* */ / fac=fac fac=fac* *i; i; / /* *做累乘運算做累乘運算* */ / i+; i+; / /* *累

10、乘次數(shù)計數(shù)器加累乘次數(shù)計數(shù)器加1 1。本行為循。本行為循環(huán)條件的修改語句環(huán)條件的修改語句* */ / printf(printf(“ “%ldn%ldn” ”, fac); , fac); 運行情況如下:運行情況如下:Please input n:6Please input n:6720720思考:若把循環(huán)體思考:若把循環(huán)體中的兩個語句中的兩個語句: :第第1010和和11 11行對調(diào),對結(jié)果行對調(diào),對結(jié)果有什么影響?若要有什么影響?若要保持原結(jié)果不變,保持原結(jié)果不變,應(yīng)把前面的程序段應(yīng)把前面的程序段作何修改作何修改? ? 廈門理工學(xué)院計算機科學(xué)與技術(shù)系11說明:說明:(1 1)從上例中可以看

11、出,一個循環(huán)的基本組成應(yīng)該有三大部分:從上例中可以看出,一個循環(huán)的基本組成應(yīng)該有三大部分: 循環(huán)的初始化部分循環(huán)的初始化部分:建立循環(huán)首次執(zhí)行所必需的條件,包括:建立循環(huán)首次執(zhí)行所必需的條件,包括循環(huán)操作中的初值和控制循環(huán)的初值兩部分。循環(huán)操作中的初值和控制循環(huán)的初值兩部分。 循環(huán)控制部分:循環(huán)控制部分:其核心為一個條件判斷。這個條件一般是關(guān)其核心為一個條件判斷。這個條件一般是關(guān)系表達或邏輯表達式,只要表達式的值為真系表達或邏輯表達式,只要表達式的值為真( (非非0)0)即表示條件成立,即表示條件成立,可繼續(xù)循環(huán)。可繼續(xù)循環(huán)。 循環(huán)體部分:循環(huán)體部分:循環(huán)中要反復(fù)執(zhí)行的操作,同時包括控制循環(huán)循

12、環(huán)中要反復(fù)執(zhí)行的操作,同時包括控制循環(huán)條件的修改語句,以保證循環(huán)正常結(jié)束,避免出現(xiàn)死循環(huán)(若把第條件的修改語句,以保證循環(huán)正常結(jié)束,避免出現(xiàn)死循環(huán)(若把第1 10 0行行i+;i+;去掉,則出現(xiàn)死循環(huán),此時只能按去掉,則出現(xiàn)死循環(huán),此時只能按Ctrl+BreakCtrl+Break組合鍵終止程組合鍵終止程序運行)。序運行)。(2 2)注意到初始化部分中第注意到初始化部分中第5 5行:行:long int fac=1 long int fac=1 中的中的fac fac 的若定義為的若定義為整型整型intint,則可能出現(xiàn)數(shù)據(jù)溢出現(xiàn)象,因為整型,則可能出現(xiàn)數(shù)據(jù)溢出現(xiàn)象,因為整型intint的取值

13、范圍為的取值范圍為-327-32768683276732767。當然如果定義為。當然如果定義為long intlong int仍有可能出現(xiàn)數(shù)據(jù)溢出現(xiàn)象,仍有可能出現(xiàn)數(shù)據(jù)溢出現(xiàn)象,還可以定義其數(shù)據(jù)類型為還可以定義其數(shù)據(jù)類型為float,float,甚至為甚至為 doubledouble。另外,因為。另外,因為facfac充當充當累乘器,一般初始化為累乘器,一般初始化為1 1,而累加器,一般初始化為,而累加器,一般初始化為0 0。 廈門理工學(xué)院計算機科學(xué)與技術(shù)系12說明:說明: (3 3)whilewhile語句的特點是先判斷表達式,后執(zhí)行語句。語句的特點是先判斷表達式,后執(zhí)行語句。即先計算表達式

14、的值,當值為真即先計算表達式的值,當值為真( (非非0)0)時,執(zhí)行循環(huán)體語時,執(zhí)行循環(huán)體語句。因此如果表達式的值一開始就為句。因此如果表達式的值一開始就為“假假”,循環(huán)體一次,循環(huán)體一次也不執(zhí)行。也不執(zhí)行。 (4 4)循環(huán)體如果包括有一個以上的語句,則必須用循環(huán)體如果包括有一個以上的語句,則必須用 括起來,組成復(fù)合語句。括起來,組成復(fù)合語句。 請大家在請大家在 例例3-143-14的基礎(chǔ)上完成下列各題:的基礎(chǔ)上完成下列各題: (1 1)求)求1 1* *3 3* *5 5* *7 7* * * *(2n+1)(2n+1) (2 2)求)求1!+2!+3!+ 1!+2!+3!+ +n! +n!

15、 (3 3)求)求1!+3!+5!+ 1!+3!+5!+ +(2n+1)! +(2n+1)! 廈門理工學(xué)院計算機科學(xué)與技術(shù)系13例題例題3-153-15 例例3-15 3-15 角度的余弦值可以利用下面的無窮級數(shù)計角度的余弦值可以利用下面的無窮級數(shù)計算出來:算出來: cos(x)1-x cos(x)1-x2 2/2!+x/2!+x4 4/4!-x/4!-x6 6/6!+x/6!+x8 8/8!-/8!- 編程序從鍵盤讀取一個角度編程序從鍵盤讀取一個角度x x(單位為弧度)計算(單位為弧度)計算cos(x)cos(x)的近似值,直到最后一項的絕對值小于的近似值,直到最后一項的絕對值小于10-51

16、0-5為止。為止。 分析:通過觀察,我們可把此級數(shù)看成是對若干分析:通過觀察,我們可把此級數(shù)看成是對若干項的累加求和,其中每一項由符號、分子和分母組成。項的累加求和,其中每一項由符號、分子和分母組成。因此編程的基本思想是:不斷求級數(shù)的部分和,直到因此編程的基本思想是:不斷求級數(shù)的部分和,直到后面準備加進去的項的絕對值小于后面準備加進去的項的絕對值小于1e-51e-5為止,否則加為止,否則加進去后計算下一項。進去后計算下一項。#include #include / /* *包含使用數(shù)學(xué)庫函數(shù)所對應(yīng)的頭文件包含使用數(shù)學(xué)庫函數(shù)所對應(yīng)的頭文件* */ /#include #include main()

17、main() float a=1.0,b=1.0,x,term=1.0,s=0.0; float a=1.0,b=1.0,x,term=1.0,s=0.0; / /* *a a、b b、termterm分別代表分子、分母及某一項分別代表分子、分母及某一項* */ / int m=2,sign=1; int m=2,sign=1; / /* *signsign代表符號代表符號* */ / printf(Please input the value of x:); printf(Please input the value of x:); scanf(%f,&x); scanf(%f,&a

18、mp;x); / /* *角度角度x x的單位為弧度的單位為弧度* */ / while(fabs(term)=1e-5) while(fabs(term)=1e-5) s=s+term; s=s+term; sign=-sign; sign=-sign; a=a a=a* *x x* *x;x; b=b b=b* *mm* *(m-1);(m-1); term=sign term=sign* *a/b;a/b; m=m+2; m=m+2; printf(cos(%f)=%fn,x,s); printf(cos(%f)=%fn,x,s); 運行結(jié)果如下:運行結(jié)果如下:Please input

19、the value of x:0Please input the value of x:0cos(0.000000)=1.000000cos(0.000000)=1.000000Please input the value of x:3.141593Please input the value of x:3.141593cos(3.141593)=-1.000004cos(3.141593)=-1.000004Please input the value of x:1.570796Please input the value of x:1.570796cos(1.570796)=-0.0000

20、00cos(1.570796)=-0.000000 思考:思考:(1)(1)分母分母b b是否可以定義為是否可以定義為intint類型?(類型?(2 2)循環(huán)中語句)循環(huán)中語句s=s+term;s=s+term;能否移到語句能否移到語句 term=signterm=sign* *a/b;a/b;的后面。的后面。說明:本例的上述解法具有一般性,即適用于類似的級數(shù)求和問題。說明:本例的上述解法具有一般性,即適用于類似的級數(shù)求和問題。但本例比較特殊:后一項與前一項的比為一個與項數(shù)但本例比較特殊:后一項與前一項的比為一個與項數(shù)i i有關(guān)的數(shù)據(jù)有關(guān)的數(shù)據(jù) (-1)(-1)* *x x* *x/(2x/(

21、2* *i-1)/(2i-1)/(2* *i) i),這樣在求出前一項的基礎(chǔ)上可以很容易地推導(dǎo)出后,這樣在求出前一項的基礎(chǔ)上可以很容易地推導(dǎo)出后一項。本例的第二種解法代碼如下:一項。本例的第二種解法代碼如下:#include #include #include #include main()main() float s=0.0, term=1.0, x; float s=0.0, term=1.0, x; int i=1; int i=1; printf(Please input the value of x:); printf(Please input the value of x:); s

22、canf(%f, &x); scanf(%f, &x); while(fabs(term)=1e-5) while(fabs(term)=1e-5) s+=term; s+=term; term=term term=term* *(-1)(-1)* *x x* *x/(2x/(2* *i-1)/(2i-1)/(2* *i);i); i+; i+; printf(cos(%f)=%fn, x, s); printf(cos(%f)=%fn, x, s); 廈門理工學(xué)院計算機科學(xué)與技術(shù)系14例題例題3-163-16 例例3-16 3-16 將從鍵盤輸入的一串字符(用將從鍵盤輸入的一

23、串字符(用# #結(jié)束輸入)按結(jié)束輸入)按如下規(guī)則進行轉(zhuǎn)換:如下規(guī)則進行轉(zhuǎn)換: (1 1)如果輸入的字符為大寫字母,則先轉(zhuǎn)換為對應(yīng))如果輸入的字符為大寫字母,則先轉(zhuǎn)換為對應(yīng)的小寫字母。的小寫字母。 (2 2)將)將a a轉(zhuǎn)換為轉(zhuǎn)換為c c、b b轉(zhuǎn)換為轉(zhuǎn)換為d d、x x轉(zhuǎn)換為轉(zhuǎn)換為z z、y y轉(zhuǎn)換轉(zhuǎn)換為為a a、z z轉(zhuǎn)換為轉(zhuǎn)換為b b。 (3 3)其他字符不轉(zhuǎn)換。)其他字符不轉(zhuǎn)換。 分析:用語句分析:用語句“if( ch=if( ch= A A & ch=& ch= a a & ch=& ch= z z ) ch=ch+2;) ch=ch+2;” ”可將大寫

24、字母轉(zhuǎn)換為其后可將大寫字母轉(zhuǎn)換為其后第第2 2個字母;對字母個字母;對字母y y和和z z通過通過“ch=ch+2;ch=ch+2;” ”后,其后,其ASCIIASCII碼碼已超出小寫字母的取值范圍,因此必須在此基礎(chǔ)上再減已超出小寫字母的取值范圍,因此必須在此基礎(chǔ)上再減去去2626才能得到才能得到a a和和b b 。源程序如下:源程序如下:#include #include main()main() char ch; char ch; printf(Input data:); printf(Input data:); ch=getchar();ch=getchar(); while(ch!=#

25、) while(ch!=#) if (ch=A & ch=A & ch=a & ch=a & chz) ch=ch-26; if (chz) ch=ch-26; / /* *處理對處理對y y 和和z z 加后超范圍的情況加后超范圍的情況* */ / putchar(ch);putchar(ch); ch=getchar(); ch=getchar(); 運行結(jié)果如下:運行結(jié)果如下:Input data:UfYrq 2 yLb 3?#Input data:UfYrq 2 yLb 3?#whats 2 and 3?whats 2 and 3?說明:說明:(1 1)

26、程序中的第)程序中的第6 6、7 7、1616行可以行可以用用while(ch=getchar( )!=while(ch=getchar( )!= # # ) )來來代替放在原來第代替放在原來第6 6行的位置,其行的位置,其他保持不變。注意上面式子中他保持不變。注意上面式子中chch=getchar( )=getchar( )必須在兩邊加上圓括必須在兩邊加上圓括號。號。(2 2)本例屬于解密碼的問題,)本例屬于解密碼的問題,即將原來的字符串按照一定的規(guī)即將原來的字符串按照一定的規(guī)則轉(zhuǎn)換后能夠閱讀。則轉(zhuǎn)換后能夠閱讀。 廈門理工學(xué)院計算機科學(xué)與技術(shù)系 (1) (1) 如果如果whilewhile后

27、的表達式的值一開始就為假,循環(huán)體后的表達式的值一開始就為假,循環(huán)體將一次也不執(zhí)行。將一次也不執(zhí)行。 (2) (2) 循環(huán)體中的語句可為任意類型的循環(huán)體中的語句可為任意類型的C C語句。語句。 (3) (3) 遇到下列情況,退出遇到下列情況,退出whilewhile循環(huán):循環(huán): 表達式為假(為表達式為假(為0 0)。)。 循環(huán)體內(nèi)遇到循環(huán)體內(nèi)遇到breakbreak、returnreturn語句。語句。 廈門理工學(xué)院計算機科學(xué)與技術(shù)系 廈門理工學(xué)院計算機科學(xué)與技術(shù)系173.5.2 do-while3.5.2 do-while語句語句 do-while do-while語句的一般形式為語句的一般形

28、式為: : do do 循環(huán)體語句循環(huán)體語句 while( while(表達式表達式); ); 這個循環(huán)與這個循環(huán)與whilewhile循環(huán)的不同循環(huán)的不同在于在于: :它先執(zhí)行循環(huán)中的語句它先執(zhí)行循環(huán)中的語句, ,然后然后再判斷表達式是否為真再判斷表達式是否為真, , 如果為真如果為真則繼續(xù)循環(huán);如果為假則繼續(xù)循環(huán);如果為假, , 則終止循則終止循環(huán)。環(huán)。因此因此, do-while, do-while循環(huán)至少要執(zhí)循環(huán)至少要執(zhí)行一次循環(huán)語句。其執(zhí)行過程可用行一次循環(huán)語句。其執(zhí)行過程可用圖圖3-113-11(a a)、)、(b)(b)表示。表示。語語 句句真真 ( 非非 0 )假假 ( 0 )

29、圖圖 3 -1 1 ( a )d o -w h ile 語語 句句表表 達達 式式 廈門理工學(xué)院計算機科學(xué)與技術(shù)系 廈門理工學(xué)院計算機科學(xué)與技術(shù)系19例題例題3-17 3-17 do-whiledo-while語句求語句求n!=1n!=1* *2 2* *3 3* * * *n n的值。的值。用傳統(tǒng)流程圖表示算法,見圖用傳統(tǒng)流程圖表示算法,見圖3-123-12。源程序如下:源程序如下:#include #include main()main() int i=1,n; int i=1,n; / /* *定義定義i i和和n n變量,并為變量,并為i i賦初值賦初值1 1* */ / long i

30、nt fac=1; long int fac=1; / /* *因階乘值取值范圍較大,故因階乘值取值范圍較大,故facfac定定義為長整型,并賦初值義為長整型,并賦初值1 1 * */ / printf(Please input n:); printf(Please input n:); scanf(%d, &n); scanf(%d, &n); / /* *輸入輸入n n值值* */ / do do fac=fac fac=fac* *i; i; / /* *做累乘運算做累乘運算* */ / i+; i+; / /* *累乘次數(shù)計數(shù)器加累乘次數(shù)計數(shù)器加1 1 * */ / w

31、hile(i=n); while(i=n); / /* *先判斷后執(zhí)行,循環(huán)先判斷后執(zhí)行,循環(huán)n n次次* */ / printf(%ldn, fac); printf(%ldn, fac);開開 始始輸輸 入入 n 值值 i= 1 ,fa c = 1NYfa c = fa c * ii= i+ 1輸輸 出出 fa c 值值結(jié)結(jié) 束束圖圖 3 -1 2 例例 3 -1 7 算算 法法 描描 述述i = n 廈門理工學(xué)院計算機科學(xué)與技術(shù)系20說明:說明: (1 1)whilewhile后的分號后的分號“;”不能少。不能少。 (2 2)當循環(huán)體只有一個語句時,花括當循環(huán)體只有一個語句時,花括號號“

32、 ” ”可以省略,但為了避免與可以省略,但為了避免與whilewhile語語句混淆,建議保留。句混淆,建議保留。 (3 3)上述問題既可以用上述問題既可以用whilewhile語句處理,語句處理,也可以用也可以用do-whiledo-while語句處理。并且在兩種語句處理。并且在兩種語句中其組成循環(huán)結(jié)構(gòu)的三個部分相同,語句中其組成循環(huán)結(jié)構(gòu)的三個部分相同,得到的結(jié)果也相同,可以認為對上述問題得到的結(jié)果也相同,可以認為對上述問題whilewhile語句與語句與do-whiledo-while語句是完全等價的。語句是完全等價的。其實其實do-whiledo-while結(jié)構(gòu)是由一個語句加一個結(jié)構(gòu)是由一

33、個語句加一個whiwhile le結(jié)構(gòu)構(gòu)成的。見流程圖結(jié)構(gòu)構(gòu)成的。見流程圖3-133-13,其中虛線框,其中虛線框部分就是一個部分就是一個whilewhile結(jié)構(gòu)。結(jié)構(gòu)。表表達達式式語語句句真真(非非0)假假(0)圖圖 3-13 do-while結(jié)結(jié)構(gòu)構(gòu)語語句句 這是不是意味著在任何情況下兩者都是等價的?這是不是意味著在任何情況下兩者都是等價的?除了下除了下列這種特殊情況之外的其他情況是等價的,即當兩種語句在列這種特殊情況之外的其他情況是等價的,即當兩種語句在第一次進入循環(huán)時條件就不滿足的特殊情況下是不等價的。第一次進入循環(huán)時條件就不滿足的特殊情況下是不等價的。如下列兩個程序段是不等價的:如下

34、列兩個程序段是不等價的:程序段程序段1:k=11;while(k=10) printf(“k=%d”, k);程序段程序段2:k=11;do printf(“k=%d”, k);while(k=10); 廈門理工學(xué)院計算機科學(xué)與技術(shù)系比較比較 while while 和和 do-whiledo-while循環(huán)循環(huán)while(循環(huán)條件) 循環(huán)體;do 循環(huán)體; while( 循環(huán)條件);do-while 循環(huán)是先執(zhí)行循環(huán)是先執(zhí)行后判斷,所以,即使開后判斷,所以,即使開始條件為假,循環(huán)體也始條件為假,循環(huán)體也至少會被執(zhí)行一次。至少會被執(zhí)行一次。while循環(huán)是先判斷循環(huán)是先判斷后執(zhí)行,所以,如果后

35、執(zhí)行,所以,如果條件為假,則循環(huán)體條件為假,則循環(huán)體一次也不會被執(zhí)行。一次也不會被執(zhí)行。q 比較 while 和 do-while 循環(huán)的工作原理 廈門理工學(xué)院計算機科學(xué)與技術(shù)系22例題例題3-183-18 例例3-18 3-18 不斷輸入三角形的三邊長,求三角形面不斷輸入三角形的三邊長,求三角形面積積, ,直到用戶按直到用戶按Y Y 或或y y 鍵程序結(jié)束。鍵程序結(jié)束。 分析:本例中要不斷輸入多組線段進行處理,這分析:本例中要不斷輸入多組線段進行處理,這是一個重復(fù)操作問題,可考慮使用循環(huán)結(jié)構(gòu)。并且可是一個重復(fù)操作問題,可考慮使用循環(huán)結(jié)構(gòu)。并且可以先讓用戶輸入第一組數(shù)據(jù)進行處理,然后再由用戶以

36、先讓用戶輸入第一組數(shù)據(jù)進行處理,然后再由用戶來決定是否要繼續(xù)輸入下一組數(shù)據(jù),因此本題采用來決定是否要繼續(xù)輸入下一組數(shù)據(jù),因此本題采用do-do-whilewhile語句來編程。語句來編程。源程序如下:源程序如下:#include #include #include #include #include #include #include #include main( )main( ) double a, b, c, s, area; double a, b, c, s, area; do do printf(Please input a,b,c:); printf(Please input a,

37、b,c:); scanf(%lf, %lf, %lf, &a, &b, &c); scanf(%lf, %lf, %lf, &a, &b, &c); if(a+bc & a+cb & b+ca) if(a+bc & a+cb & b+ca) s=1.0/2 s=1.0/2* *(a+b+c);(a+b+c); area=sqrt(s area=sqrt(s* *(s-a)(s-a)* *(s-b)(s-b)* *(s-c);(s-c); printf(area=%7.2lfn, area); printf(area

38、=%7.2lfn, area); else printf(it is not a trilateraln else printf(it is not a trilateraln” ”); ); printf( printf(按按Y Y 或或y y 鍵退出鍵退出, ,按其它鍵繼續(xù)按其它鍵繼續(xù)n);n); while(toupper(getch( )!=Y); while(toupper(getch( )!=Y); 運行結(jié)果如下:運行結(jié)果如下:Please input a,b,c:3,4,5Please input a,b,c:3,4,5area= 6.00area= 6.00按按Y Y 或或y

39、y 鍵退出鍵退出, ,按其它鍵繼按其它鍵繼續(xù)續(xù) (設(shè)按(設(shè)按n n 鍵鍵, ,繼續(xù)下列操作)繼續(xù)下列操作)Please input a,b,c:1,2,3Please input a,b,c:1,2,3it is not a trilateralit is not a trilateral按按Y Y 或或y y 鍵退出鍵退出, ,按其它鍵繼按其它鍵繼續(xù)續(xù) (設(shè)按(設(shè)按y y 鍵,則退出程序)鍵,則退出程序)思考:思考:while(toupper(getch( )!=while(toupper(getch( )!=Y);Y);中的中的getch( ) getch( ) 若改為若改為getchar

40、( ),getchar( ),運行結(jié)果如何運行結(jié)果如何? ? 為什么?為什么? 說明:說明: (1 1)toupper(getch( ) toupper(getch( ) 函數(shù)調(diào)用的作用是將函數(shù)調(diào)用的作用是將getch( ) getch( ) 函數(shù)函數(shù)從鍵盤上獲得的字符轉(zhuǎn)化為大寫字母。從鍵盤上獲得的字符轉(zhuǎn)化為大寫字母。 它的等價為:它的等價為:getch( )!=Y& getch( )!= ygetch( )!=Y& getch( )!= y 。 (2 2)getch( )getch( )、getche( )getche( )和和getchar( )getchar( )三者雖然

41、都需從鍵盤三者雖然都需從鍵盤輸入字符,但是輸入方式有所不同。輸入字符,但是輸入方式有所不同。 在在getchar( )getchar( )的原始形式中,輸入字符先被放到緩沖隊列中,的原始形式中,輸入字符先被放到緩沖隊列中,直到鍵入回車鍵時才返回。直到鍵入回車鍵時才返回。 getche( ) getche( ) 函數(shù)和函數(shù)和getch( )getch( )函數(shù)的共同點是每次按鍵后字符函數(shù)的共同點是每次按鍵后字符被立即送往程序并立即輸出相應(yīng)的結(jié)果,不再需要行緩沖。被立即送往程序并立即輸出相應(yīng)的結(jié)果,不再需要行緩沖。不同的是在接收字符時,不同的是在接收字符時,getch( )getch( )函數(shù)在屏

42、幕上不回顯鍵入的函數(shù)在屏幕上不回顯鍵入的字符,而字符,而getche( ) getche( ) 函數(shù)向屏幕回顯鍵入的字符。函數(shù)向屏幕回顯鍵入的字符。 在交互式程序中,當需要從鍵盤輸入字符時,常用在交互式程序中,當需要從鍵盤輸入字符時,常用getch( ) getch( ) 或或getche( )getche( )來代替來代替getchar( )getchar( )進行字符輸入。進行字符輸入。 廈門理工學(xué)院計算機科學(xué)與技術(shù)系23 3.5.3 for 3.5.3 for語句語句 在在C C語言中,還提供了更為靈活、更為常用的語言中,還提供了更為靈活、更為常用的forfor語句,不僅可以用于循環(huán)次數(shù)

43、已經(jīng)確定的情況,語句,不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,而且可以用于循環(huán)次數(shù)不確定而只給出循環(huán)結(jié)束而且可以用于循環(huán)次數(shù)不確定而只給出循環(huán)結(jié)束條件的情況,它完全可以取代條件的情況,它完全可以取代 while while 語句。它的語句。它的一般形式為一般形式為: : for for(表達式(表達式1 1;表達式;表達式2 2;表達式;表達式3 3) 語句語句 它的執(zhí)行過程如下:它的執(zhí)行過程如下: 先求解表達式先求解表達式1 1。 求解表達式求解表達式2 2,若其值為真(非,若其值為真(非0 0),則執(zhí)行),則執(zhí)行fofor r語句中指定的內(nèi)嵌語句,然后執(zhí)行第步;若語句中指定的內(nèi)嵌語句,然后執(zhí)行

44、第步;若其值為假(其值為假(0 0),則結(jié)束循環(huán),執(zhí)行),則結(jié)束循環(huán),執(zhí)行forfor語句下面語句下面的一個語句。的一個語句。 解表達式解表達式3,3,轉(zhuǎn)回上面第步繼續(xù)執(zhí)行。轉(zhuǎn)回上面第步繼續(xù)執(zhí)行。 其執(zhí)行過程可用圖其執(zhí)行過程可用圖3-143-14表示。表示。語語句句真真假假圖圖3-14 for語語句句執(zhí)執(zhí)行行過過程程求求解解表表達達式式1表表達達式式2求求解解表表達達式式3for語語句句的的下下一一個個語語句句 從從forfor語句的執(zhí)行過程可以看出,語句的執(zhí)行過程可以看出,forfor語句與語句與whilewhile語句是完全等價的,對于語句是完全等價的,對于forfor循環(huán)中語句的一般形式

45、,循環(huán)中語句的一般形式,就是如下的就是如下的whilewhile循環(huán)形式:循環(huán)形式: 表達式表達式1 1; whilewhile(表達式(表達式2 2) 語句;語句; 表達式表達式3 3; for for語句最簡單的應(yīng)用形式也是最容易理解的形語句最簡單的應(yīng)用形式也是最容易理解的形式如下:式如下: for for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值)(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值) 語句語句 #include #include main()main() int i=1, n; int i=1, n; / /* *定義定義i i和和n n變量,并為變量,并為i i賦初值賦初值* */

46、 / long int fac=1; long int fac=1; printf( printf(“ “Please input n:Please input n:” ”) ; ) ; scanf( scanf(“ “%d%d” ”, &n); , &n); / /* *輸入輸入n n值值* */ / while(i=n) while(i=n) / /* *先判斷后執(zhí)行,循環(huán)先判斷后執(zhí)行,循環(huán)n n次。本行為循環(huán)控制部分次。本行為循環(huán)控制部分* */ / fac=fac fac=fac* *i; i; / /* *做累乘運算做累乘運算* */ / i+; i+; / /* *

47、累乘次數(shù)計數(shù)器加累乘次數(shù)計數(shù)器加1 1。本行為循。本行為循環(huán)條件的修改語句環(huán)條件的修改語句* */ / printf(printf(“ “%ldn%ldn” ”, fac); , fac); 廈門理工學(xué)院計算機科學(xué)與技術(shù)系24例題例題3-193-19用用forfor語句求語句求n!=1n!=1* *2 2* *3 3* * * *n n的值的值#include #include main( )main( ) int i, n; int i, n; / /* *定義定義i i和和n n變量變量* */ / long int fac=1; long int fac=1; printf( print

48、f(“ “Please input n:Please input n:” ”) ) scanf( scanf(“ “%d%d” ”, &n); , &n); / /* *輸入輸入n n值值* */ / for(i=1; i=n; i+) for(i=1; i=n; i+) / /* *先判斷后執(zhí)行,循環(huán)先判斷后執(zhí)行,循環(huán)n n次次* */ / fac=fac fac=fac* *i; i; / /* *做累乘運算做累乘運算* */ / printf(%ldn, fac); printf(%ldn, fac); / /* *以長整型格式輸出以長整型格式輸出n n的階乘值的階乘值*

49、 */ / 廈門理工學(xué)院計算機科學(xué)與技術(shù)系25forfor語句的使用說明語句的使用說明(1 1)在)在forfor語句中任何表達式都可以缺省語句中任何表達式都可以缺省, ,但分號但分號“;”不能不能缺省。缺省部分的功能,可以由其他的語句來完成。缺省。缺省部分的功能,可以由其他的語句來完成。 用前面例子的用前面例子的forfor語句:語句: for(fac=1,i=1 for(fac=1,i=1;i=ni=n;i+) fac=faci+) fac=fac* *i i; 為例,說明如下幾種等價的缺省形式;為例,說明如下幾種等價的缺省形式; 省略了初始化表達式省略了初始化表達式, ,表示在表示在fo

50、rfor語句中不對循環(huán)控語句中不對循環(huán)控制變量賦初值??筛膶憺椋褐谱兞抠x初值。可改寫為: fac=1 fac=1;i=1i=1; for( for(;i=ni=n;i+) fac=faci+) fac=fac* *i i; (2 2)表達式)表達式1 1和表達式和表達式3 3既可以是一個簡單表達式也可以既可以是一個簡單表達式也可以是逗號表達式。是逗號表達式。for(i=0,j=100for(i=0,j=100;i=100i=100;i+,j-) k=i+ji+,j-) k=i+j; (3 3)表達式)表達式2 2一般是關(guān)系表達式或邏輯表達式,但也可一般是關(guān)系表達式或邏輯表達式,但也可以是數(shù)值表

51、達式或以是數(shù)值表達式或 字符表達式,只要其值非零,就執(zhí)行循環(huán)體。字符表達式,只要其值非零,就執(zhí)行循環(huán)體。 例如:例如:for(i=0for(i=0;(c=getchar( )!=(c=getchar( )!= nn ;i+=c)i+=c); 又如:又如:for(for(;(c=getchar( )!=(c=getchar( )!= nn ;) )printf(printf(“ “%c%c” ”,c),c); (4 4)循環(huán)體語句可以為空語句,此時也稱為空循環(huán)。如把)循環(huán)體語句可以為空語句,此時也稱為空循環(huán)。如把上面第(上面第(1 1)點中的)點中的forfor語句改為:語句改為: for(fa

52、c=1,i=1 for(fac=1,i=1;i=ni=n;fac=facfac=fac* *i i,i+)i+); 空循環(huán)還常用來產(chǎn)生延時,以達到某種特定要求??昭h(huán)還常用來產(chǎn)生延時,以達到某種特定要求。如:如:for (t=0;ttime;t+); for (t=0;tn) break if (in) break; / /* *用用breakbreak來強迫退出循環(huán)來強迫退出循環(huán)* */ / fac=fac fac=fac* *i i; 省略了變量增值表達式,則不對循環(huán)控制變量進行操作。省略了變量增值表達式,則不對循環(huán)控制變量進行操作。可改寫為:可改寫為: for(fac=1,i=1 for

53、(fac=1,i=1;i=n i=3) Fn=Fn-1+Fn-2 (n=3) 法一法一:根據(jù)斐波納契數(shù)列的規(guī)律,可以畫出如圖:根據(jù)斐波納契數(shù)列的規(guī)律,可以畫出如圖3-153-15的求解的求解過程:過程: 這是一種遞推算法,應(yīng)采用循環(huán)實現(xiàn)。設(shè)變量這是一種遞推算法,應(yīng)采用循環(huán)實現(xiàn)。設(shè)變量f1 f1、f2f2和和f f,并為,并為f1 f1和和f2f2賦初值賦初值1 1,令,令f=f1+f2f=f1+f2得到第得到第3 3項;將項;將f1f2f1f2, f2ff2f,再求,再求f=f1f=f1+f2+f2得到第得到第4 4項;依此類推求第項;依此類推求第5 5項、第項、第6 6項項,程序流程圖如圖,

54、程序流程圖如圖3-3-1616所示。所示。#include #include #include #include main()main() long int f,f1,f2;long int f,f1,f2;int i;int i;clrscr( ); clrscr( ); / /* *清屏函數(shù)清屏函數(shù)* */ /f1=f2=1;f1=f2=1;printf(%12ld%12ld, f1, f2);printf(%12ld%12ld, f1, f2);for (i=3; i=40; i+)for (i=3; i=40; i+) f=f1+f2; f=f1+f2; f1=f2; f1=f2; f

55、2=f; f2=f; printf(%12ld, f); printf(%12ld, f); if (i%4=0) printf(n) if (i%4=0) printf(n) / /* *控制一行輸出控制一行輸出4 4個數(shù)個數(shù)* */ / 廈門理工學(xué)院計算機科學(xué)與技術(shù)系27方法二:方法二:法二:根據(jù)斐波納契數(shù)列的規(guī)律,還可以畫出如圖法二:根據(jù)斐波納契數(shù)列的規(guī)律,還可以畫出如圖3-173-17的求解過程:的求解過程:源程序如下:源程序如下:#include #include main()main() long int f1, f2; long int f1, f2; int i; int i;

56、 clrscr( ); clrscr( ); f1=f2=1; f1=f2=1; for(i=1; i=20; i+) for(i=1; i=20; i+) / /* * 每循環(huán)一次輸出每循環(huán)一次輸出2 2個數(shù),共需循環(huán)個數(shù),共需循環(huán)2020次次* */ / printf(%12ld %12ld , f1, f2); printf(%12ld %12ld , f1, f2); if (i%2=0) printf(n); if (i%2=0) printf(n); f1=f1+f2; f1=f1+f2; f2=f2+f1; f2=f2+f1; 運行結(jié)果為運行結(jié)果為: : 1 1 2 3 1 1

57、2 3 5 8 13 21 5 8 13 21 34 55 89 144 34 55 89 144 233 377 610 987 233 377 610 987 1597 2584 4181 6765 1597 2584 4181 6765 10946 17711 28657 46368 10946 17711 28657 46368 75025 121393 196418 317811 75025 121393 196418 317811 514229 832040 1346269 2178309 514229 832040 1346269 2178309 3524578 5702887

58、9227465 14930352 3524578 5702887 9227465 14930352 24157817 39088169 63245986 10233415 24157817 39088169 63245986 102334155 5 廈門理工學(xué)院計算機科學(xué)與技術(shù)系 forfor語句注意事項:語句注意事項: (1) (1) 表達式表達式1 1、表達式、表達式2 2、和表達式、和表達式3 3可以是任何類型可以是任何類型的表達式。比方說,這三個表達式都可以是逗號表達式,的表達式。比方說,這三個表達式都可以是逗號表達式,即每個表達式都可由多個表達式組成。即每個表達式都可由多個表達式組成

59、。 廈門理工學(xué)院計算機科學(xué)與技術(shù)系 (2) (2) 表達式表達式1 1、表達式、表達式2 2、和表達式、和表達式3 3都是任都是任選項,可以省掉其中的一個、兩個或全部,但選項,可以省掉其中的一個、兩個或全部,但其用于間隔的分號是一個也不能省的。其用于間隔的分號是一個也不能省的。 廈門理工學(xué)院計算機科學(xué)與技術(shù)系 (3) (3) 表達式表達式2 2如果為空則相當于表達式如果為空則相當于表達式2 2的值是真的值是真 。 (4) (4) 循環(huán)體中的語句可為任意類型的循環(huán)體中的語句可為任意類型的C C語句。語句。 (5) for(5) for語句也可以組成多重循環(huán),而且也可以和語句也可以組成多重循環(huán),而

60、且也可以和whilewhile語句和語句和do-whiledo-while語句相互嵌套。語句相互嵌套。 (6) (6) 循環(huán)體可以是空語句。循環(huán)體可以是空語句。例:計算用戶輸入的字符數(shù)(當輸入是回車例:計算用戶輸入的字符數(shù)(當輸入是回車符時統(tǒng)計結(jié)束符時統(tǒng)計結(jié)束) )。 表示循環(huán)體為空語表示循環(huán)體為空語句,并非表示句,并非表示forfor語語句結(jié)束句結(jié)束 廈門理工學(xué)院計算機科學(xué)與技術(shù)系31 3.5.4 3.5.4 循環(huán)的嵌套循環(huán)的嵌套 一個循環(huán)體內(nèi)又包含另一個完整的循環(huán)結(jié)構(gòu),稱為循一個循環(huán)體內(nèi)又包含另一個完整的循環(huán)結(jié)構(gòu),稱為循環(huán)的嵌套。內(nèi)嵌的循環(huán)中還可以嵌套。環(huán)的嵌套。內(nèi)嵌的循環(huán)中還可以嵌套。三種循環(huán)(三種循環(huán)(whi1ewhi1e循環(huán)、循環(huán)、do-whi1edo-whi1e循環(huán)和循環(huán)和forfor循環(huán))可以互相嵌套。循環(huán))可以互相嵌套。利用循利用循環(huán)的嵌套可以來解決相對比較復(fù)雜的問題,如矩陣的運算,環(huán)的嵌套可以來解決相

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論