




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