

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第7章 函數(shù),C語(yǔ)言程序設(shè)計(jì),本章學(xué)習(xí)內(nèi)容,? 函數(shù)定義、函數(shù)調(diào)用、函數(shù)原型、函數(shù)的參數(shù)傳遞與返回值? 遞歸函數(shù)和函數(shù)的遞歸調(diào)用? 函數(shù)封裝,函數(shù)復(fù)用,函數(shù)設(shè)計(jì)的基本原則,程序的健壯性? 變量的作用域與存儲(chǔ)類(lèi)型,全局變量、自動(dòng)變量、靜態(tài)變量、寄存器變量? “自頂向下、逐步求精”的模塊化程序設(shè)計(jì)方法,數(shù)學(xué)中的函數(shù),自變量,因變量,函數(shù)名,程序設(shè)計(jì)中的函數(shù),程序設(shè)計(jì)中的函數(shù)不局限于計(jì)算計(jì)算類(lèi),如打印階乘表的程序……判斷
2、推理類(lèi),如排序、查找……,問(wèn)題的提出,讀多少行的程序能讓你不頭疼?假如系統(tǒng)提供的函數(shù)printf()由10行代碼替換,那么你編過(guò)的程序會(huì)成什么樣子?實(shí)際上一個(gè)printf()有上千行代碼main()中能放多少行代碼?如果所有代碼都在main()中,怎么團(tuán)隊(duì)合作?如果代碼都在一個(gè)文件中,怎么團(tuán)隊(duì)合作?,問(wèn)題的提出,《三國(guó)演義》中有這樣一段描寫(xiě):懿問(wèn)曰:“孔明寢食及事之煩簡(jiǎn)若何?”使者曰:“丞相夙興夜寐,罰二十以上皆親覽焉。所啖
3、之食,日不過(guò)數(shù)升。”懿顧謂諸將曰:“孔明食少事煩,其能久乎?”此話音落不久,諸葛亮果然病故于五丈原。“事無(wú)巨細(xì)”,“事必躬親” 管理學(xué)的觀點(diǎn)是極其排斥這種做法的,認(rèn)為工作必須分工,各司其職其中的思想,在程序設(shè)計(jì)里也適用,7.1分而治之與信息隱藏,分而治之( Divide and Conquer,Wirth, 1971 )函數(shù)把較大的任務(wù)分解成若干個(gè)較小的任務(wù),并提煉出公用任務(wù)信息隱藏(Information Hiding,
4、 Parnas, 1972)設(shè)計(jì)得當(dāng)?shù)暮瘮?shù)可把具體操作細(xì)節(jié)對(duì)外界隱藏起來(lái),從而使整個(gè)程序結(jié)構(gòu)清楚使用函數(shù)時(shí),不用知道函數(shù)內(nèi)部是如何運(yùn)作的,只按照我們的需要和它的參數(shù)形式調(diào)用它即可,程序設(shè)計(jì)的藝術(shù),算法設(shè)計(jì)藝術(shù)程序的靈魂Donald E. Knuth,“The Art of Computer Programming”, 清華大學(xué)出版社(英),國(guó)防工業(yè)出版社(中)結(jié)構(gòu)設(shè)計(jì)藝術(shù)程序的肉體模塊化(Parnas, 1972)
5、結(jié)構(gòu)化(Structural)面向?qū)ο螅∣bject-Oriented)面向組件(Component-Oriented)面向智能體(Agent-Oriented)……,函數(shù)是C語(yǔ)言中模塊化編程的最小單位可以把每個(gè)函數(shù)看做一個(gè)模塊( Module )如把編程比做制造一臺(tái)機(jī)器,函數(shù)就好比其零部件可將這些“零部件”單獨(dú)設(shè)計(jì)、調(diào)試、測(cè)試好,用時(shí)拿出來(lái)裝配,再總體調(diào)試。這些“零部件”可以是自己設(shè)計(jì)制造/別人設(shè)計(jì)制造/現(xiàn)成的標(biāo)準(zhǔn)產(chǎn)品
6、,7.2 函數(shù)的定義,7.2 函數(shù)的定義,若干相關(guān)的函數(shù)可以合并成一個(gè)“模塊”一個(gè)C程序由一個(gè)或多個(gè)源程序文件組成一個(gè)源程序文件由一個(gè)或多個(gè)函數(shù)組成,,7.2.1函數(shù)的分類(lèi),函數(shù)生來(lái)都是平等的,互相獨(dú)立的,沒(méi)有高低貴賤和從屬之分main( )稍微特殊一點(diǎn)點(diǎn)C程序的執(zhí)行從main ( )函數(shù)開(kāi)始調(diào)用其他函數(shù)后流程回到main ( )函數(shù)在main ( )函數(shù)中結(jié)束整個(gè)程序運(yùn)行,7.2.1函數(shù)的分類(lèi),標(biāo)準(zhǔn)庫(kù)函數(shù)ANSI/ISO
7、 C定義的標(biāo)準(zhǔn)庫(kù)函數(shù)符合標(biāo)準(zhǔn)的C語(yǔ)言編譯器必須提供這些函數(shù)函數(shù)的行為也要符合ANSI/ISO C的定義第三方庫(kù)函數(shù)由其他廠商自行開(kāi)發(fā)的C語(yǔ)言函數(shù)庫(kù)不在標(biāo)準(zhǔn)范圍內(nèi),能擴(kuò)充C語(yǔ)言的功能(圖形、網(wǎng)絡(luò)、數(shù)據(jù)庫(kù)等)自定義函數(shù)自己定義的函數(shù)包裝后,也可成為函數(shù)庫(kù),供別人使用,7.2.2函數(shù)的定義(Function Definition),類(lèi)型 函數(shù)名(類(lèi)型 參數(shù)1, 類(lèi)型 參數(shù)2, ……){聲明語(yǔ)句序列
8、 可執(zhí)行語(yǔ)句序列 return 表達(dá)式;},返回值類(lèi)型,函數(shù)名標(biāo)識(shí)符,說(shuō)明運(yùn)算規(guī)則,參數(shù)表相當(dāng)于運(yùn)算的操作數(shù),,返回運(yùn)算的結(jié)果,函數(shù)出口,類(lèi)型 函數(shù)名(類(lèi)型 參數(shù)1, 類(lèi)型 參數(shù)2, ……){ 聲明語(yǔ)句序列 可執(zhí)行語(yǔ)句序列 return 表達(dá)式;},,參數(shù)表里的變量(叫形式參數(shù),F(xiàn)ormal Parameter)也是內(nèi)部變量,,函數(shù)體,7.2.2函數(shù)的定義(Function Defini
9、tion),void 函數(shù)名(void){聲明語(yǔ)句序列 可執(zhí)行語(yǔ)句序列 return;},函數(shù)無(wú)返回值,用void定義返回值類(lèi)型,用void定義參數(shù),表示沒(méi)有參數(shù),return語(yǔ)句后無(wú)需任何表達(dá)式,7.2.2函數(shù)的定義(Function Definition),【例7.1a】 計(jì)算整數(shù)n的階乘n!,/* 函數(shù)功能: 用迭代法計(jì)算n! 函數(shù)入口參數(shù): 整型變量n表示階乘的階數(shù) 函數(shù)返回
10、值: 返回n!的值*/long Fact(int n) /* 函數(shù)定義 */{ int i; long result = 1; for (i=2; i<=n; i++) { result *= i; } return result; },,,,,,,返回值類(lèi)型,函數(shù)名說(shuō)明函數(shù)的功能,返回值作為函數(shù)調(diào)用表達(dá)式的值,,形參
11、表,函數(shù)入口,函數(shù)內(nèi)部可以定義只能自己使用的變量,稱(chēng)內(nèi)部變量,函數(shù)名(表達(dá)式1, 表達(dá)式2, ……);實(shí)際參數(shù)(Actual Argument )函數(shù)調(diào)用(Founction Call)時(shí)提供的表達(dá)式有返回值時(shí)放到一個(gè)數(shù)值表達(dá)式中 c = max(a,b);作為另一個(gè)函數(shù)調(diào)用的參數(shù) c = max(max(a,b),c); printf("%d\n", max(a,b));無(wú)返回值時(shí)函數(shù)
12、調(diào)用表達(dá)式 display(a,b);,7.3向函數(shù)傳遞簡(jiǎn)單變量的值和從函數(shù)返回值,函數(shù)的參數(shù)傳遞,實(shí)參和形參必須匹配數(shù)目一致,類(lèi)型一一對(duì)應(yīng)(否則會(huì)發(fā)生自動(dòng)類(lèi)型轉(zhuǎn)換),【例7.1】,7.3.2函數(shù)原型(Function Prototype),在調(diào)用函數(shù)前先聲明其返回值類(lèi)型、函數(shù)名和參數(shù)函數(shù)原型有助于編譯器對(duì)函數(shù)參數(shù)類(lèi)型的匹配檢查,,末尾有一個(gè)分號(hào),聲明時(shí)不要省略形參和返回值的類(lèi)型,【例7.1】,,函數(shù)定義與函數(shù)聲明的區(qū)別,函數(shù)
13、定義指函數(shù)功能的確立指定函數(shù)名、函數(shù)類(lèi)型、形參及類(lèi)型、函數(shù)體等是完整獨(dú)立的單位 函數(shù)聲明是對(duì)函數(shù)名、返回值類(lèi)型、形參類(lèi)型的說(shuō)明不包括函數(shù)體是一條語(yǔ)句,以分號(hào)結(jié)束,只起一個(gè)聲明作用,7.3.3函數(shù)封裝與防御性程序設(shè)計(jì),函數(shù)封裝(Encapsulation)使得外界對(duì)函數(shù)的影響僅限于入口參數(shù),而函數(shù)對(duì)外界的影響僅限于一個(gè)返回值和數(shù)組、指針類(lèi)型的參數(shù),【例7.1】,Why?,傳入負(fù)數(shù)實(shí)參會(huì)怎樣?,防御性程序設(shè)計(jì)(Defensi
14、ve Programming),如何使函數(shù)具有遇到不正確使用或非法數(shù)據(jù)輸入時(shí)避免出錯(cuò)的能力,增強(qiáng)程序的健壯性? 在函數(shù)的入口處,檢查輸入?yún)?shù)的合法性,【例7.2】 計(jì)算整數(shù)n的階乘n!,,如何使函數(shù)具有遇到不正確使用或非法數(shù)據(jù)輸入時(shí)避免出錯(cuò)的能力,增強(qiáng)程序的健壯性? 在函數(shù)的入口處,檢查輸入?yún)?shù)的合法性,,,,防御性程序設(shè)計(jì)(Defensive Programming),【例7.2】計(jì)算整數(shù)n的階乘n!,主函數(shù)如何修改?增加對(duì)函數(shù)
15、返回值的檢驗(yàn),,,,防御性程序設(shè)計(jì)(Defensive Programming),【例7.3】計(jì)算整數(shù)n的階乘n!,傳入負(fù)數(shù)的實(shí)參時(shí)Fact()會(huì)返回-1嗎?存在死代碼的原因何在?,,防御性程序設(shè)計(jì)(Defensive Programming),【例7.3】計(jì)算整數(shù)n的階乘n!,,如何修改程序去除冗余代碼?如何保證不會(huì)傳入負(fù)數(shù)實(shí)參?,防御性程序設(shè)計(jì)(Defensive Programming),【例7.2】計(jì)算整數(shù)n的階乘n!,【例
16、7.4】編寫(xiě)計(jì)算組合數(shù)的程序,,函數(shù)復(fù)用,7.3.4函數(shù)設(shè)計(jì)的基本原則,信息隱藏,入口參數(shù)有效性檢查敏感操作前的檢查調(diào)用成功與否的檢查,函數(shù)的嵌套調(diào)用,嵌套調(diào)用在調(diào)用一個(gè)函數(shù)的過(guò)程中,又調(diào)用另一個(gè)函數(shù)C語(yǔ)言規(guī)定函數(shù)不能嵌套定義,但可以嵌套調(diào)用函數(shù)是相互平行的,main(){……a();},,a 函數(shù){b();…return;},,,b函數(shù){……return;},,,①,③,④,⑤,,⑥
17、,,⑦,②,,,7.4 函數(shù)的遞歸調(diào)用和遞歸函數(shù),如果一個(gè)對(duì)象部分地由它自己組成或按它自己定義,則我們稱(chēng)它是遞歸(Recursive)的。生活中,字典就是一個(gè)遞歸問(wèn)題的典型實(shí)例字典中的任何一個(gè)詞匯都是由“其他詞匯”解釋或定義的,但是“其他詞匯”在被定義或解釋時(shí)又會(huì)間接或直接地用到那些由它們定義的詞遞歸方法的基本原理將復(fù)雜問(wèn)題逐步化簡(jiǎn),最終轉(zhuǎn)化為一個(gè)最簡(jiǎn)單的問(wèn)題最簡(jiǎn)單問(wèn)題的解決就意味著整個(gè)問(wèn)題的解決,遞歸函數(shù)(Recursive
18、 Function),long fact(int n) { if (n < 0) return -1; else if (n == 0 || n == 1) return 1; else return n * fact(n-1); },,,【例7.5】計(jì)算n!= n *(n-1)*(n-2)*……*1,函數(shù)直接或間接調(diào)用自己,稱(chēng)為遞歸調(diào)用(Recursive
19、Call),遞歸函數(shù)(Recursive Function),unsigned long fact(unsigned int n) { if (n == 0 || n == 1) return 1;else return n * fact(n-1); },,,,基線情況(base case),一般情況(general case),無(wú)需考慮n<0了,【例7.5】計(jì)算n!= n *(n-1)*(n-2)*…*1
20、,遞歸函數(shù)(Recursive Function),遞歸調(diào)用應(yīng)該能夠在有限次數(shù)內(nèi)終止遞歸遞歸調(diào)用若不加以限制,將無(wú)限循環(huán)調(diào)用必須在函數(shù)內(nèi)部加控制語(yǔ)句,僅當(dāng)滿足一定條件時(shí),遞歸終止,稱(chēng)為條件遞歸任何一個(gè)遞歸調(diào)用程序必須包括兩部分遞歸循環(huán)繼續(xù)的過(guò)程遞歸調(diào)用結(jié)束的過(guò)程,if (遞歸終止條件成立) return 遞歸公式的初值; else return 遞歸函數(shù)調(diào)用返回的結(jié)果值;,n!=n×(n-1)
21、! (n-1)!=(n-1)×(n-2)! (n-2)! … (n-3)! 5! … 4!=4×3! 3!=3×
22、;2! 2!=2×1! 1!=1,,,回推過(guò)程,遞推過(guò)程,每個(gè)遞歸函數(shù)必須至少有一個(gè)基線條件一般情況必須最終能簡(jiǎn)化為基線條件,遞歸層數(shù)太多易導(dǎo)致??臻g溢出后果很?chē)?yán)重,程序被異常中止,fact(5)=5*fact(4)= 120 fact(4)= 4*fact(3)= 24 fact(3)= 3*f
23、act(2)= 6 fact(2)= 2*fact(1)=2 fact(1)=1,,main,fact(5),fact(4),fact(3),fact(2),fact(1),遞歸與迭代,用迭代(即循環(huán))方法編寫(xiě)的階乘函數(shù)unsigned long Fact(unsigne
24、d int n){ unsigned long result = 1; unsigned int i; for (i = 1; i <= n; i++) result *= i; return result;}遞歸程序遵循了數(shù)學(xué)中對(duì)階乘的定義因此遞歸方法編寫(xiě)程序具有更清晰、可讀性更好的優(yōu)點(diǎn),遞歸與迭代,1,1,2,3,5,8,......,long Fib(int n){long
25、f;if (n == 0) f = 0;else if (n == 1) f = 1;else f = Fib(n-1) + Fib(n-2);return f;},【例7.6】計(jì)算Fibonacci數(shù)列,遞歸與迭代,優(yōu)點(diǎn):從編程角度來(lái)看,比較直觀、精煉,邏輯清楚符合人的思維習(xí)慣,逼近數(shù)學(xué)公式的表示尤其適合非數(shù)值計(jì)算領(lǐng)域hanoi塔,騎士游歷、八皇后問(wèn)題(回溯法)缺點(diǎn):增加了函數(shù)調(diào)用的開(kāi)銷(xiāo),每次調(diào)用都需要
26、進(jìn)行參數(shù)傳遞、現(xiàn)場(chǎng)保護(hù)等耗費(fèi)更多的時(shí)間和??臻g應(yīng)盡量用迭代形式替代遞歸形式,7.5變量的作用域和存儲(chǔ)類(lèi)型,7.5.1變量的作用域 ( Scope )指在源程序中定義變量的位置及其能被讀寫(xiě)訪問(wèn)的范圍分為局部變量(Local Variable) 全局變量(Global Variable ),局部變量( Local Variable ),在語(yǔ)句塊內(nèi)定義的變量形參也是局部變量特點(diǎn)生存期是該語(yǔ)句塊,進(jìn)入語(yǔ)句塊時(shí)獲得內(nèi)存,僅能由語(yǔ)
27、句塊內(nèi)語(yǔ)句訪問(wèn),退出語(yǔ)句塊時(shí)釋放內(nèi)存,不再有效定義時(shí)不會(huì)自動(dòng)初始化,除非程序員指定初值并列語(yǔ)句塊各自定義的同名變量互不干擾 形參和實(shí)參可以同名,全局變量( Global Variable ),在所有函數(shù)之外定義的變量生存期是整個(gè)程序,從程序運(yùn)行起占據(jù)內(nèi)存,程序運(yùn)行過(guò)程中可隨時(shí)訪問(wèn),程序退出時(shí)釋放內(nèi)存有效范圍是從定義變量的位置開(kāi)始到本程序結(jié)束,全局變量( Global Variable ),【例7.7】打印計(jì)算Fibonacci
28、數(shù)列每一項(xiàng)時(shí)所需的遞歸調(diào)用次數(shù),,全局變量使函數(shù)間的數(shù)據(jù)交換更容易,更高效,但建議盡量少用,因?yàn)檎l(shuí)都可改寫(xiě)它,所以很難確定是誰(shuí)改寫(xiě)了它,,7.5.2變量的存儲(chǔ)類(lèi)型( Storage Class),指數(shù)據(jù)在內(nèi)存中存儲(chǔ)的方式即編譯器為變量分配內(nèi)存的方式,它決定變量的生存期 存儲(chǔ)類(lèi)型 數(shù)據(jù)類(lèi)型 變量名;C程序的存儲(chǔ)類(lèi)別auto型(自動(dòng)變量)static型(靜態(tài)變量)extern型(外部變量)r
29、egister型(寄存器變量),,,靜態(tài)存儲(chǔ)區(qū)中的變量:與程序“共存亡” 動(dòng)態(tài)存儲(chǔ)區(qū)中的變量:與程序塊“共存亡” 寄存器中的變量: 同動(dòng)態(tài)存儲(chǔ)區(qū),變量的生存期(Lifetime )決定何時(shí)“生”,何時(shí)“滅”,,7.5.2變量的存儲(chǔ)類(lèi)型( Storage Class),auto 數(shù)據(jù)類(lèi)型 變量名;auto體現(xiàn)在進(jìn)入語(yǔ)句塊時(shí)自動(dòng)申請(qǐng)內(nèi)存,退出時(shí)自動(dòng)釋放內(nèi)存動(dòng)態(tài)局部變量,缺省的存儲(chǔ)類(lèi)型靜
30、態(tài)變量 static 數(shù)據(jù)類(lèi)型 變量名;static storage class for local variables (declared inside a block or function) - the lifetime of the entire program生存期為整個(gè)程序運(yùn)行期間,自動(dòng)變量和靜態(tài)變量,,自動(dòng)變量和靜態(tài)變量,【例7.9】,自動(dòng)變量不初始化時(shí),值是隨機(jī)值,靜態(tài)局部變量和全局變量自動(dòng)初始化為0值
31、,【例7.10】利用靜態(tài)變量計(jì)算整數(shù)n的階乘n!,,自動(dòng)變量和靜態(tài)變量,靜態(tài)變量?jī)H初始化一次,變量的值可保存到下次進(jìn)入函數(shù),使函數(shù)具有記憶功能,寄存器變量,寄存器CPU內(nèi)部容量有限、但速度極快的存儲(chǔ)器 register 類(lèi)型名 變量名; 使用頻率比較高的變量聲明為register ,可使程序更小、執(zhí)行速度更快現(xiàn)代編譯器有能力自動(dòng)把普通變量?jī)?yōu)化為寄存器變量,并且可以忽略用戶的指定所以一般無(wú)須特別聲
32、明變量為register,全局變量,,靜態(tài)外部變量 (只限本文件使用),外部變量 (非靜態(tài)外部變量,允許其他文件引用),局部變量,,自動(dòng)變量,(離開(kāi)函數(shù),值就消失),寄存器變量(離開(kāi)函數(shù),值就消失),,定義點(diǎn)之前使用,需用extern聲明,靜態(tài)局部變量 (離開(kāi)函數(shù),值仍保留),動(dòng)態(tài)局部變量,,7.5變量的作用域和存儲(chǔ)類(lèi)型,7.6模塊化程序設(shè)計(jì),模塊各司其職每個(gè)模塊只負(fù)責(zé)一件事情,它可以更專(zhuān)心便于進(jìn)行單個(gè)模塊的設(shè)計(jì)、開(kāi)發(fā)、調(diào)試、測(cè)
33、試和維護(hù)等工作一個(gè)模塊一個(gè)模塊地完成,最后再將它們集成開(kāi)發(fā)人員各司其職按模塊分配任務(wù),職責(zé)明確并行開(kāi)發(fā),縮短開(kāi)發(fā)時(shí)間什么時(shí)候需要模塊化?某一功能,如果重復(fù)實(shí)現(xiàn)3遍以上,即應(yīng)考慮模塊化,將它寫(xiě)成通用函數(shù),并向小組成員發(fā)布,7.6模塊化程序設(shè)計(jì),模塊化的優(yōu)點(diǎn)——復(fù)用構(gòu)建新的軟件系統(tǒng)可以不必每次從零做起,直接使用已有的經(jīng)過(guò)反復(fù)驗(yàn)證的軟構(gòu)件,組裝或加以合理修改后成為新的系統(tǒng),提高軟件生產(chǎn)率和程序質(zhì)量在其他函數(shù)的基礎(chǔ)上構(gòu)造程序拿
34、來(lái)拿去主義,指盡可能復(fù)用其他人現(xiàn)成的模塊不是人類(lèi)懶惰的表現(xiàn),而是智慧的表現(xiàn)一般要靠日積月累才能建立可以被復(fù)用的軟件庫(kù)前期投入多,缺乏近期效益,大部分公司都注重近期效益,是為了生存,所以軟件復(fù)用對(duì)公司來(lái)說(shuō)不是最高優(yōu)先級(jí),7.6模塊化程序設(shè)計(jì),功能分解自頂向下、逐步求精的過(guò)程模塊分解的基本原則保證模塊的相對(duì)獨(dú)立性——高聚合、低耦合模塊的實(shí)現(xiàn)細(xì)節(jié)對(duì)外不可見(jiàn)——信息隱藏外部:關(guān)心做什么;內(nèi)部:關(guān)心怎么做設(shè)計(jì)好模塊接口接口指羅
35、列出一個(gè)模塊的所有的與外部打交道的變量等 定義好后不要輕易改動(dòng)在模塊開(kāi)頭(文件的開(kāi)頭)進(jìn)行函數(shù)聲明,7.6模塊化程序設(shè)計(jì),逐步求精(Stepwise Refinement)由不斷的自底向上修正所補(bǔ)充的自頂向下(Top-down)的程序設(shè)計(jì)方法,【例7.11】用函數(shù)完成猜數(shù)游戲,猜多個(gè)數(shù),10次猜不對(duì)就猜下一個(gè)數(shù)模塊分解過(guò)程,開(kāi)始,結(jié)束,初始化,退出處理,主功能,為程序運(yùn)行所做的準(zhǔn)備工作,在退出前要做的事情,如打印結(jié)果、資源釋放
36、等,自底向上,自頂向下的模塊化程序設(shè)計(jì),,【例7.11】用函數(shù)完成猜數(shù)游戲,,開(kāi)始,結(jié)束,生成數(shù)字,猜數(shù)字,【例7.11】用函數(shù)完成猜數(shù)游戲,開(kāi)始,結(jié)束,生成數(shù)字,猜數(shù)字,是否繼續(xù)?,N,Y,,,,【例7.11】用函數(shù)完成猜數(shù)游戲,開(kāi)始,結(jié)束,猜得對(duì)嗎?,N,Y,提示大小,次數(shù)<10?,輸入數(shù)字,,N,,Y,,處理用戶輸入,判斷是否有輸入錯(cuò)誤,是否在合法的數(shù)值范圍內(nèi),【例7.11】用函數(shù)完成猜數(shù)游戲,,【例7.11】用函數(shù)完成猜
37、數(shù)游戲,,,,【例7.11】用函數(shù)完成猜數(shù)游戲,,,,,,【例7.11】用函數(shù)完成猜數(shù)游戲,int MakeNumber(void){ int number; number = (rand() % (MAX_NUMBER - MIN_NUMBER + 1) ) + MIN_NUMBER; assert(number >= MIN_NUMBER && number <= MAX_NU
38、MBER); return number;},使用斷言(Assert)防止某些參數(shù)獲得非法值,在程序調(diào)試和測(cè)試時(shí)發(fā)現(xiàn)錯(cuò)誤,#include void assert(int expression);expression為真,無(wú)聲無(wú)息;為假,中斷程序斷言僅用于調(diào)試程序,不能作為程序的功能,斷言,用來(lái)測(cè)試某種不可能發(fā)生的狀況確實(shí)不會(huì)發(fā)生Debug版有效Release版失效考慮使用斷言的幾種情況檢查程序中的各種假設(shè)的正確
39、性證實(shí)或測(cè)試某種不可能發(fā)生的狀況確實(shí)不會(huì)發(fā)生,程序版式,縮進(jìn)(Indent)—保證代碼整潔、層次清晰的主要手段良好風(fēng)格的程序應(yīng)嚴(yán)格采用梯形層次對(duì)應(yīng)好各層次,int IsPrime(int n){ int k, i; k = sqrt((double)n); for (i=2; i<=k; i++) { if (n % i == 0) retu
40、rn 0; } return 1;},#include main(){ int i; for (i=2; i<100; i++) { if (IsPrime(i)) printf("%d\t",i); }},,程序版式,現(xiàn)在的許多開(kāi)發(fā)環(huán)境、編輯軟件都支持自動(dòng)縮進(jìn)根據(jù)用戶代碼的輸入,智能判斷應(yīng)該縮進(jìn)還是反縮進(jìn),替用戶完
41、成調(diào)整縮進(jìn)的工作VC中有自動(dòng)整理格式功能只要選取需要的代碼,按ALT+F8就能自動(dòng)整理成微軟的cpp文件格式,命名規(guī)則,在Linux/UNIX平臺(tái)習(xí)慣用function_name 本書(shū)采用Windows風(fēng)格函數(shù)名命名用大寫(xiě)字母開(kāi)頭、大小寫(xiě)混排的單詞組合而成 FunctionName 變量名形式“名詞”或者“形容詞+名詞”如oldValue與newValue等函數(shù)名形式“動(dòng)詞”或者“動(dòng)詞+名詞”(動(dòng)賓詞組)如Get
42、Max()等,對(duì)函數(shù)接口進(jìn)行注釋說(shuō)明,/* 函數(shù)功能:實(shí)現(xiàn)××××功能 函數(shù)參數(shù):參數(shù)1,表示×× 參數(shù)2,表示×× 函數(shù)返回值: ×××××*/返回值類(lèi)型 函數(shù)名(形參表){…return 表達(dá)式;},,,,,挑戰(zhàn)性的作業(yè)挑戰(zhàn)類(lèi)型表示的極限 ——50位
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 第26章反比例函數(shù)全章教案(共7份)
- 第6章函數(shù)
- 第7章
- 第26章反比例函數(shù)全章導(dǎo)學(xué)案(共7份)
- 經(jīng)濟(jì)數(shù)學(xué)基礎(chǔ)講義 第7章 多元函數(shù)微分學(xué)
- 第7章_萃取
- 第7章、暗器
- 第7、8章
- 第7章 顏色
- 第7章.doc
- 第7章 墻體
- 信號(hào)第6章-系統(tǒng)函數(shù)
- 第1章函數(shù)與極限
- 第1章函數(shù)與極限
- python 求一元函數(shù)極小值-第7章 函數(shù)的極小值
- 第7章過(guò)程
- 第7章中斷
- 第7章多態(tài)
- 第7章作業(yè)
- 第7章 安全
評(píng)論
0/150
提交評(píng)論