




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、第十二章第十二章 程序開發(fā)程序開發(fā)n自頂向下、逐步求精自頂向下、逐步求精n結(jié)構(gòu)化程序設(shè)計原則結(jié)構(gòu)化程序設(shè)計原則n程序風(fēng)格程序風(fēng)格n窮舉與試探窮舉與試探作業(yè)作業(yè): 12.8 編程序并不難,只要有算法,會程序設(shè)計語言,任何人都編程序并不難,只要有算法,會程序設(shè)計語言,任何人都可以編出程序,但是不同人編出的程序卻大不相同。針對同一可以編出程序,但是不同人編出的程序卻大不相同。針對同一個問題個問題: 有人編的程序風(fēng)格好、易讀、易維護、易重用、可靠性高、有人編的程序風(fēng)格好、易讀、易維護、易重用、可靠性高、運行得既快又節(jié)省存儲空間;運行得既快又節(jié)省存儲空間; 有人編的程序風(fēng)格差、晦澀難懂、難于維護、冗長、
2、正確有人編的程序風(fēng)格差、晦澀難懂、難于維護、冗長、正確性和可靠性極低、運行起來既慢又占用空間。性和可靠性極低、運行起來既慢又占用空間。編程序易,編好程序難編程序易,編好程序難 要想編出一個風(fēng)格優(yōu)美、正確可靠、各方面均優(yōu)秀的好程要想編出一個風(fēng)格優(yōu)美、正確可靠、各方面均優(yōu)秀的好程序,必須按照現(xiàn)代軟件工程的規(guī)范進行。同時也必須遵循好的序,必須按照現(xiàn)代軟件工程的規(guī)范進行。同時也必須遵循好的程序設(shè)計原則和使用好的程序設(shè)計方法。程序設(shè)計原則和使用好的程序設(shè)計方法。 本章介紹程序開發(fā)、結(jié)構(gòu)化程序設(shè)計。本章介紹程序開發(fā)、結(jié)構(gòu)化程序設(shè)計。12.1 求玉米單產(chǎn)求玉米單產(chǎn)自頂向下、逐步求精自頂向下、逐步求精 【例例
3、12.1】如圖所示,現(xiàn)有一個近似四邊形的地塊位于如圖所示,現(xiàn)有一個近似四邊形的地塊位于南北方向路東側(cè),東西方向路北側(cè)。其一個頂點距離南北方南北方向路東側(cè),東西方向路北側(cè)。其一個頂點距離南北方向路向路547米,距離東西方向路米,距離東西方向路411米;另一個頂點距離南北米;另一個頂點距離南北方向路方向路804米,距離東西方向路米,距離東西方向路77米;第三個頂點距離南北米;第三個頂點距離南北方向路方向路39米,距離東西方向路米,距離東西方向路208米;第四個頂點距離南北米;第四個頂點距離南北方向路方向路116米,距離東西方向路米,距離東西方向路332米。該地塊去年種植玉米。該地塊去年種植玉米,已
4、知總產(chǎn)量米,已知總產(chǎn)量130噸,求玉米每畝產(chǎn)多少公斤。噸,求玉米每畝產(chǎn)多少公斤。C2083911677ABD547411332804北北東東 Y X計算該地塊面積計算該地塊面積折合成畝折合成畝計算單位產(chǎn)量計算單位產(chǎn)量開始開始結(jié)束結(jié)束該問題可以描述為:該問題可以描述為:求精求精“求總面積求總面積”: 連接連接B、D,構(gòu)成兩個三角形,構(gòu)成兩個三角形ABD和和BCD,然后分別計,然后分別計算兩個三角形面積并相加,得算兩個三角形面積并相加,得PAD。 C2083911677ABD547411332804北北東東 Y X計算三角形計算三角形ABD的面積,設(shè)為的面積,設(shè)為S1計算三角形計算三角形BCD的面
5、積,設(shè)為的面積,設(shè)為S2總面積總面積 = s1+s2計算總面積計算總面積area開始開始結(jié)束結(jié)束 計算三角形計算三角形ABD、BCD的面積的算法一樣的,可以寫的面積的算法一樣的,可以寫一個函數(shù)一個函數(shù)areaTtriangle,分別調(diào)用,分別調(diào)用areaTtriangle函數(shù)。函數(shù)。 求精求精 areaTtriangle: 計算三角形面積有很多方法,選擇一種合適的即可。根計算三角形面積有很多方法,選擇一種合適的即可。根據(jù)本問題的條件,可以選擇海倫公式:據(jù)本問題的條件,可以選擇海倫公式:得計算三角形面積得計算三角形面積areaTtriangle的的 PAD ) c)(b)(a( ssssS 2c
6、ba s其中:其中: S 為三角形面積為三角形面積 a、b、c 分別為三條邊長分別為三條邊長求第一條邊長度求第一條邊長度求第二條邊長度求第二條邊長度求第三條邊長度求第三條邊長度計算三角形面積計算三角形面積areaTtriangle計算計算s計算計算S開始開始結(jié)束結(jié)束求精該圖:求精該圖: 計算計算s和和S都只是數(shù)學(xué)公式計算,不用求精;都只是數(shù)學(xué)公式計算,不用求精; 求各條邊長度的算法是一樣的,數(shù)學(xué)上有兩點間求各條邊長度的算法是一樣的,數(shù)學(xué)上有兩點間距離公式,可以寫一個函數(shù)距離公式,可以寫一個函數(shù)away,求精成右圖,求精成右圖 求兩點間距離求兩點間距離away(x1,y1,x2,y2)結(jié)束結(jié)束r
7、eturn sqrt(x2-x1)2+(y2-y1)2) 至此已經(jīng)把解決該問題的各個步驟分析清楚。通過自頂向下的逐至此已經(jīng)把解決該問題的各個步驟分析清楚。通過自頂向下的逐步求精,找到了問題求解算法。按得到的步求精,找到了問題求解算法。按得到的PAD編出程序如下:編出程序如下: / /* * 計算四邊形面積,參數(shù):四個頂點計算四邊形面積,參數(shù):四個頂點x x、y y坐標(biāo)坐標(biāo) * */ /float area( float xa ,float ya ,float xb ,float yb ,float xc ,float yc ,float xd ,float yd ) float s1,s2;/
8、 / 計算用變量;計算用變量; / ABD/ ABD面積面積 s1 = tareaTtriangle (xa, ya, xb, yb, xd, yd ); / BCD / BCD面積面積 s2 = tareaTtriangle (xb, yb, xc, yc, xd, yd ); return s1+s2; / / 返回面積返回面積/ /* * 計算三角形計算三角形uvwuvw面積,參數(shù):面積,參數(shù):u u、v v、w w三點的三點的x x、y y坐標(biāo)坐標(biāo) * */ /floa tareaTtriangle ( float xu,float yu ,float xv,float yv ,flo
9、at xw,float yw )float uv , uw , vw ;/ / 三條邊長三條邊長float s ;uv = away ( xu, yu, xv, yv ); /邊邊uvuv長長uw = away ( xu, yu, xw, yw );/邊邊uwuw長長vw = away ( xv, yv, xw, yw );/邊邊vwvw長長s=(uv+uw+vw)/2;/s/sreturn sqrt( s*(s-uv)*(s-uw)*(s-vw) );/ 返回面積返回面積/* areauvw */ / /* * 計算計算r r、s s兩點距離:參數(shù):兩點的兩點距離:參數(shù):兩點的x x、y y
10、坐標(biāo)坐標(biāo) * */ /float away(float xr,float yr,float xs,float ys)return sqrt( (xr-xs)*(xr-xs)+(yr-ys)*(yr-ys) );/* away */例例12.1和本書所有稍微復(fù)雜點的例題,全和本書所有稍微復(fù)雜點的例題,全部都是使用部都是使用“自頂向下、逐步求精自頂向下、逐步求精”的方法開發(fā)的方法開發(fā)的。的。“自頂向下、逐步求精自頂向下、逐步求精”的程序設(shè)計技術(shù)是的程序設(shè)計技術(shù)是目前較為時髦的(當(dāng)然也是較為合理的)找出一目前較為時髦的(當(dāng)然也是較為合理的)找出一個問題的解題算法的一種思維方法。該技術(shù)的基個問題的解題
11、算法的一種思維方法。該技術(shù)的基本思想在第五章已經(jīng)初步介紹過。本思想在第五章已經(jīng)初步介紹過。 “自頂向下、逐步求精自頂向下、逐步求精”過程中的每一步,分解過程中的每一步,分解某一具體問題時,主要用到如下四種求精技術(shù):某一具體問題時,主要用到如下四種求精技術(shù): 1. 順序連接的求精順序連接的求精 2. 分支、選擇的求精分支、選擇的求精 3. 循環(huán)的求精循環(huán)的求精 4. 遞歸的求精遞歸的求精“自頂向下,逐步求精自頂向下,逐步求精”的分析技術(shù)實質(zhì)上是上圖所示過程的反復(fù)。的分析技術(shù)實質(zhì)上是上圖所示過程的反復(fù)。 求解一個問題求解一個問題粗略的解決方案粗略的解決方案細(xì)細(xì) 化化第一步子問題第一步子問題第二步子
12、問題第二步子問題第第n步子問題步子問題.前處理前處理 結(jié)束條件結(jié)束條件后處理后處理進進展展一一步步前處理前處理后處理后處理條條件件處理處理1處理處理2處理處理n. .條件條件2條件條件n 條件條件1前處理前處理后處理后處理遞歸遞歸條件條件遞歸遞歸順序順序 連接連接循環(huán)循環(huán) 分支分支 選擇選擇 遞歸遞歸 當(dāng)問題的子解具有前后關(guān)系時,采用第一種順序連接的求精當(dāng)問題的子解具有前后關(guān)系時,采用第一種順序連接的求精技術(shù),將問題分解成互不相交的幾個子問題的順序執(zhí)行。技術(shù),將問題分解成互不相交的幾個子問題的順序執(zhí)行。 當(dāng)問題是分別不同情況而應(yīng)該進行不同處理時,采用分支、選擇當(dāng)問題是分別不同情況而應(yīng)該進行不同
13、處理時,采用分支、選擇的求精技術(shù),構(gòu)造分支。這時要注意分支的條件一定要正確。的求精技術(shù),構(gòu)造分支。這時要注意分支的條件一定要正確。當(dāng)問題的子解具有特性:如果有向解的方向前進一步的方法,且當(dāng)問題的子解具有特性:如果有向解的方向前進一步的方法,且不斷重復(fù)該步驟,即能解決問題,最終達到完全解。則應(yīng)該采用不斷重復(fù)該步驟,即能解決問題,最終達到完全解。則應(yīng)該采用循環(huán)的求精技術(shù)(構(gòu)造循環(huán))。這時一定要弄清循環(huán)的初始條件、循環(huán)的求精技術(shù)(構(gòu)造循環(huán))。這時一定要弄清循環(huán)的初始條件、結(jié)束條件和有限進展的一步都是什么。結(jié)束條件和有限進展的一步都是什么。 當(dāng)問題的某步解法與前邊高層次的某步解法具有相同性質(zhì),只是當(dāng)問
14、題的某步解法與前邊高層次的某步解法具有相同性質(zhì),只是某些參數(shù)不同時,可采用遞歸的求精技術(shù)。這時應(yīng)注意遞歸的參數(shù)某些參數(shù)不同時,可采用遞歸的求精技術(shù)。這時應(yīng)注意遞歸的參數(shù)變化規(guī)律以及遞歸出口。變化規(guī)律以及遞歸出口。 “自頂向下、逐步求精自頂向下、逐步求精”是一種思維方式,它不是計算機程是一種思維方式,它不是計算機程序員獨有的。事實上在日常生活、工作中也經(jīng)常的使用該技術(shù),序員獨有的。事實上在日常生活、工作中也經(jīng)常的使用該技術(shù),只不過不自覺或沒意識到罷了。只不過不自覺或沒意識到罷了。 例如寫一本書、或文章,總要作一個提綱,全書分成幾章;例如寫一本書、或文章,總要作一個提綱,全書分成幾章;然后對每一章
15、又列出本章分幾節(jié);對每一節(jié)又分出幾小節(jié)等等;然后對每一章又列出本章分幾節(jié);對每一節(jié)又分出幾小節(jié)等等;最后再具體著手寫每個小節(jié)。最后再具體著手寫每個小節(jié)。 又如,設(shè)計生產(chǎn)某產(chǎn)品的一個工廠(比如汽車廠):首先又如,設(shè)計生產(chǎn)某產(chǎn)品的一個工廠(比如汽車廠):首先應(yīng)考慮全廠應(yīng)該分成幾個車間(例如,生產(chǎn)發(fā)動機的發(fā)動機車應(yīng)考慮全廠應(yīng)該分成幾個車間(例如,生產(chǎn)發(fā)動機的發(fā)動機車間、生產(chǎn)底盤的底盤車間、生產(chǎn)車輪的車輪車間、總裝車間、生產(chǎn)底盤的底盤車間、生產(chǎn)車輪的車輪車間、總裝車間、間、.);然后再考慮每個車間應(yīng)分成幾個工段(例如,發(fā)動);然后再考慮每個車間應(yīng)分成幾個工段(例如,發(fā)動機車間應(yīng)分成生產(chǎn)機殼的機殼工段、
16、生產(chǎn)活塞的活塞工段、負(fù)機車間應(yīng)分成生產(chǎn)機殼的機殼工段、生產(chǎn)活塞的活塞工段、負(fù)責(zé)工件熱處理的熱處理工段、責(zé)工件熱處理的熱處理工段、.);然后再考慮每個工段應(yīng)該);然后再考慮每個工段應(yīng)該配備多少種設(shè)備,每種設(shè)備應(yīng)配備多少臺,配備多少種設(shè)備,每種設(shè)備應(yīng)配備多少臺,. 等等。等等。 這就是自頂向下、逐步求精。這就是自頂向下、逐步求精。 采用自頂向下、逐步求精方法構(gòu)造程序有如下優(yōu)點采用自頂向下、逐步求精方法構(gòu)造程序有如下優(yōu)點: 1. 程序的層次分明、結(jié)構(gòu)清晰。程序的層次分明、結(jié)構(gòu)清晰。 2. 便于集體開發(fā)程序。對于大型程序來講,可以每組便于集體開發(fā)程序。對于大型程序來講,可以每組負(fù)責(zé)一個模塊(一個子部分
17、),在一個組內(nèi)又可以每個人負(fù)負(fù)責(zé)一個模塊(一個子部分),在一個組內(nèi)又可以每個人負(fù)責(zé)一個子模塊(更小的子部分)等等。而各個模塊之間以及責(zé)一個子模塊(更小的子部分)等等。而各個模塊之間以及各個子模塊之間相對獨立,互相之間沒有制約,各個模塊的各個子模塊之間相對獨立,互相之間沒有制約,各個模塊的負(fù)責(zé)人員可以獨立的進行各自的程序設(shè)計。負(fù)責(zé)人員可以獨立的進行各自的程序設(shè)計。 3. 便于調(diào)試。若程序有錯誤,可以很容易的將錯誤局便于調(diào)試。若程序有錯誤,可以很容易的將錯誤局部于某一子部分,找出錯誤,同時每一部分的錯誤是獨立的,部于某一子部分,找出錯誤,同時每一部分的錯誤是獨立的,也不至于影響其它的部分。也不至于
18、影響其它的部分。12.2 結(jié)構(gòu)化程序設(shè)計原則結(jié)構(gòu)化程序設(shè)計原則 由于計算機硬件技術(shù)的不斷發(fā)展,以及計算機的廣泛應(yīng)由于計算機硬件技術(shù)的不斷發(fā)展,以及計算機的廣泛應(yīng)用,計算機軟件系統(tǒng)也日益發(fā)展,并且軟件在計算機系統(tǒng)中所用,計算機軟件系統(tǒng)也日益發(fā)展,并且軟件在計算機系統(tǒng)中所占比重也越來越大,使得作為軟件主要組成部分的程序系統(tǒng)越占比重也越來越大,使得作為軟件主要組成部分的程序系統(tǒng)越來越龐大,復(fù)雜度越來越高,造價也越來越昂貴,同時出錯率來越龐大,復(fù)雜度越來越高,造價也越來越昂貴,同時出錯率也不斷增加,系統(tǒng)的可靠性越來越難以保證,維護也越來越困也不斷增加,系統(tǒng)的可靠性越來越難以保證,維護也越來越困難。最后
19、終于在難。最后終于在20世紀(jì)世紀(jì)60年代中期引起了一場所謂的軟件危機。年代中期引起了一場所謂的軟件危機。在該背景下,在該背景下,1968 年年 Dijkstra 提出了結(jié)構(gòu)化程序設(shè)計思想。提出了結(jié)構(gòu)化程序設(shè)計思想。這種思想的基點是:這種思想的基點是:“清晰,易懂地書寫程序邏輯,使程序結(jié)構(gòu)表現(xiàn)得簡單、明快清晰,易懂地書寫程序邏輯,使程序結(jié)構(gòu)表現(xiàn)得簡單、明快” 從這點出發(fā),人們經(jīng)過艱苦實踐,總結(jié)出了一套結(jié)構(gòu)化程從這點出發(fā),人們經(jīng)過艱苦實踐,總結(jié)出了一套結(jié)構(gòu)化程序設(shè)計原則。這套原則要求程序員寫出的程序應(yīng)該是結(jié)構(gòu)良好序設(shè)計原則。這套原則要求程序員寫出的程序應(yīng)該是結(jié)構(gòu)良好的,即的,即: 1. 易于保證和
20、驗證程序的正確性易于保證和驗證程序的正確性 2. 易于閱讀、維護和調(diào)試。易于閱讀、維護和調(diào)試。這種良好結(jié)構(gòu)的程序具體體現(xiàn)在:對任意程序段來講這種良好結(jié)構(gòu)的程序具體體現(xiàn)在:對任意程序段來講 1. 僅有一個入口,一個出口僅有一個入口,一個出口 2. 沒有死循環(huán)沒有死循環(huán) 3. 沒有死碼區(qū)。沒有死碼區(qū)。為了達到上述目的,強調(diào)程序員在寫程序時應(yīng)該為了達到上述目的,強調(diào)程序員在寫程序時應(yīng)該: 1. 利用自頂向下、逐步求精的技術(shù)設(shè)計程序利用自頂向下、逐步求精的技術(shù)設(shè)計程序 2. 具有良好的程序設(shè)計風(fēng)格具有良好的程序設(shè)計風(fēng)格 3. 盡量利用標(biāo)準(zhǔn)的順序、分支、重復(fù)控制結(jié)構(gòu)。保證程盡量利用標(biāo)準(zhǔn)的順序、分支、重復(fù)
21、控制結(jié)構(gòu)。保證程序僅有一個入口、一個出口。序僅有一個入口、一個出口。 4. 限制使用限制使用 GOTO 語句。可能一個壞程序的缺點都是由語句??赡芤粋€壞程序的缺點都是由 GOTO 語句引起的。語句引起的。 結(jié)構(gòu)化程序設(shè)計的發(fā)展,使程序設(shè)計從技藝走向工程,為軟件工程學(xué)發(fā)結(jié)構(gòu)化程序設(shè)計的發(fā)展,使程序設(shè)計從技藝走向工程,為軟件工程學(xué)發(fā)展奠定了有力基礎(chǔ)。使軟件生產(chǎn)由個體作坊式的藝術(shù)創(chuàng)作方式發(fā)展成為千千展奠定了有力基礎(chǔ)。使軟件生產(chǎn)由個體作坊式的藝術(shù)創(chuàng)作方式發(fā)展成為千千萬萬人參加的工程方式,達到了萬萬人參加的工程方式,達到了“系列化、產(chǎn)品化系列化、產(chǎn)品化 、工程化、工程化 、標(biāo)準(zhǔn)化、標(biāo)準(zhǔn)化”?!败浖こ誊?/p>
22、件工程”也從這一時期開始逐步發(fā)展起來。也從這一時期開始逐步發(fā)展起來。 能夠反映結(jié)構(gòu)化程序設(shè)計要求,便于書寫結(jié)構(gòu)化程序的程序設(shè)計語言,能夠反映結(jié)構(gòu)化程序設(shè)計要求,便于書寫結(jié)構(gòu)化程序的程序設(shè)計語言,稱結(jié)構(gòu)化程序設(shè)計語言??梢哉J(rèn)為稱結(jié)構(gòu)化程序設(shè)計語言。可以認(rèn)為C是結(jié)構(gòu)化程序設(shè)計語言。是結(jié)構(gòu)化程序設(shè)計語言。 結(jié)構(gòu)化程序設(shè)計方法是結(jié)構(gòu)化程序設(shè)計方法是20世紀(jì)世紀(jì)60年代末年代末70年代初逐漸發(fā)展起來的,目年代初逐漸發(fā)展起來的,目前程序設(shè)計領(lǐng)域的熱點是前程序設(shè)計領(lǐng)域的熱點是“面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計”和和“基于構(gòu)件的程序設(shè)計基于構(gòu)件的程序設(shè)計”等。但是它們的主要特長在于程序的組織、信息封裝、軟件重
23、用等,而最終等。但是它們的主要特長在于程序的組織、信息封裝、軟件重用等,而最終對于足夠小程序模塊的編碼,它們沒有給人們帶來益處。對于足夠小程序模塊的編碼,它們沒有給人們帶來益處。 結(jié)構(gòu)化程序設(shè)計方法針對每個小模塊的設(shè)計起著十分關(guān)鍵的作用。所以結(jié)構(gòu)化程序設(shè)計方法針對每個小模塊的設(shè)計起著十分關(guān)鍵的作用。所以盡管目前面向?qū)ο蟪绦蛟O(shè)計技術(shù)和基于構(gòu)件的程序開發(fā)技術(shù)受到人們廣泛關(guān)盡管目前面向?qū)ο蟪绦蛟O(shè)計技術(shù)和基于構(gòu)件的程序開發(fā)技術(shù)受到人們廣泛關(guān)注與重視,但是結(jié)構(gòu)化程序設(shè)計技術(shù)仍然是十分重要和不可缺少的??梢哉f注與重視,但是結(jié)構(gòu)化程序設(shè)計技術(shù)仍然是十分重要和不可缺少的。可以說結(jié)構(gòu)化程序設(shè)計是一切程序設(shè)計技術(shù)
24、的基礎(chǔ),是任何軟件工作者必須掌握的結(jié)構(gòu)化程序設(shè)計是一切程序設(shè)計技術(shù)的基礎(chǔ),是任何軟件工作者必須掌握的技術(shù)。技術(shù)。本書的目標(biāo)是講授程序設(shè)計基礎(chǔ),主要介紹結(jié)構(gòu)化程序設(shè)計技術(shù)本書的目標(biāo)是講授程序設(shè)計基礎(chǔ),主要介紹結(jié)構(gòu)化程序設(shè)計技術(shù) 12.3 程序風(fēng)格程序風(fēng)格 程序風(fēng)格是指程序的書寫格式等與易讀性、清晰性、互相交流有關(guān)的,程序風(fēng)格是指程序的書寫格式等與易讀性、清晰性、互相交流有關(guān)的,而與程序執(zhí)行無關(guān)或關(guān)系不大的一些的問題。而與程序執(zhí)行無關(guān)或關(guān)系不大的一些的問題。寫程序不僅僅是為了與計算機進行交流,而且也是為了與人進行交流,寫程序不僅僅是為了與計算機進行交流,而且也是為了與人進行交流,進一步還為了給自己
25、或別人閱讀,同時程序員自己也需要不斷地查閱自己編進一步還為了給自己或別人閱讀,同時程序員自己也需要不斷地查閱自己編出的程序,更何況程序的維護很可能由別人來做。出的程序,更何況程序的維護很可能由別人來做。 在寫程序時要考慮到:程序既是為了在計算機上運行,也是為了今后的在寫程序時要考慮到:程序既是為了在計算機上運行,也是為了今后的交流和閱讀,同時還是為了留下有用的參考文檔。交流和閱讀,同時還是為了留下有用的參考文檔。 為此,程序必須是宜于閱讀的,也就是必須是結(jié)構(gòu)良好或風(fēng)格優(yōu)美的。為此,程序必須是宜于閱讀的,也就是必須是結(jié)構(gòu)良好或風(fēng)格優(yōu)美的。 程序設(shè)計風(fēng)格不好不利于產(chǎn)生正確、高效、易讀、易維護的程序
26、。風(fēng)格程序設(shè)計風(fēng)格不好不利于產(chǎn)生正確、高效、易讀、易維護的程序。風(fēng)格不好的程序會使程序維護費用與時間增加,甚至導(dǎo)致整個編程過程失敗。不好的程序會使程序維護費用與時間增加,甚至導(dǎo)致整個編程過程失敗。 程序設(shè)計風(fēng)格是程序員必須的修養(yǎng)。良好的程序設(shè)計風(fēng)格是程序員在長程序設(shè)計風(fēng)格是程序員必須的修養(yǎng)。良好的程序設(shè)計風(fēng)格是程序員在長期的編程實踐中逐步發(fā)展,積累和提煉出來的。它是產(chǎn)生正確、高效、易讀、期的編程實踐中逐步發(fā)展,積累和提煉出來的。它是產(chǎn)生正確、高效、易讀、易維護程序的一種重要的手段。易維護程序的一種重要的手段。 程序風(fēng)格主要涉及程序的行文格式、注釋和空白的合適用法、盡量使用合適的程序風(fēng)格主要涉及
27、程序的行文格式、注釋和空白的合適用法、盡量使用合適的助記名來命名標(biāo)識符、明白地表示出程序結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu)等。助記名來命名標(biāo)識符、明白地表示出程序結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu)等。 關(guān)于程序風(fēng)格沒有一個確定的統(tǒng)一標(biāo)準(zhǔn)。關(guān)于程序風(fēng)格沒有一個確定的統(tǒng)一標(biāo)準(zhǔn)。 很多組織,尤其是西方一些大的計算機公司都建立他們很多組織,尤其是西方一些大的計算機公司都建立他們自己的一些標(biāo)準(zhǔn),并要求他們的程序員遵守和使用。自己的一些標(biāo)準(zhǔn),并要求他們的程序員遵守和使用。 同時也有不少個人發(fā)表他們自己的標(biāo)準(zhǔn),希望別人仿效。同時也有不少個人發(fā)表他們自己的標(biāo)準(zhǔn),希望別人仿效。 如果程序員能養(yǎng)成良好的程序設(shè)計風(fēng)格,大家按統(tǒng)一的如果程序員能養(yǎng)成良好的程
28、序設(shè)計風(fēng)格,大家按統(tǒng)一的標(biāo)準(zhǔn)進行程序設(shè)計和書寫程序,則有助于彼此交流,有助于標(biāo)準(zhǔn)進行程序設(shè)計和書寫程序,則有助于彼此交流,有助于別人理解他們所編寫的程序。別人理解他們所編寫的程序。 我們對程序設(shè)計風(fēng)格也提出一個建議,希望能給讀者一我們對程序設(shè)計風(fēng)格也提出一個建議,希望能給讀者一個有益的提示和幫助。個有益的提示和幫助。 12.3.1 行文格式行文格式n程序的行文格式不好直接影響程序的可讀性、清晰性和外觀。程序的行文格式不好直接影響程序的可讀性、清晰性和外觀。/* A */ #include int i;main ()i=25+38;printf(“25+38=%d”,i);/* B */ #in
29、clude int i;main () i = 25+38; printf ( “25+38=%d” , i );/* C */ #include int i; /* 聲明整型變量聲明整型變量i */ int main (void) /* 主函數(shù)主函數(shù) */ i = 25+38; /* 求和運算求和運算 */ printf ( “25+38=%d” , i ); /* 打印打印 */ 下面給出下面給出“適當(dāng)使用空行、空格適當(dāng)使用空行、空格”的建議的建議: if ( b ) S1 else S2 switch ( expr ) case a1: S1 case a2: S2 . case an:
30、 sn /* switch */ 圖圖1 函數(shù)定義函數(shù)定義 圖圖2 IF語句語句 圖圖3 SWITCH語句語句 int main ( ) DS DS . /* main */ do S while (b) for(expr1;expr2;expe3) S /* for */ while ( b ) S /* while */ 圖圖4 WHILE語句語句 圖圖5 FOR語句語句 圖圖6 DO語句語句12.3.2 標(biāo)識符標(biāo)識符 標(biāo)識符是程序員給自己引進的常量、類型、變量、函數(shù)等標(biāo)識符是程序員給自己引進的常量、類型、變量、函數(shù)等起的名字。程序設(shè)計語言對如何命名標(biāo)識符沒有限制,標(biāo)識符起的名字。程序設(shè)計
31、語言對如何命名標(biāo)識符沒有限制,標(biāo)識符也沒有固定的含義。但是從使用角度看,標(biāo)識符表記的每個對也沒有固定的含義。但是從使用角度看,標(biāo)識符表記的每個對象都有具體的含義。為了提高可讀性和有助于記憶,應(yīng)該使標(biāo)象都有具體的含義。為了提高可讀性和有助于記憶,應(yīng)該使標(biāo)識符在拼寫上盡量和它所標(biāo)記對象的物理、數(shù)學(xué)等含義相一致,識符在拼寫上盡量和它所標(biāo)記對象的物理、數(shù)學(xué)等含義相一致,并且要避免與系統(tǒng)預(yù)定義的標(biāo)準(zhǔn)標(biāo)識符重名。例如,并且要避免與系統(tǒng)預(yù)定義的標(biāo)準(zhǔn)標(biāo)識符重名。例如,n表示圓周率表示圓周率 用用 pai 就比用一個一般的就比用一個一般的 a 要好;要好;n表示面積用表示面積用 area 就比用就比用 s 要好
32、;要好;n表示長度用表示長度用 length 就比用就比用 l 要好;要好; . 9.3.3 注釋注釋 注釋是間隔符的一種,在程序中的作用相當(dāng)于一個空格。注釋注釋是間隔符的一種,在程序中的作用相當(dāng)于一個空格。注釋的存在不影響程序的意義,但是它有助于人們閱讀和理解程序的存在不影響程序的意義,但是它有助于人們閱讀和理解程序, 使使原來模糊的、意義不清的部分變得清晰明了。因此,在程序中適當(dāng)原來模糊的、意義不清的部分變得清晰明了。因此,在程序中適當(dāng)加入注釋是一個好的程序設(shè)計習(xí)慣。但是也不要在不需要加注釋、加入注釋是一個好的程序設(shè)計習(xí)慣。但是也不要在不需要加注釋、意義十分明顯的地方加注釋。究竟應(yīng)該在程序
33、的什么地方加注釋,意義十分明顯的地方加注釋。究竟應(yīng)該在程序的什么地方加注釋,以及注釋應(yīng)該如何來寫,并沒有一個統(tǒng)一的標(biāo)準(zhǔn),這里也只是提一以及注釋應(yīng)該如何來寫,并沒有一個統(tǒng)一的標(biāo)準(zhǔn),這里也只是提一些建議。通常些建議。通常: 1. 所有程序都應(yīng)該從注釋開始所有程序都應(yīng)該從注釋開始 2. 所有函數(shù)也都應(yīng)該從注釋開始所有函數(shù)也都應(yīng)該從注釋開始 3. 也可以對一個程序段、一個語句、一個聲明等加注釋,以注也可以對一個程序段、一個語句、一個聲明等加注釋,以注明某程序段的功能、一個語句的作用、一個常量或變量的意義等。明某程序段的功能、一個語句的作用、一個常量或變量的意義等。 當(dāng)修改有注釋的程序時,若程序內(nèi)容被修
34、改,則相應(yīng)當(dāng)修改有注釋的程序時,若程序內(nèi)容被修改,則相應(yīng)的注釋也必須作修改。錯誤的注釋往往比沒有注釋效果更的注釋也必須作修改。錯誤的注釋往往比沒有注釋效果更壞。壞。9.3.4 關(guān)于程序的關(guān)于程序的“說明和定義說明和定義” 常量:常量:一般的,程序中使用的全部常量都要引進一個常一般的,程序中使用的全部常量都要引進一個常量標(biāo)識符,在程序中不應(yīng)該出現(xiàn)除了量標(biāo)識符,在程序中不應(yīng)該出現(xiàn)除了0、1等極其簡單的常量等極其簡單的常量以外的其它字面常量。并且常量應(yīng)該是全程的。在程序一開以外的其它字面常量。并且常量應(yīng)該是全程的。在程序一開始就定義本程序使用的全部常量,并加注釋標(biāo)明每個常量的始就定義本程序使用的全部
35、常量,并加注釋標(biāo)明每個常量的意義、使用位置等。而在每個函數(shù)中一般不應(yīng)該再包含常量意義、使用位置等。而在每個函數(shù)中一般不應(yīng)該再包含常量定義。定義。類型名:類型名:大多數(shù)情況下,類型名也應(yīng)該是全程的。但是,大多數(shù)情況下,類型名也應(yīng)該是全程的。但是,對類型的要求要比對常量寬,也可以把類型說明成局部的。對類型的要求要比對常量寬,也可以把類型說明成局部的。變量:變量:應(yīng)該按照作用和用途來選擇變量的說明位置,并應(yīng)該按照作用和用途來選擇變量的說明位置,并且應(yīng)該盡量把變量說明成局部的。且應(yīng)該盡量把變量說明成局部的。 函數(shù):函數(shù):函數(shù)一般應(yīng)該只訪問它的形式參數(shù)和局部量。如函數(shù)一般應(yīng)該只訪問它的形式參數(shù)和局部量。
36、如果必須訪問全局量,應(yīng)該加必要的注釋。果必須訪問全局量,應(yīng)該加必要的注釋。 【例例12.2】驗證三角形內(nèi)心定理:一個三角形三個角的驗證三角形內(nèi)心定理:一個三角形三個角的平分線交于一點,且該點是三角形內(nèi)接圓的圓心,如圖平分線交于一點,且該點是三角形內(nèi)接圓的圓心,如圖CBYXAdefWEFDPRQ* 12.4 程序設(shè)計實例程序設(shè)計實例 解:不失一般性,假設(shè)三角形的任意一條邊都不平行于解:不失一般性,假設(shè)三角形的任意一條邊都不平行于任意一個坐標(biāo)軸。依據(jù)解析幾何知識,該問題的驗證步驟應(yīng)任意一個坐標(biāo)軸。依據(jù)解析幾何知識,該問題的驗證步驟應(yīng)該是:該是:讀入三點讀入三點a,b,c的坐標(biāo)的坐標(biāo)(x1,y1)、
37、(x2,y2)、(x3,y3);檢驗三點是否構(gòu)成一個三角形;檢驗三點是否構(gòu)成一個三角形;若三點構(gòu)成三角形,則驗證內(nèi)心定理若三點構(gòu)成三角形,則驗證內(nèi)心定理 。開始開始驗證內(nèi)心定理驗證內(nèi)心定理結(jié)束結(jié)束是三角形是三角形讀入三點讀入三點A、B、C坐標(biāo)坐標(biāo)印印“不是三角形不是三角形” 讀入三點坐標(biāo)讀入三點坐標(biāo)只是一個讀語句,只是一個讀語句,不必求精。不必求精。 下邊求精檢驗下邊求精檢驗是否三角形和驗證是否三角形和驗證內(nèi)心定理。內(nèi)心定理。 檢驗三點是否構(gòu)成三角形使用一個檢驗三點是否構(gòu)成三角形使用一個bool型函數(shù)型函數(shù)isTriange ,可以求精成:,可以求精成: 求兩點求兩點A,B確定的直線方程確定的
38、直線方程AB ; 判斷若判斷若C在在AB上,上,則不構(gòu)成三角形,則不構(gòu)成三角形,isTriange 為為false ,否則否則 isTriange為為 true 。 求求A,B兩點直線方程兩點直線方程AB:y = a * x + bisTriange結(jié)束結(jié)束C在在AB上上return falsereturn true 判斷判斷C是否在是否在AB上只要把上只要把C帶入直線方程即可,只是一帶入直線方程即可,只是一個個bool表達式表達式 求精求兩點間直線方程求精求兩點間直線方程求兩點間直線方程可以寫一個函數(shù)求兩點間直線方程可以寫一個函數(shù) line(x1,y1,x2,y2, *a,*b )并求精成下
39、圖并求精成下圖 。 line*b = y1- (*a)*x1結(jié)束結(jié)束*a = (y2-y1)/(x2-x1)x1,y1,x2,y2:兩點坐標(biāo):兩點坐標(biāo) *a, *b :直線方程系數(shù):直線方程系數(shù)開始開始驗證內(nèi)心定理驗證內(nèi)心定理結(jié)束結(jié)束是三角形是三角形讀入三點讀入三點A、B、C坐標(biāo)坐標(biāo)印印“不是三角形不是三角形”至此,至此,“檢驗三點是否構(gòu)成三角形檢驗三點是否構(gòu)成三角形”部分完成部分完成下邊求精驗證內(nèi)心定理下邊求精驗證內(nèi)心定理驗證內(nèi)心定理可以如下進行:驗證內(nèi)心定理可以如下進行:l 求每個角的角平分線;求每個角的角平分線;l 驗證該三條直線是否交于一點;驗證該三條直線是否交于一點; 若該三條直線交
40、于一點,則驗證該點到三角形各邊距離是否相等若該三條直線交于一點,則驗證該點到三角形各邊距離是否相等 驗證內(nèi)心定理驗證內(nèi)心定理validateIncenter結(jié)束結(jié)束三條直線三條直線交于一點交于一點驗證該點到三角形驗證該點到三角形各邊距離相等各邊距離相等return false求角求角A的平分線的平分線 dBisector (ax,ay,bx,by, cx,cy,&da,&db)求角求角B的平分線的平分線 eBisector (bx,by,ax,ay,cx,cy,&ea,&eb)求角求角C的平分線的平分線 fBisector (cx,cy,ax,ay,bx,by,
41、&fa,&fb)求精求精“求角平分線函數(shù)求角平分線函數(shù)Bisector”??梢岳脦缀沃锌梢岳脦缀沃小叭切蝺?nèi)角平分線定理三角形內(nèi)角平分線定理”1.先求出角平分線與角對邊交點,先求出角平分線與角對邊交點,2.然后求角頂點與該交點的直線方程,然后求角頂點與該交點的直線方程,即為角平分線。以角即為角平分線。以角 A 為例為例 求角平分線求角平分線Bisector結(jié)束結(jié)束求角平分線求角平分線 AP 的方程:的方程:Y=aX+b求角求角 A 的平分線的平分線 d 與與 BC 邊交點邊交點 P 的的y 坐標(biāo)坐標(biāo)求角求角 A 的平分線的平分線 d 與與 BC 邊交點邊交點 P 的的x 坐
42、標(biāo)坐標(biāo) 以角以角 A 為例,按上述為例,按上述公式,公式,P點點 x、y 坐標(biāo)也坐標(biāo)也滿足上述比例關(guān)系。即有滿足上述比例關(guān)系。即有先求精先求精 “求角求角 A 的平分線的平分線 d 與與 BC 邊的交點邊的交點 P 的的 X、Y 坐標(biāo)坐標(biāo)”。由。由 “三角形內(nèi)角平分線定理三角形內(nèi)角平分線定理”,三角形一個角的,三角形一個角的角平分線分割對邊與兩相鄰邊成正比。如圖三角形角平分線分割對邊與兩相鄰邊成正比。如圖三角形ABC的的三個角三個角A、B、C的平分線分別交對邊于的平分線分別交對邊于P、Q、R,則分別,則分別有:有: CBYXAdefWEFDPRQCACBBCBAACABPCBPRABR QCA
43、Q yyxxxxyyBPBPABABPCACPCAC 可以通過該公式求得可以通過該公式求得P點坐標(biāo)。定義一個點坐標(biāo)。定義一個求求P點一個坐標(biāo)的函數(shù),然后兩次分別調(diào)用該點一個坐標(biāo)的函數(shù),然后兩次分別調(diào)用該函數(shù),以分別求出函數(shù),以分別求出P點點X、Y坐標(biāo)。以坐標(biāo)。以x坐標(biāo)為坐標(biāo)為例例 d xxxxBPA BPCA C整理后得整理后得 Px = ( Bx + d * Cx ) / (1+d)于是求坐標(biāo)用下圖描述:于是求坐標(biāo)用下圖描述:求求x(或(或y)坐標(biāo))坐標(biāo)coordinate結(jié)束結(jié)束d=AB/ACreturn ( Bx+d*CX )/(1+d)求求AC長長求求AB長長 求精求精“求求AB長長”
44、和和“求求AC長長”,算法是一樣的??梢远?,算法是一樣的??梢远x一個函數(shù)義一個函數(shù)away,分別調(diào)用該函數(shù)即可。,分別調(diào)用該函數(shù)即可。 已知兩點坐標(biāo),求兩點間距離只是一個計算公式,已知兩點坐標(biāo),求兩點間距離只是一個計算公式,away由下圖描述。由下圖描述。 求兩點間距離求兩點間距離away(x1,y1,x2,y2)結(jié)束結(jié)束return sqrt( (x2-x1)2+(y2-y1)2) 已知角頂點、角平分線與對邊交點,計算角平分線。就已知角頂點、角平分線與對邊交點,計算角平分線。就是是“已知兩點,求過該兩點的直線方程已知兩點,求過該兩點的直線方程”,可以調(diào)用函數(shù),可以調(diào)用函數(shù)line 。 驗證
45、內(nèi)心定理驗證內(nèi)心定理validateIncenter結(jié)束結(jié)束三條直線三條直線交于一點交于一點驗證該點到三角形驗證該點到三角形各邊距離相等各邊距離相等return false求角求角A的平分線的平分線 dBisector (ax,ay,bx,by, cx,cy,&da,&db)求角求角B的平分線的平分線 eBisector (bx,by,ax,ay,cx,cy,&ea,&eb)求角求角C的平分線的平分線 fBisector (cx,cy,ax,ay,bx,by,&fa,&fb) 至此至此 “驗證內(nèi)心定理驗證內(nèi)心定理”的的 “求角平分線求角平分線”
46、部分求精結(jié)部分求精結(jié)束。束。 下邊求精下邊求精 “判斷三直線是否交于一點判斷三直線是否交于一點” 。 “判斷三直線是否交判斷三直線是否交于一點于一點”。可以先求兩直??梢韵惹髢芍本€交點線交點W,再判斷另一直,再判斷另一直線是否過該點。得線是否過該點。得 三條直線三條直線交于一點交于一點isOnePoint結(jié)束結(jié)束求兩直線求兩直線 d 與與 e 交點交點Wreturn truereturn falseW滿足方程滿足方程 f已知兩直線方程,已知兩直線方程,求交點就是解聯(lián)立求交點就是解聯(lián)立方程,只是兩個計方程,只是兩個計算公式,表現(xiàn)為算公式,表現(xiàn)為 求兩直線交點求兩直線交點pointOFinters
47、ectiony = a1*x+b1結(jié)束結(jié)束x = -(b1-b2)/ (a1-a2)W滿足方程滿足方程 f,就是一個,就是一個bool表達式表達式 wy = wx * fa +fb 即即 fabs(a3*(*x) +b3-y)eps ,不用求精,不用求精 驗證內(nèi)心定理驗證內(nèi)心定理validateIncenter結(jié)束結(jié)束三條直線三條直線交于一點交于一點驗證該點到三角形驗證該點到三角形各邊距離相等各邊距離相等return false求角求角A的平分線的平分線 dBisector (ax,ay,bx,by, cx,cy,&da,&db)求角求角B的平分線的平分線 eBisector
48、(bx,by,ax,ay,cx,cy,&ea,&eb)求角求角C的平分線的平分線 fBisector (cx,cy,ax,ay,bx,by,&fa,&fb) 至此至此“驗證內(nèi)心定理驗證內(nèi)心定理”的的 “三條直線交于一點三條直線交于一點” 部分求精結(jié)部分求精結(jié)束。束。 下邊求精下邊求精 “驗證該點到三角形各邊距離相等驗證該點到三角形各邊距離相等”。 “判斷判斷w點到三條邊距離是否相等點到三條邊距離是否相等”。應(yīng)該分別求。應(yīng)該分別求w到三到三條邊距離條邊距離wd、we、wf;然后判斷是否;然后判斷是否 wd=we=wf 距離相等?距離相等?validateDista
49、nce結(jié)束結(jié)束求求w到到BC邊距離邊距離wd求求w到到AB邊距離邊距離wf求求w到到AC邊距離邊距離we印印 O.Kwd=we=wf印印 false分別求分別求 wd、we、wf 可以設(shè)計一個可以設(shè)計一個 “求一點到一條直線距求一點到一條直線距離離”的函數(shù)的函數(shù) distance,然后分別三次調(diào)用該,然后分別三次調(diào)用該distance函數(shù)。函數(shù)。而求一點到一條直線距離只是一個數(shù)學(xué)公式。設(shè)直線方程為:而求一點到一條直線距離只是一個數(shù)學(xué)公式。設(shè)直線方程為:Ax+By+C=0 點(點(x0、y0)到該直線的距離)到該直線的距離 D 為:為:2200BACYBXAD點到直線距離點到直線距離distan
50、ce結(jié)束結(jié)束return abs(A*x0+B*y0+C)/sqrt(A*A+B*B)函數(shù)函數(shù)distance描述成:描述成:驗證內(nèi)心定理驗證內(nèi)心定理validateIncenter結(jié)束結(jié)束三條直線三條直線交于一點交于一點驗證該點到三角形驗證該點到三角形各邊距離相等各邊距離相等return false求角求角A的平分線的平分線 dBisector (ax,ay,bx,by, cx,cy,&da,&db)求角求角B的平分線的平分線 eBisector (bx,by,ax,ay,cx,cy,&ea,&eb)求角求角C的平分線的平分線 fBisector (cx,cy
51、,ax,ay,bx,by,&fa,&fb) 至此至此 “驗證內(nèi)心定理驗證內(nèi)心定理”整個求精結(jié)束。整個求精結(jié)束。 開始開始驗證內(nèi)心定理驗證內(nèi)心定理結(jié)束結(jié)束是三角形是三角形讀入三點讀入三點A、B、C坐標(biāo)坐標(biāo)印印“不是三角形不是三角形” 全部問題也整個求精結(jié)束全部問題也整個求精結(jié)束/*PROGRAM test*/#include stdio.h#include math.h#include stdlib.h#define eps 1e-5 / 精度控制精度控制/* 函數(shù)原型部分函數(shù)原型部分 */bool isTriangle(float,float,float,float,float
52、,float); / 判斷三點是否構(gòu)成三角形判斷三點是否構(gòu)成三角形void line(float,float,float,float,float*,float*); / 求由兩點所確定直線方程系數(shù)求由兩點所確定直線方程系數(shù)y=a*x+bvoid validateIncenter(float,float,float,float,float,float);/ 驗證內(nèi)心定理驗證內(nèi)心定理void Bisector(float,float,float,float,float,float,float*,float*); / 求角平分線求角平分線float coordinate(float,float,fl
53、oat,float,float,float,float,float);/ 求角平分線與對邊交點求角平分線與對邊交點x、y坐標(biāo)的一個坐標(biāo)的一個float away(float ,float ,float ,float ); / 計算兩點距離計算兩點距離bool isOnePoint(float,float,float,float,float,float,float*,float*); /三條直線交于一點三條直線交于一點?計算交點坐標(biāo)計算交點坐標(biāo)void pointOFintersection(float,float,float,float,float*,float*); / 求兩直線交點求兩直線
54、交點wvoid validateDistance(float,float,float,float,float,float,float,float); /驗證一點到三邊距離是否相等驗證一點到三邊距離是否相等float distance(float ,float ,float ,float , float ,float ); / 計算點到直線距離計算點到直線距離編出程序如下編出程序如下 /*主程序主程序*/void main()float ax,ay,bx,by,cx,cy;/三點坐標(biāo)三點坐標(biāo) /輸入三角形三點坐標(biāo)輸入三角形三點坐標(biāo)printf(please input coordinat of
55、point a:); scanf(%f%f,&ax,&ay);printf(please input coordinat of point b:);scanf(%f%f,&bx,&by);printf(please input coordinat of point c:);scanf(%f%f,&cx,&cy); if(isTriangle(ax,ay,bx,by,cx,cy)/ 判斷是否三角形判斷是否三角形 / 是三角形,則驗證內(nèi)心定理是三角形,則驗證內(nèi)心定理 validateIncenter(ax,ay,bx,by,cx,cy); else/
56、 不是三角形不是三角形 printf(false:the three points are on the same line!n);/* 圖圖12.3,判斷三點是否構(gòu)成三角形,判斷三點是否構(gòu)成三角形*/* 參數(shù)參數(shù)float x1,float y1,float x2,float y2,float x3,float y3 頂點坐標(biāo)頂點坐標(biāo)*/* 函數(shù)返回值為三點是否構(gòu)成三角形標(biāo)志函數(shù)返回值為三點是否構(gòu)成三角形標(biāo)志 */bool isTriangle(float x1,float y1,float x2,float y2,float x3,float y3) float a,b; line(x1,
57、y1,x2,y2,&a,&b);/第第1,2點連線的斜率和截距點連線的斜率和截距 if(fabs(a * x3 + b-y3)eps)/帶入第帶入第3點點,判斷是否在同一直線判斷是否在同一直線return false;/ 在直線上,則不是三角形在直線上,則不是三角形 elsereturn true;/ 不在直線上,則是三角形不在直線上,則是三角形/* 圖圖12.4,求由兩點所確定直線方程系數(shù),求由兩點所確定直線方程系數(shù)y=a*x+b */* 參數(shù)參數(shù)float x1,float y1,float x2,float y2兩點坐標(biāo);兩點坐標(biāo);*/* 參數(shù)參數(shù)float *a,flo
58、at *b 指針類型,帶回截斜式直線方程系數(shù)指針類型,帶回截斜式直線方程系數(shù) */void line(float x1,float y1,float x2,float y2,float *a,float *b) if (fabs(x1-x2)eps)/ 保障程序健壯性保障程序健壯性printf(直線平行于直線平行于Y軸:軸:(%f , %f)、(%f ,%f)n,x1,y1,x2,y2);exit(0); *a=(y1-y2)/(x1-x2); *b=y1-(*a)*x1;/* 圖圖12.5,驗證內(nèi)心定理,驗證內(nèi)心定理 */* 參數(shù)參數(shù)float ax,float ay ,float bx,f
59、loat by ,float cx,float cy 三個頂點坐標(biāo)三個頂點坐標(biāo)*/void validateIncenter(float ax,float ay ,float bx,float by ,float cx,float cy) float da,db,ea,eb,fa,fb;/ 角平分線角平分線 d、e、f系數(shù)系數(shù) float wx,wy;/ 內(nèi)心坐標(biāo)內(nèi)心坐標(biāo) bisector(ax,ay,bx,by,cx,cy,&da,&db);/ 求角求角A平分線平分線d bisector(bx,by,ax,ay,cx,cy,&ea,&eb); / 求角求角B平
60、分線平分線e bisector(cx,cy,ax,ay,bx,by,&fa,&fb); / 求角求角C平分線平分線f / 驗證交于一點?并求內(nèi)心驗證交于一點?并求內(nèi)心W if ( isOnePoint(da,db,ea,eb,fa,fb,&wx,&wy) ) / 交于一點!驗證距離相等?交于一點!驗證距離相等?validateDistance(ax,ay,bx,by,cx,cy,wx,wy); else / 不交于同一點不交于同一點printf(false: the three lines are not on the same point!);/* 圖圖12.6,求角平分線,求角平分線 */* 參數(shù)參數(shù)float rx,float ry是角頂點坐標(biāo)是角頂點坐標(biāo) */* 參數(shù)參數(shù)float sx,float sy,float tx ,float ty分別是三角形另兩點坐標(biāo)分別是三角形另兩點坐標(biāo)*/* 參數(shù)參數(shù)float *a,float *b指
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 倉儲設(shè)備維護與管理員聘用與服務(wù)協(xié)議
- 高端車庫抵押貸款合同范本
- 管道損壞協(xié)議書范本
- 采棉企業(yè)員工勞動合同范本
- 車貸保證金及違約責(zé)任規(guī)范合同
- 環(huán)保工程場地調(diào)查與合同
- 磁通量索力實時監(jiān)測技術(shù)研究與應(yīng)用
- 泥石流區(qū)橋梁清淤導(dǎo)流工程方案
- 非煤礦山安全操作規(guī)程
- 風(fēng)冷機房空調(diào)的安裝與驗收標(biāo)準(zhǔn)
- 《熊貓小四》知識點匯-總以及這本書閱讀題測試
- 《膽管炎的護理》課件
- 中國概況(英文版)課件
- 2025年中國orc低溫余熱發(fā)電系統(tǒng)行業(yè)分析及發(fā)展趨勢預(yù)測
- 中醫(yī)護理疑難病例討論
- 2025年江蘇啟東市勞務(wù)技術(shù)經(jīng)濟開發(fā)有限公司招聘筆試參考題庫含答案解析
- 房屋市政工程施工現(xiàn)場安全風(fēng)險分級管控與防范措施清單
- 山西焦煤招聘筆試題庫2025
- DB50-T 1808-2025“一表通”智能報表市級業(yè)務(wù)數(shù)據(jù)規(guī)范
- 房屋市政工程生產(chǎn)安全重大事故隱患判定檢查表(2024版)
- 高企研發(fā)費用培訓(xùn)
評論
0/150
提交評論