版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
冰MQN
下載
第15章計(jì)算機(jī)程序設(shè)計(jì)
星期二晚上,你和一群朋友學(xué)習(xí)到很晚,饑腸轆轆,大家商議去吃比薩餅。但你們掏出所
有的錢也只有24.63美元,根本不夠八個(gè)人填飽肚子??磥磉€是多轉(zhuǎn)幾家餅店,比較一下價(jià)格,
“少花錢,多辦事”。
你們先到了VanGo餅店,發(fā)現(xiàn)8.99美元可以買一塊直徑為8英寸且?guī)щp層奶油的圓餅。接著
在Venice店發(fā)現(xiàn)11.99美元可以買??塊邊長(zhǎng)為10英寸的方形比薩餅。哪個(gè)價(jià)格更好呢?你想找個(gè)
計(jì)算器但找不到,一個(gè)朋友帶了一臺(tái)筆記本電腦,所以你可以編段程序來比較一下比薩餅的價(jià)
格。那么,接下來該怎么做呢?
計(jì)算機(jī)程序設(shè)計(jì)就是編寫一些指令驅(qū)動(dòng)計(jì)算機(jī)完成特定的工作。這一章將對(duì)此做一介紹。
計(jì)算機(jī)編程的基本概念包括:?jiǎn)栴}描述、算法、編碼、控制結(jié)構(gòu)、調(diào)試和建立文檔。本章還包
括描述各種編程語言的特征、簡(jiǎn)介當(dāng)今最流行的編程語言。本章是進(jìn)行程序設(shè)計(jì)的基礎(chǔ)。
本章概要
在本章中你將對(duì)計(jì)算機(jī)編程有初步的認(rèn)識(shí),而且將針對(duì)“比薩餅問題”編
寫一-個(gè)小程序。你可以用在這里學(xué)到的知識(shí)與技巧去解決很多可用計(jì)算機(jī)解決
的問題。同時(shí)你將學(xué)到一些程序員用來描述、編寫和調(diào)試程序的方法論。不管
你從事軟件開發(fā)工作還是應(yīng)用計(jì)算機(jī),理解這些原則都會(huì)對(duì)你有益。讀完這一
章你將能夠做到:
?區(qū)別系統(tǒng)分析師和軟件工程師。
?列出如今流行的編程語言。
?以國(guó)防部標(biāo)準(zhǔn)描述大型程序和小型程序的區(qū)別。
?在問題描述中鑒別哪些是假設(shè)?哪些是已知條件。實(shí)驗(yàn)
?描述算法、偽代碼和程序代碼之間的關(guān)系。
?列出至少四種表達(dá)算法的方法。
?鑒別簡(jiǎn)單的BASIC程序中的控制結(jié)構(gòu)。
?描述程序中語法錯(cuò)誤和邏輯錯(cuò)誤的區(qū)別??梢暬绦?/p>
?解釋程序正文、注釋和用戶參考手冊(cè)的用途。設(shè)計(jì)
?簡(jiǎn)述區(qū)分各種編程語言的主要特征。
15.1軟件工程
軟件工程是指軟件的開發(fā)、運(yùn)作、維護(hù)和最終消亡的整個(gè)系統(tǒng)過程。軟件工程師負(fù)責(zé)信息
系統(tǒng)所用軟件的編寫工作。系統(tǒng)分析師和軟件工程師的工作是交織在一起的,但也有所不同。
一個(gè)系統(tǒng)分析師要計(jì)劃整個(gè)信息系統(tǒng),包括硬件、軟件、員工和數(shù)據(jù)。而軟件工程師則致力于
理%>軟件設(shè)計(jì)、編程和調(diào)試這些信息系統(tǒng)的軟件組件上。
/CT.'
WWW\對(duì)于一個(gè)并不打算成為程序員的人來說,學(xué)習(xí)軟件開發(fā)和電腦編程又有什么意義
7呢?首先,你可能在工作中會(huì)使用許多程序,你會(huì)發(fā)現(xiàn)一個(gè)字處理軟件就包含75萬行程
軟件工程序,存在一些錯(cuò)誤是無法避免的。同樣,你會(huì)發(fā)現(xiàn),一個(gè)人很難完成一個(gè)字處理軟件的
1
428計(jì)算機(jī)文化?哪可0附
編寫,這些最好留給專業(yè)的編程小組去做。雖然你不會(huì)去專門編寫自己想用的軟件,但你可能會(huì)
修改一些軟件來滿足你特殊的要求,這時(shí),你對(duì)計(jì)算機(jī)編程的了解將有助于你擬訂建設(shè)性的計(jì)劃。
15.1.1計(jì)算機(jī)程序
。寫一個(gè)程序很難嗎?
和你所使用的商業(yè)軟件相比,這里你所接觸到的程序是微不足道的。按照國(guó)防部的標(biāo)準(zhǔn),
少于100000條指令稱為小程序,100000?1000000行的歸為中等,超過1000000行就是大程
序了。據(jù)統(tǒng)計(jì),一個(gè)程序員平均每天只能完成20行指令。這并不奇怪,因?yàn)橐粋€(gè)商用軟件通常
由一個(gè)程序員小組來完成,而且要花幾個(gè)月、甚至幾年時(shí)間。
在第2章中我們講過計(jì)算機(jī)就是告訴計(jì)算機(jī)如何解決問題的一系列指令的集合。但“寫程
序”不同于“寫信”。寫信時(shí),只要能表達(dá)你的思想,可以不管其結(jié)構(gòu)和效率,寫程序則不然。
人與人之間交流時(shí),有歧義的句子有時(shí)仍能表辭達(dá)意。比如,你的朋友突然在上學(xué)路上說:
門沒鎖。你肯定知道他講的是忘了鎖上家門,而不是門上沒有鎖。但計(jì)算機(jī)卻沒有人那么發(fā)達(dá)
的思維,給計(jì)算機(jī)編寫程序需要縝密的思考與斟酌。因此,計(jì)算機(jī)編程很強(qiáng)調(diào)結(jié)構(gòu)性,絲毫不
能馬虎。
寫程序也要比寫信難得多,但軟件開發(fā)過程中有一些原則可以幫你理出一些頭緒。計(jì)算機(jī)
程序設(shè)計(jì)首先從問題的描述開始,它是算法的基礎(chǔ),而算法則是程序的基礎(chǔ)。接下來我們將對(duì)
問題描述、算法分析和程序指令進(jìn)行詳細(xì)的討論。
15.1.2問題描述
。對(duì)前述比薩餅問題怎樣進(jìn)行好的描述呢?
提出問題才能解決問題,就像前面的例子:哪個(gè)比薩餅店更好呢?這種提法很模糊,對(duì)你
解決問題并無幫助,因?yàn)樗鼪]有告訴你哪些是已知條件。你知不知道各個(gè)餅店的價(jià)錢?餅的大
小?奶油層有多少?“哪個(gè)餅店更好?”這種提法并沒有解釋“好”的含義,是僅僅指餅的價(jià)
錢低,還是指同樣多的錢買的餅?zāi)逃蛯佣?,還是指你們僅有的24.63美元能買到的餅越大越好
呢?看一下圖15-1,你能否得出關(guān)于上面問題的一種更好的問題描述呢?
Tryour10"SquarePizza
Any2Toppingsjust$n.99
MMMKTHE
VENICE
ThMiAHerryRigRaw**
圖15-1買什么樣的比薩餅最合算
問題描述就是要說明一些能用來解決問題的要素。?個(gè)表達(dá)清晰的問題描述應(yīng)該具備以下
三個(gè)特征:
?能說明描述問題范疇的任何假設(shè)。
班。哪QM
M第15章計(jì)算機(jī)程序設(shè)計(jì)429
下載
?羅列出已知的所有條件。
?具體說明需要解決什么問題。
在一個(gè)問題描述中,假設(shè)就是為了方便設(shè)計(jì)而假定的認(rèn)為是正確的陳述。比如,在比薩餅
問題中,你可以假設(shè)只比較兩種類型的比薩餅:方的和圓的。為了簡(jiǎn)化問題,你可以假設(shè)沒有
長(zhǎng)方形的餅,這是因?yàn)槟闼鉀Q的問題只與餅的面積有關(guān),長(zhǎng)和寬并不重要。還可以假設(shè)所
比較的比薩餅有相同厚度的奶油層。最后還可以說明,單位面積比薩餅價(jià)格低的就是最好的。
問題描述中的已知信息就是你要計(jì)算機(jī)幫你解決問題時(shí)提供給它的信息。對(duì)于比薩餅問
題,已知信息包括兩個(gè)餅店的比薩餅價(jià)錢、形狀、大小。已知信息在問題描述中經(jīng)常用“已
知”來給出,例如“已知兩餅店餅的價(jià)格、形狀、大小……”
在你說明了已知條件后,你應(yīng)該說明問題解決后你該如何做決定,也就是想讓程序給你輸
出什么信息。當(dāng)然,在運(yùn)行程序之前你并不知道答案,正如你不知道哪個(gè)餅店更實(shí)惠,但你可
以告訴計(jì)算機(jī)它應(yīng)該輸出哪個(gè)餅店更好。
假設(shè)你和朋友認(rèn)為,能以最低的價(jià)錢買到最大的餅就是最實(shí)惠的餅店,即單位面積的餅的
價(jià)格最低,這樣每平方英寸5美元的餅就比7美元的餅實(shí)惠。因此,只要能算出餅的單位價(jià)格,
比較它們,然后打印信息指出哪個(gè)餅店的價(jià)格低,問題就解決了。可以這樣來寫問題描述:計(jì)
算機(jī)算出比薩餅每平方英寸的價(jià)錢,然后輸出是第一種還是第二種單位面積價(jià)格較低。
經(jīng)過對(duì)問題的深入分析,可以做一些假設(shè)。最后,比薩餅問題的描述如下:
比較兩種比薩餅,它們有相同多的奶油層,一種方的,一種圓的;已知價(jià)錢、形狀和大
??;計(jì)算機(jī)計(jì)算兩種比薩餅每平方英寸的價(jià)錢并輸出那種價(jià)格低。
上面這種描述不易理解,下面這種格式較好:
假設(shè):
兩類比薩餅,Pl、P2
奶油層相等
一種方的,一種圓的,都不是長(zhǎng)方形
單位面積價(jià)錢低的為最好
已知:
pPl=**;pP2=**(pPi為餅的價(jià)錢)
P1,P2的形狀
PLP2的大小(以英寸為單位)
求:
每平方英寸餅的價(jià)錢(pPl,pP2)
輸出:
若pPl<pP2,打印“PI店更實(shí)惠”
若pPl>pP2,打印“P2店更實(shí)惠”
若pPl=pP2,打印“兩店一樣”
##
現(xiàn)在我們學(xué)習(xí)了如何寫問題描述,然后進(jìn)行編程的下一步——算法設(shè)計(jì)。
15.1.3算法設(shè)計(jì)
。如何為比薩餅問題規(guī)劃一個(gè)算法?
算法就是解決問題的步驟。算法是一個(gè)抽象的思想,但它是可表達(dá)的且是可執(zhí)行的。比如,
430計(jì)算機(jī)文化
做奶酪面包就是這樣一組步驟:把水燒開;蒸面包;最后加上奶酪。這些“算法”可以在菜譜
上作為步驟記錄或陳述下來,并且你能照著去操作。
信息網(wǎng)?可行性是一個(gè)正確算法的重要特征,如果你耐心地按照算法一步步做,你一定可
以得出正確答案。同樣,如果你按菜譜上的步驟,你也一定能做出奶酪面包。
算法是根據(jù)問題描述中給定的信息得出的。算法一開始并不寫成規(guī)則的程序語言,
算法這樣軟件工程師就可以不管程序語法方面的問題,而致力于計(jì)算方法的設(shè)計(jì)。在下面
2的階段,把算法改寫成符合程序設(shè)計(jì)語言語法的語句,算法就可以執(zhí)行了。
如果你是剛剛開始編程工作的,可能搞不清算法寫到什么程度才算詳盡。比如,該不該具
體說明諸如“如何執(zhí)行”這類問題呢?其實(shí)算法的詳盡程度和你要使用什么程序設(shè)計(jì)語言有關(guān)。
當(dāng)你把一門語言中所有句型的語法語義都搞熟時(shí),算法只要能表達(dá)你的意思就行了。對(duì)比薩餅
問題,假設(shè)你使用的是BASIC語言。表15-1給出了一些基于BASIC語言的恰倒好處的算法指令。
表15-1一個(gè)BASIC程序算法中寫法的樣本
算法實(shí)現(xiàn)的任務(wù)實(shí)例
賦值Size=10
列出公式SquareInchPrice=Price/SquareInches
等待輸入數(shù)據(jù)EnterthePriceofapizza
顯示計(jì)算結(jié)果DisplaytheSquarelnchPrice
得出結(jié)論Ifthepizzaissquare.calculateSquareinchesbymultiplyingtheSize*Size
重復(fù)某些操作Repeatthepricecalculationsforasmanypizzasastheuserwants
設(shè)計(jì)算法,一般你會(huì)先自己解決這個(gè)問題,然后再把這些步驟記錄下來,因此必須先知道
一些信息,像比薩餅的成本、大小和形狀等。同樣計(jì)算機(jī)也需要這些初始信息,在算法中應(yīng)該
具體說明計(jì)算機(jī)如何取得它。程序運(yùn)行時(shí),提示用戶輸入這些信息。算法可以這樣寫:
AsktheuserfortheshapeofthefirstpizzaandholditinRAMasShape1.
AsktheuserforthepriceofthefirstpizzaandholditinRAMasPrice1.
AsktheuserforthesizeofthefirstpizzaandholditinRAMasSizel.
接著你的算法應(yīng)該詳細(xì)說明如何操作這些信息。你想計(jì)算比薩餅每平方英寸的價(jià)錢,但像
“Calculatethepricepersquareinch”這樣的指令既沒有說明如何計(jì)算,也沒有說明對(duì)方餅和圓
餅兩種不同情況的處理方法。一種更為恰當(dāng)?shù)膶懛ㄈ鐖D15-2所示。
2.計(jì)算圓形比薩餅的面積,
1.計(jì)算正方形比薩餅的
diamel使用計(jì)算圓形面積的公式兀BK
面積,用一條邊長(zhǎng)乘以另
約等于3.142,r?是圓半徑的平
一條邊長(zhǎng)。由于正方形邊.
長(zhǎng)相等,可以用公式.方。比薩餅的大小是用直徑來
表示的,所以需要將直徑除以
Sizel*Sizel計(jì)算
2得到半徑。使用Sizel/2。然
后,求半徑的平方?!北硎居?jì)
算機(jī)中的二次平方
IfShape1is?
calculate
3.求出比薩餅的面積后,
乘以每平方英寸的價(jià)可即可
圖15-2計(jì)算每平方英寸比薩餅的算法
卜線輸?shù)?5章計(jì)算機(jī)程序設(shè)計(jì)431
下載
上面的算法可以算出一塊比薩餅的單價(jià),對(duì)第二塊還要寫出同樣的算法:
AsktheuserfortheshapeofthesecondpizzaandholditinRAMasShape2
AsktheuserforthepriceofthesecondpizzaandholditinRAMasPrice2
AsktheuserforthesizeofthesecondpizzaandholditinRAMasSize2
IfShape2issquarethencalculatethesquareinchesusingtheformula:
Squareinches2=Size2*Size2
IfShape2isroundthencalculatethesquareinchesusingtheformula:
Squareinches2=3.142*(Size2/2)A2
SquareinchPrice2=Price2/Squareinches2
最后算法還要指出計(jì)算機(jī)如何輸出信息。你想讓它告訴你哪種比薩餅單價(jià)低,算法可以這
樣寫:
ifSquareinchPrice1<SquareinchPrice2thendisplaythemessage“Pizza1isthebestdeal.”
ifSquareinchPrice2>SquareInchPricelthendisplaythemessage“Pizza2isthebestdeal.”
不要忘記若兩種單價(jià)相等程序該輸出什么:
ifSquareinchPrice1=SquareinchPrice2thendisplaythemessage“Bothpizzasarethesamedeal.”
比薩餅問題的整個(gè)算法如圖15-3所示。
輸入Pizzal的形狀賦值給Shapely
輸入Pizzal的價(jià)錢賦值給Pricel取第一張比薩餅的信息
輸入Pizza1的大小賦值給Size1-
ifShape1issquarethen―
calculatethesquareinchesusingtheformula:
計(jì)算第一張比薩餅每
Squareinches1=size1*sizel
平方英寸的價(jià)格
IfShape1isroundthen
Calculatethesquareinchesusingtheformula:一
Squareinches1=3.l42*(sizel/2)A2
SquarelnchesPricel=Pricel/Squarelnchsl
輸入Pizza2的形狀賦值給Shape2
輸入Pizza2的價(jià)錢賦值給Price2取第二張比薩餅的信息
輸入Pizza2的大小賦值給Size2-
ifShape2issquarethen-
calculatethesquareinchesusingtheformula:
Squareinches2=size2*size2計(jì)算第二張比薩餅每
ifShape2isround(hen平方英寸的價(jià)格
calculatethesquareinchesusingtheformula:
Squareinches2=3.142*(size2/2)A2一
SquareInchesPrice2=Price2/SquareInchs2
IfSquareinchesPriceI<SquareinchPrice2then
Displaythemessage“Pizzalisthebestdeal”
IfSquareinchesPrice1>SquareinchPrice2then
輸出結(jié)果
Displaythemessage“Pizza2isthebestdeal”
IfSquareinchesPrice1=SquareinchPrice2then
Displaythemessage“bothPizzaarethesamedeal”一
圖15-3(比薩餅的算法)
432計(jì)算機(jī)文化
—?下載
15.1.4算法表達(dá)
。表達(dá)一個(gè)算法的最好方法是什么?
有幾種方法表達(dá)一個(gè)算法:結(jié)構(gòu)化英語、偽代碼、流程圖和對(duì)象定義。這些工具
不是程序設(shè)計(jì)語言,它們不能直接被計(jì)算機(jī)執(zhí)行。使用它們的目的就是把你的思想用
文字表述出來。
偽代嬴結(jié)構(gòu)化英語是英語的一個(gè)子集,用簡(jiǎn)短的句型反映過程的進(jìn)行。如圖15-4表示
?如何用結(jié)構(gòu)化英語來表達(dá)比薩餅問題的算法。
?.另一個(gè)表達(dá)算法的方法是偽代碼。偽代碼好比是算法的注釋系統(tǒng),由英語和你熟悉的編程
語言混合而成。偽代碼沒有結(jié)構(gòu)化英語規(guī)整,你可以隨心所欲地去寫。而且可以融入編程語言
的一些函數(shù)和語法。比較圖15-4和圖15-3,可以發(fā)現(xiàn)結(jié)構(gòu)化英語和偽代碼的區(qū)別。
displaypromptsforenteringshape,price,andsize
li^utShapel,Pricel,Sizel
ifShapel=squarethen
SquareInchesi?Sizel*Sizel
ifShapel=roundthen
Squarelnchesl?3.142*(Sizel/2)A2
SquarelnchPricel?Pricel/Squarelnchesl
displaypromptsforenteringshape,price,andsize
inputShape2zPrice2zSize2
ifShape2-squarethen
Squarelnches2■Size2*Size2
ifShape2=roundthen
SquareInches2-3.142*(Size2/2)人2
SquarelnchPriceZ-Price2/SquareInches2
ifSquarelnchPricel<SquareInchPrice2then
output"Pizza1isthebestdeal.”
ifSquareInchPrice2<SquarelnchPricelthen
output"Pizza2isthebestdeal."
ifSquarelnchPricel=SquareInchPrice2then
玷蟠output"Bothpizzasarethesamedeal."
圖15-4比薩餅程序的偽代碼
第三種方法是流程圖。流程圖是描述計(jì)算機(jī)?步一步完成任務(wù)的圖表。圖15-5為比薩餅問
題的流程圖。
另一種表達(dá)算法的方法是定義計(jì)算機(jī)要執(zhí)行的對(duì)象,并定義操縱每個(gè)對(duì)象的方法。這種方
法對(duì)面向?qū)ο蟮某绦蛟O(shè)計(jì)很有價(jià)值,后面還將討論。圖15-6定義了一個(gè)關(guān)于比薩餅問題的對(duì)象。
習(xí)題八
1.如果你是一個(gè),你會(huì)致力于信息系統(tǒng)中軟件組件的開發(fā)。
2.按美國(guó)國(guó)防部的標(biāo)準(zhǔn),約100000行代碼的程序稱為大程序。是對(duì)還是錯(cuò)?
3.寫一個(gè)計(jì)算機(jī)程序之前,必須寫來定義一些運(yùn)行中要用到的元素。
4._____是完成任務(wù)或解決問題的步驟的有機(jī)集合。
5.英語和程序設(shè)計(jì)語言混合使用稱之為o
6.____是描述計(jì)算機(jī)一步一步解決問題的圖形表示方法。
圖15-5比薩餅程序流程圖
434-______的加雌嚼
Object:CalculateBestDeal
Type:Button
Appearance:「CalculateBestDeal一
Method:1
ifShapel=?square*THDJSquareInches1=Sizcl?Sizel
ifShcipel="round"THEMSquarelnchesl=3.142?(Sizel/21*2
SquareTnchPricel=Pricel/Squarelnchesl
ifShap?2c,square*THE11Squaxelnches2=Slze2?Size2
ifShape?u-round*THE34Squarelnches2=3.142?(Size2/2)*2
SquareTnchPrice2=Price2/Squarelnches2
ifSquarelnchPrlcel<SquareInchPrice2thaiBestDeala"Pizza1isChe
bestdeal."
ifSquareInchPrice2<SquarelnchPricelthenBestDeal="Pizza2isthe
bestdeal."
ifSquarelnchPricel=SquarelnchPrice2thenBestDeal=*Bothpizzasare
thesamedeal."
圖15-6比薩餅程序的對(duì)象描述
15.2編寫計(jì)算機(jī)程序
問題描述和算法通常寫入程序說明書,它們是程序設(shè)計(jì)必不可少的藍(lán)圖。寫完了
程序說明書后,就可以編寫程序了。程序的編寫就是用程序設(shè)計(jì)語言把算法程序化。
編寫程序的人稱為程序員。對(duì)于大部分程序設(shè)計(jì)語言來說,編程就是輸入命令;還有
程序號(hào)計(jì)一部分語言只需你選擇對(duì)象和屬性或編寫對(duì)象的腳本即可。
工作
4用BASIC編寫比薩餅問題的程序,你只需輸入一連串的命令。圖15-7給出了它的
完整的程序。仔細(xì)閱讀,就能對(duì)程序的基本架構(gòu)有一個(gè)大致的了解。
命令字用黑體表示
程序?qū)懗梢粋€(gè)步驟表計(jì)算機(jī)從表中的頂部開始執(zhí)行
RQ4r:/--Pizza:rograr,1
RMThisprogramtellsyouwhichoftwopizzasisthebestdeal.用REM開頭表示注
REMtoyc?a:c;;ariEgthepricepersquareinchofeachpizza.釋來解釋一段程序
REMCollect:n:orn:i:ic-forrirsrpizza.
INPOT"Entertheshapeofpizzaone:*,Shape■$
INPOT-Enter二:沿priceofpizzaone:\Pricel.數(shù)據(jù)存儲(chǔ)在變量或存儲(chǔ)
INPOT"Enter二二9pizzaz*:",Jizci地址中。變量Shapel$
RO(pricece:squareinchforpizza.存儲(chǔ)文本,如"round”
$表示文本變量。其他
if比二firstpizzais=:Tjare,ttysquareinchesbyrnureplying
onesidefaytheother.變量,如Fricel存儲(chǔ)數(shù)
Ifatx:1:.二"square'THEN二Size.,.
據(jù)值,該變量名不合$
REM::th-:ny\oi::zaisrcjid,-Mlcjiar.vw必先:u.-quare:rz±”::vvtRre
REMpi.142,E;"2--rai/21-:73由=squa:':
If.:-THENR.m-1、::,:,二?C二二21A2
SquarelnchPricel=Pricel/Squareinches]
REMCo.Lrr::t.initial:r.:oi7ar:or.torsecondpizza.
INPOT'Entershapeofpizzatwo:*,Shape2$
INPOT'EiiLvi?:.?/oipizzatwo:",?iice2
INPUT-Er.rerr.r;esi:?:-)fpizza:wo:Size2
REMCa;<''.!a'-'-pricepersquareinchforseconcipizza.
IfShnpe2$-"square*THEN-Tjarelr.chesi-Size:.*Size2
Ifc:iape2$二?round,THEN二?.142,.Size2:2):
SquareInchPrice2=Price2/Squaralnches2
REMDeT;;whichpizzaisri>」:圮匕<kulaiddispl-.y:esu!,s.
IfSquarelnchPricel<SquareInchPrice2imMessages="Pizza1isthebestdeal.*!
XfSquareInchPrice2<SquarelnchPricelU08HMessage$="Pizza2isthebestdeal.*
IfSquarelnchPricel=Squareiricerig:HffiN'fessageS="Bothpizzasarethe
sazned61..
Print:任wcge$
BHD
圖15-7比薩餅問題的BASIC程序
卜CQZ第15章計(jì)算機(jī)程序設(shè)計(jì)435
下載
15.2.1程序順序
.。我該如何告訴計(jì)算機(jī)程序執(zhí)行的順序?
娟(所謂順序執(zhí)行,就是計(jì)算機(jī)按照程序員指定的順序執(zhí)行每一條指令。第一條語句
兵J'先執(zhí)行,接下來是第二條,……,一直到程序末尾。下面是一段用QBASIC編寫的程
,序,用以輸出<(Thisisthefirstline,"和nThisisthesecondline."
可視化程序PRINT"Thisisthefirstline/;
PRINT"(Thisisthesecondline."
雖然大部分現(xiàn)在的編程語言不需要寫行號(hào),但有些舊的編程語言則要標(biāo)注行號(hào),例如下面
這段用BASIC最初版本寫的程序:
100PRINT"Thisisthefirstline/
200PRINT“Thisisthesecondline."
如果程序中標(biāo)了行號(hào),計(jì)算機(jī)就會(huì)從行號(hào)最小的語句開始執(zhí)行,接著是次小的。圖15-8中
的流程圖表述了一段小的順序指令。
圖15-8順序執(zhí)行
?些算法給出的執(zhí)行順序和程序中寫的不同,在某些情況下跳過一些指令或重復(fù)執(zhí)行某些
指令??刂平Y(jié)構(gòu)用于控制程序執(zhí)行的順序。一般有三種控制結(jié)構(gòu):順序控制、選擇控制和循環(huán)
控制。
15.2.2順序控制
。有沒有方法改變程序執(zhí)行的順序?
順序控制結(jié)構(gòu)能改變計(jì)算機(jī)執(zhí)行的順序,執(zhí)行一條指令轉(zhuǎn)而執(zhí)行其他的指令。下
面這段QBAS1C程序使用GOTO語句告訴計(jì)算機(jī)直接跳往標(biāo)號(hào)為"Widget”的語句執(zhí)
行。語句"PRINT'Thisisthesecondline/"永遠(yuǎn)不會(huì)執(zhí)行。
GOTOPRINT"Thisisthefirstline/
5GOTOWidget
?PRINT""Thisisthesecondline/"
Widget:PRINT“AllDone!”
END
436計(jì)算機(jī)文化:
--I下載
圖15-9的流程圖說明了計(jì)算機(jī)先
按標(biāo)號(hào)順序執(zhí)行,然后在GOTO語句
的作用下跳往其他語句。
雖然GOTO這種結(jié)構(gòu)很簡(jiǎn)單,但
過多的使用會(huì)使程序的可讀性和可維
護(hù)性很差,所以熟練的程序員忌諱使
用它。1968年,《ACM通訊》雜志發(fā)
表了Dijkstra的一封著名的信
“G。To語句的害處”。他在信中稱,
濫用GOTO語句將使別人很難讀懂你
的算法,這也就意味著這種程序不易
更正、改善和修訂。
有經(jīng)驗(yàn)的程序員喜歡用除GOTO
語句以外的順序控制結(jié)構(gòu)把程序改寫
成一個(gè)個(gè)的子程序、過程、模塊或函
數(shù)。子程序、過程、模塊和函數(shù)都是
程序的一段代碼,但不包含在主程序
的順序路徑內(nèi)。圖15-10說明了用
GOSUB語句把執(zhí)行路徑轉(zhuǎn)移到子程序內(nèi)。
1.這是一個(gè)主程序。計(jì)算機(jī)開始執(zhí)
行主程序指令直到遇到GOSUB命令2,GOSUB命令指示計(jì)算機(jī)轉(zhuǎn)到
4.RETURN命令指示
計(jì)算機(jī)返回到主程序
圖15-10執(zhí)行GOSUB命令
15.2.3選擇結(jié)構(gòu)
。計(jì)算機(jī)執(zhí)行程序是能否選擇路徑?
選擇控制結(jié)構(gòu)也稱為決定結(jié)構(gòu)或分支,告訴計(jì)算機(jī)根據(jù)所列條件的正確與否選擇執(zhí)行路徑。
?彼卜第15章計(jì)算機(jī)程序設(shè)計(jì)437
^>1
比較簡(jiǎn)單的選擇結(jié)構(gòu)是IF...THEN...ELSE語句。下面這段程序使用IF...THEN...ELSE結(jié)構(gòu)判斷
輸入的數(shù)字是否大于10。若大于數(shù),打印"Thatnumberisgreaterthan10/否則,不打印這條
信息。
INPUTwEnteranumberfrom1to10:”,Number
IFNumber>10THENPRINT“Thalnumberisgreaterthan10!”
ELSEPRINT“Thatnumberis10orless."
END
15.2.4重復(fù)控制
。計(jì)算機(jī)能不止一次的執(zhí)行一段程序嗎?
重復(fù)控制結(jié)構(gòu)乂稱為循環(huán)結(jié)構(gòu)或迭代結(jié)構(gòu),可以重復(fù)執(zhí)行一條或多條指令直到滿足退出條
件。在QBASIC中,最常用的循環(huán)結(jié)構(gòu)是WHILE…WEND
結(jié)構(gòu)。下面的例子用FOR...NEXT結(jié)構(gòu)打印一條信息三次。
FORN=1TO3
PRINT“There飛noplacelikehome.”
NEXTN
END
圖15-12的流程圖描述了計(jì)算機(jī)如何執(zhí)行循環(huán)結(jié)構(gòu)。
為了對(duì)FOR...NEXT這種結(jié)構(gòu)有一個(gè)更深刻的了解,
現(xiàn)在假設(shè)你就是計(jì)算機(jī),執(zhí)行下面這段程序。你可以用標(biāo)
有N的框來代表內(nèi)存地址。作為計(jì)算機(jī),還要有一個(gè)顯示
屏幕,用“顯示”框表示。下面讓我們一步步的執(zhí)行這個(gè)
循環(huán)。
N屏幕輸出圖15-12計(jì)算機(jī)執(zhí)行循環(huán)
438計(jì)算機(jī)文化CM忖川機(jī)騫
1下載
FORN=1TO3
PRINT“There'snoplacelikehome.”
NEXTN
END
1)首先你看到語句FORN=1TO3,把N賦值為1。在框N中寫上1。
2)接下來執(zhí)行下一條語句PRINT"There、noplacelikehome."在"顯示"框中寫入
“There'snoplacelikehome:'
3)語旬NEXT使你回到語句FORN=1TO3。因?yàn)檫@是第二次執(zhí)行這條語句,所以在N框子
中寫上2(把1擦掉)。
4)你應(yīng)該測(cè)試一下N的值是否大于3。為什么?因?yàn)檎Z句FORN=1TO3表示只有當(dāng)N的值
不大于3時(shí),你才能繼續(xù)循環(huán)下去?,F(xiàn)在N=2,繼續(xù)執(zhí)行。
5)執(zhí)行下一條語句,把"There'snoplacelikehome寫入"顯示"框。
6)繼續(xù),遇到NEXT語句,回到FOR語句。
7)把N框中的值改為3,確信框中沒有大于3的數(shù),進(jìn)入循環(huán)。
8)在顯示框中再寫上"There'snoplacelikehome."NEXT語句使你回到FOR語句,N框中
的值增為4。這次檢查時(shí)發(fā)現(xiàn)N的值大于3,這意味著循環(huán)結(jié)束,應(yīng)該跳出。
9)下面的語句是END,程序結(jié)束。
習(xí)題B
1.是用計(jì)算機(jī)語言描述一個(gè)算法的過程。
2.控制能把執(zhí)行順序從這條語句轉(zhuǎn)到另一條語句。
3.結(jié)構(gòu)使計(jì)算機(jī)按照所給條件的正確與否選擇執(zhí)行路徑。
4.結(jié)構(gòu)能重復(fù)執(zhí)行一段程序直到某一條件為真。
15.3調(diào)試和文檔
編制程序時(shí),你必須對(duì)其進(jìn)行測(cè)試代碼的每一段來確定其可以正確地工作。這一過程稱為
調(diào)試(debugging),因?yàn)檫@一過程就是查錯(cuò),以避免程序運(yùn)行時(shí)出錯(cuò)。編碼時(shí),你應(yīng)當(dāng)編制文檔,
以作為永久性的記錄來解釋程序的工作過程。
15.3.1測(cè)試程序
O如何了解程序運(yùn)行正確?
一個(gè)計(jì)算機(jī)程序必須對(duì)其進(jìn)行測(cè)試來
保證程序工作正確。測(cè)試經(jīng)常包括輸入測(cè)
試數(shù)據(jù)來看看程序是否能夠產(chǎn)生正確結(jié)
果。如果程序沒有產(chǎn)生正確結(jié)果,程序員
必須查找程序中的錯(cuò)誤、修改錯(cuò)誤、再測(cè)
試程序。這個(gè)過程可能需要相當(dāng)長(zhǎng)的時(shí)間,
如圖15-13。但是,測(cè)試卻是程序設(shè)計(jì)中的
關(guān)鍵一步。圖15-13斯坦福大學(xué)學(xué)生于1967年制作的
例如,要測(cè)試Pizza程序,你應(yīng)當(dāng)運(yùn)視頻,描述了一個(gè)程序員對(duì)于編程、
測(cè)試和調(diào)試過程中的沮喪狀
行程序并輸入數(shù)據(jù)并計(jì)算好結(jié)果,假設(shè)你
第15章計(jì)算機(jī)程序設(shè)計(jì)439
使用計(jì)算器來計(jì)算每平方平方英寸的價(jià)格,價(jià)格為18.50美元,大小15英寸的比薩餅的每平方
英寸的價(jià)格為0.08美元。一種測(cè)試程序的方法是運(yùn)行程序,并輸入價(jià)格18.50美元、大小15英寸
和形狀。程序應(yīng)當(dāng)產(chǎn)生結(jié)果008美元。如果不是,你就知道寫程序時(shí)出錯(cuò)了,需要修改錯(cuò)誤。
但是,測(cè)試一組值還不夠。你每次最少應(yīng)當(dāng)測(cè)試一個(gè)狀態(tài),并且應(yīng)當(dāng)測(cè)試每條分支。
Pizza程序有兩個(gè)可能的分支來計(jì)算每平方英寸價(jià)格。一個(gè)分支是針對(duì)方形餅,一種是針對(duì)圓
形餅。即使你輸入了一組測(cè)試方形餅的數(shù)據(jù),程序能提供正確結(jié)果,但在你測(cè)試了圓形餅數(shù)據(jù)
之前,不能認(rèn)為程序是正確的。
當(dāng)你在程序中發(fā)現(xiàn)了一個(gè)錯(cuò)誤時(shí),可能是語法錯(cuò),也可能是運(yùn)行時(shí)錯(cuò)誤。語法錯(cuò)誤是由于
指令沒有按照程序設(shè)計(jì)語言的語法規(guī)則編寫所致。例如,當(dāng)你要打印一個(gè)消息時(shí),你需要使用
PRINT命令。命令I(lǐng)FAGE=16THEN"Youcandrive.”將產(chǎn)生語法錯(cuò)誤,因?yàn)樯倭嗣钭?/p>
PRINTo正確的寫法是IFAGE=16THENPRINT"Youcandrive.”
另一種類型的程序錯(cuò)誤是運(yùn)行時(shí)錯(cuò)誤。運(yùn)行時(shí)錯(cuò)誤是當(dāng)你運(yùn)行程序時(shí)出的錯(cuò)。這類錯(cuò)誤可
以是由類型錯(cuò)誤造成,語法正確但不能產(chǎn)生所需的結(jié)果。例如,假設(shè)你在下列Pizza程序的命
令中錯(cuò)誤地使用了號(hào):
IFSquarelnchPrice1<SquareInchPrice2THENPRINT“Pizza2isabetterdealthanPizza1
由于你在應(yīng)當(dāng)使用符號(hào)的地方用了"<"符號(hào),命令將產(chǎn)生錯(cuò)誤結(jié)果。
其他運(yùn)行時(shí)錯(cuò)誤歸類為邏輯錯(cuò)誤。邏輯錯(cuò)誤是一種程序設(shè)計(jì)或邏輯中的錯(cuò)誤。邏輯錯(cuò)誤可
能由于流程圖或偽代碼中問題說明不足或解法不完整或不正確造成。邏輯錯(cuò)誤比起語法錯(cuò)誤來
通常更難檢測(cè),也更費(fèi)時(shí)間。
15.3.2程序文檔
Q為何需要程序文檔?
一個(gè)計(jì)算機(jī)程序不可避免地要修改。如果程序文檔編制的好,修改程序就比較容易。例如,
假設(shè)兩個(gè)餅店都在菜單中增加了一種新的矩形比薩餅。這樣,你和朋友們需要修改程序,以便
可以輸入矩形餅的邊長(zhǎng)。首先,需要理解當(dāng)前程序的工作過程,雖然這對(duì)于很短的程序來說相
當(dāng)容易,但假如你要了解一個(gè)計(jì)算收入稅的50000行程序,特別當(dāng)你不是該程序的程序員時(shí),
難度可想而知。你可能需要一些附加的信息來解釋程序邏輯和程序員設(shè)計(jì)的計(jì)算公式。
程序文檔解釋了程序的工作過程及使用方法。你創(chuàng)建的文檔應(yīng)當(dāng)能為其他程序員用來修改
程序或者為其他人使用程序提供幫助。典型地講,程序文檔有兩種形式:插入到程序代碼中的
注釋和專門制作的文檔。
注釋是插入到計(jì)算機(jī)程序的代碼行中的解釋性注解。改寫一個(gè)程序時(shí),程序員需要閱讀原
來程序以理解程序如何工作,然后修訂適當(dāng)?shù)拇a段。如果一個(gè)原有程序的程序員在程序中加
了注釋,那么程序就比較容易理解。
計(jì)算機(jī)執(zhí)行程序時(shí)會(huì)略過這些注釋,但這對(duì)需要修改程序的程序員來說,注釋是很方便的。
一個(gè)文檔比較好的程序都包含解釋程序目的注釋。例如,比薩餅問題有下面的注釋:
REMThePizzaProgram
REMThisprogramtellsyouwhichoftwopizzasisthebetterdeal
REMbycalculatingthepricepersquareinchofeachpizza.
在一些意思不太明確的程序段也應(yīng)加上注釋。比如,語句3.142*(size/2)八2可能對(duì)讀者并
不顯而易見,因此在前面加上些注釋會(huì)有好處:
REMTheprogramcalculatesthenumberofsquareinches
440計(jì)算機(jī)文化
1下載
REMinaroundpizzawhere
REMpi=3.142,size/2=radius,and(size/2)A2=radiussquared:
Squareinches=3.142*(size/2)A2
什么地方該加注釋并沒有固定的法則,但如果你參加一個(gè)項(xiàng)目,小組可能會(huì)制訂一些規(guī)定
來保證程序中使?致的注釋,如果你擁有了這方面的經(jīng)驗(yàn),很自然地就會(huì)使用注釋。
專門制作的文檔不屬于程序,它包含的是一些對(duì)程序員和用戶都有用的關(guān)于程序的信息。
文檔既可以是文字的又可以是電子格式的。既然文檔能為程序員和用戶服務(wù),因此也包含兩類:
程序手冊(cè)和用戶參考手冊(cè)。
程序手冊(cè)中包含所有對(duì)程序員有用的信息,包括問題描述和算法。因?yàn)槌绦蚴謨?cè)是軟件開
發(fā)和維護(hù)的工具,所以只有程序員才用,用戶不用。用戶參考或稱參考手冊(cè)中的信息可以幫助
用戶學(xué)會(huì)使用該軟件。用戶參考的電子版本通常能給用戶提供在線式幫助。表15-2比較了用戶
參考和程序手冊(cè)中的信息。
表15-2程序文檔
程序員手冊(cè)用戶參考
問題描述說明程序功能
以結(jié)構(gòu)化英語、偽代碼或流程圖描述算法如何安裝、啟動(dòng)和實(shí)用程序,以及其中的圖表和菜單
程序源代碼故障分析與排除
程序員一般負(fù)責(zé)編排代碼并整理程序手冊(cè),但用戶參考手冊(cè)現(xiàn)在一般由專業(yè)的科
技作家去編寫??萍甲骷覍iT解釋科技概念和程序,把復(fù)雜的概念簡(jiǎn)化供非技術(shù)人員
閱讀。許多大學(xué)開設(shè)科技寫作課程,甚至有的大學(xué)設(shè)有科技寫作學(xué)位。在計(jì)算機(jī)工業(yè)
科技寫作中有經(jīng)驗(yàn)的科技作家被聘為業(yè)余的或?qū)I(yè)的雇員。
6
?習(xí)題C
1.輸入已知數(shù)據(jù)來驗(yàn)證程序是否輸出正確結(jié)果是______過程的-部分。
2.如果你忽略了編程語言的規(guī)則和語法,你可能會(huì)犯錯(cuò)誤。
3.假設(shè)運(yùn)行比薩餅程序時(shí),輸出結(jié)果為Pizza2價(jià)錢便宜。但實(shí)驗(yàn)數(shù)據(jù)說明Pizzal價(jià)錢便宜。
因?yàn)樵谀氵\(yùn)行程序時(shí)出現(xiàn)了這種錯(cuò)誤,所以應(yīng)歸為_______錯(cuò)誤。
4.錯(cuò)誤識(shí)別起來最困難而且費(fèi)時(shí)。
5.解釋程序如何工作和及如何使用它。
6.為了解釋程序如何工作,而且使其他修改程序的程序員容易讀懂,程序員往往在程序中
插入?
7.是為程序員編寫的文檔,而是為用戶使用軟件設(shè)計(jì)的文檔。
15.4編程語言的特點(diǎn)
在過去的35年里出現(xiàn)了上百種編程語言。一些語言的開發(fā)是為了提高編程效率,降低出錯(cuò)
率。而另一些則是為專門的編程提供高效的指令集,例如商業(yè)程序和科技程序。其他的是用于
教學(xué)的。
這些語言在描述如何工作和如何給合適任務(wù)類型提供信息時(shí)各具特色。例如,PASCAL語
言是一種可編譯的過程性的高級(jí)語言。當(dāng)你需要選擇語言來編程時(shí),了解這些語言的特色和它
們的優(yōu)缺點(diǎn)將很有幫助。
第15章計(jì)算機(jī)程序設(shè)計(jì)441
15.4.1過程性語言
Q比薩餅問題程序是用過程性語
言編寫的嗎?
用過程性語言編寫的程序包含一系列的
描述,告訴計(jì)算機(jī)如何執(zhí)行這些過程來完成
特定的工作。帶有過程性特征的語言稱為過
程性語言。編寫比薩餅程序的BASIC語言就
具有過程性的特征,那些語句確切地告訴了
計(jì)算機(jī)如何工作:顯示信息請(qǐng)求用戶輸入比
薩餅形狀;請(qǐng)求輸入大?。蝗缓笳?qǐng)求輸入價(jià)
錢;如果餅是方的,用公式SquareinchPrice
=Price/Squareinches,等等。
過程性的編程語言適合于那些順序執(zhí)行
的算法。用過程性語言編寫的程序有一個(gè)起
點(diǎn)和一個(gè)終點(diǎn)。程序從起點(diǎn)到終點(diǎn)執(zhí)行的流
程是直線型的,即計(jì)算機(jī)從起點(diǎn)開始執(zhí)行寫圖15-14過程性語言的執(zhí)行
好的指令序列,直到終點(diǎn)(見圖15-14)。
15.4.2說明性語言
Q是否是所有的語言都需要程序員明確給定解決問題的步驟呢?
說明性語言只需程序員具體說明問題的規(guī)則并定義一些條件即可。語言自身內(nèi)置了方法把
這些規(guī)則解群為一些解決問題的步驟,這就把編程的重心轉(zhuǎn)移到描述問題和其規(guī)則上,而不再
是數(shù)學(xué)公式。因此說明性的語言更適合于思想概念清晰但數(shù)學(xué)概念復(fù)雜的編程工作。
不同于過程性的程序,用說明性語言編寫程序只需你告訴計(jì)算機(jī)要做什么,而不需告訴它
如何去做。如圖15-15所示,這是一段PROLOG程序,問題是在所列的幾個(gè)人中找出誰有姐妹。
male(Charlie)~
male(linus).______________Charlie、Linus■.Sam,
male(sam).George說明為男性(Male)
male(george)._
female(lucy).______________Lucy、Pattie、Amanda、
fenale(pattie).Anne說明為女性(Female)
fenale(amanda).
female(anne).|
parents(1inus,amanda,sam)."
描述父母與孩子的關(guān)系
parents(lucy,amanda,sam).
程序描述了確定人X是否為
sister-of(Y,X)H_________人Y的姐妹的規(guī)則。
female(X),LX必須是為女性。
2.X的母親是M且父親是Y。
parents(X,M,F),
3.Y與X有相同的母親和父親。
parents(YrM,F),I
圖15-15Prolog程序
442計(jì)算機(jī)文化
|卜
15.4.3腳本語言
QHTML是一種語言嗎?
HTML一般
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 ISO 16823:2025 EN Non-destructive testing - Ultrasonic testing - Through-transmission technique
- 2024年音視頻線供貨3篇
- 步行街花崗巖安裝協(xié)議
- 兒童玩具業(yè)務(wù)員招聘協(xié)議
- 汽車配件租賃合同
- 食品召回的企業(yè)文化塑造
- 通信保障臨時(shí)用電管理辦法
- 摩托車店大門地彈門施工合同
- 動(dòng)物福利愛心基金管理辦法
- 室內(nèi)裝修安裝合同樣本
- 資產(chǎn)管理基礎(chǔ)知識(shí)
- 醫(yī)院采購(gòu)遴選方案
- GB/T 7260.1-2023不間斷電源系統(tǒng)(UPS)第1部分:安全要求
- 對(duì)外開放與國(guó)際合作概述
- 2024屆四川省成都市高中數(shù)學(xué)高一下期末學(xué)業(yè)質(zhì)量監(jiān)測(cè)模擬試題含解析
- 2023年青協(xié)活動(dòng)總結(jié)報(bào)告
- 提升供應(yīng)鏈效率:年度運(yùn)營(yíng)計(jì)劃
- 展覽館維修維護(hù)投標(biāo)方案
- 陳赫賈玲小品《歡喜密探》臺(tái)詞劇本
- 2023招聘專員個(gè)人年終總結(jié)
- 機(jī)房搬遷服務(wù)投標(biāo)方案(技術(shù)標(biāo))
評(píng)論
0/150
提交評(píng)論