計(jì)算機(jī)文化-第15章 計(jì)算機(jī)程序設(shè)計(jì)_第1頁
計(jì)算機(jī)文化-第15章 計(jì)算機(jī)程序設(shè)計(jì)_第2頁
計(jì)算機(jī)文化-第15章 計(jì)算機(jī)程序設(shè)計(jì)_第3頁
計(jì)算機(jī)文化-第15章 計(jì)算機(jī)程序設(shè)計(jì)_第4頁
計(jì)算機(jī)文化-第15章 計(jì)算機(jī)程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)分析師和軟件工程師。

?列出如今流行的編程語言。

?以國防部標(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è)軟件相比,這里你所接觸到的程序是微不足道的。按照國防部的標(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的大?。ㄒ杂⒋鐬閱挝唬?/p>

求:

每平方英寸餅的價(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.按美國國防部的標(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. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論