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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

冰MQN

下載

第15章計算機程序設(shè)計

星期二晚上,你和一群朋友學(xué)習(xí)到很晚,饑腸轆轆,大家商議去吃比薩餅。但你們掏出所

有的錢也只有24.63美元,根本不夠八個人填飽肚子??磥磉€是多轉(zhuǎn)幾家餅店,比較一下價格,

“少花錢,多辦事”。

你們先到了VanGo餅店,發(fā)現(xiàn)8.99美元可以買一塊直徑為8英寸且?guī)щp層奶油的圓餅。接著

在Venice店發(fā)現(xiàn)11.99美元可以買??塊邊長為10英寸的方形比薩餅。哪個價格更好呢?你想找個

計算器但找不到,一個朋友帶了一臺筆記本電腦,所以你可以編段程序來比較一下比薩餅的價

格。那么,接下來該怎么做呢?

計算機程序設(shè)計就是編寫一些指令驅(qū)動計算機完成特定的工作。這一章將對此做一介紹。

計算機編程的基本概念包括:問題描述、算法、編碼、控制結(jié)構(gòu)、調(diào)試和建立文檔。本章還包

括描述各種編程語言的特征、簡介當(dāng)今最流行的編程語言。本章是進行程序設(shè)計的基礎(chǔ)。

本章概要

在本章中你將對計算機編程有初步的認識,而且將針對“比薩餅問題”編

寫一-個小程序。你可以用在這里學(xué)到的知識與技巧去解決很多可用計算機解決

的問題。同時你將學(xué)到一些程序員用來描述、編寫和調(diào)試程序的方法論。不管

你從事軟件開發(fā)工作還是應(yīng)用計算機,理解這些原則都會對你有益。讀完這一

章你將能夠做到:

?區(qū)別系統(tǒng)分析師和軟件工程師。

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

?以國防部標(biāo)準描述大型程序和小型程序的區(qū)別。

?在問題描述中鑒別哪些是假設(shè)?哪些是已知條件。實驗

?描述算法、偽代碼和程序代碼之間的關(guān)系。

?列出至少四種表達算法的方法。

?鑒別簡單的BASIC程序中的控制結(jié)構(gòu)。

?描述程序中語法錯誤和邏輯錯誤的區(qū)別??梢暬绦?/p>

?解釋程序正文、注釋和用戶參考手冊的用途。設(shè)計

?簡述區(qū)分各種編程語言的主要特征。

15.1軟件工程

軟件工程是指軟件的開發(fā)、運作、維護和最終消亡的整個系統(tǒng)過程。軟件工程師負責(zé)信息

系統(tǒng)所用軟件的編寫工作。系統(tǒng)分析師和軟件工程師的工作是交織在一起的,但也有所不同。

一個系統(tǒng)分析師要計劃整個信息系統(tǒng),包括硬件、軟件、員工和數(shù)據(jù)。而軟件工程師則致力于

理%>軟件設(shè)計、編程和調(diào)試這些信息系統(tǒng)的軟件組件上。

/CT.'

WWW\對于一個并不打算成為程序員的人來說,學(xué)習(xí)軟件開發(fā)和電腦編程又有什么意義

7呢?首先,你可能在工作中會使用許多程序,你會發(fā)現(xiàn)一個字處理軟件就包含75萬行程

軟件工程序,存在一些錯誤是無法避免的。同樣,你會發(fā)現(xiàn),一個人很難完成一個字處理軟件的

1

428計算機文化?哪可0附

編寫,這些最好留給專業(yè)的編程小組去做。雖然你不會去專門編寫自己想用的軟件,但你可能會

修改一些軟件來滿足你特殊的要求,這時,你對計算機編程的了解將有助于你擬訂建設(shè)性的計劃。

15.1.1計算機程序

。寫一個程序很難嗎?

和你所使用的商業(yè)軟件相比,這里你所接觸到的程序是微不足道的。按照國防部的標(biāo)準,

少于100000條指令稱為小程序,100000?1000000行的歸為中等,超過1000000行就是大程

序了。據(jù)統(tǒng)計,一個程序員平均每天只能完成20行指令。這并不奇怪,因為一個商用軟件通常

由一個程序員小組來完成,而且要花幾個月、甚至幾年時間。

在第2章中我們講過計算機就是告訴計算機如何解決問題的一系列指令的集合。但“寫程

序”不同于“寫信”。寫信時,只要能表達你的思想,可以不管其結(jié)構(gòu)和效率,寫程序則不然。

人與人之間交流時,有歧義的句子有時仍能表辭達意。比如,你的朋友突然在上學(xué)路上說:

門沒鎖。你肯定知道他講的是忘了鎖上家門,而不是門上沒有鎖。但計算機卻沒有人那么發(fā)達

的思維,給計算機編寫程序需要縝密的思考與斟酌。因此,計算機編程很強調(diào)結(jié)構(gòu)性,絲毫不

能馬虎。

寫程序也要比寫信難得多,但軟件開發(fā)過程中有一些原則可以幫你理出一些頭緒。計算機

程序設(shè)計首先從問題的描述開始,它是算法的基礎(chǔ),而算法則是程序的基礎(chǔ)。接下來我們將對

問題描述、算法分析和程序指令進行詳細的討論。

15.1.2問題描述

。對前述比薩餅問題怎樣進行好的描述呢?

提出問題才能解決問題,就像前面的例子:哪個比薩餅店更好呢?這種提法很模糊,對你

解決問題并無幫助,因為它沒有告訴你哪些是已知條件。你知不知道各個餅店的價錢?餅的大

???奶油層有多少?“哪個餅店更好?”這種提法并沒有解釋“好”的含義,是僅僅指餅的價

錢低,還是指同樣多的錢買的餅?zāi)逃蛯佣?,還是指你們僅有的24.63美元能買到的餅越大越好

呢?看一下圖15-1,你能否得出關(guān)于上面問題的一種更好的問題描述呢?

Tryour10"SquarePizza

Any2Toppingsjust$n.99

MMMKTHE

VENICE

ThMiAHerryRigRaw**

圖15-1買什么樣的比薩餅最合算

問題描述就是要說明一些能用來解決問題的要素。?個表達清晰的問題描述應(yīng)該具備以下

三個特征:

?能說明描述問題范疇的任何假設(shè)。

班。哪QM

M第15章計算機程序設(shè)計429

下載

?羅列出已知的所有條件。

?具體說明需要解決什么問題。

在一個問題描述中,假設(shè)就是為了方便設(shè)計而假定的認為是正確的陳述。比如,在比薩餅

問題中,你可以假設(shè)只比較兩種類型的比薩餅:方的和圓的。為了簡化問題,你可以假設(shè)沒有

長方形的餅,這是因為你所要解決的問題只與餅的面積有關(guān),長和寬并不重要。還可以假設(shè)所

比較的比薩餅有相同厚度的奶油層。最后還可以說明,單位面積比薩餅價格低的就是最好的。

問題描述中的已知信息就是你要計算機幫你解決問題時提供給它的信息。對于比薩餅問

題,已知信息包括兩個餅店的比薩餅價錢、形狀、大小。已知信息在問題描述中經(jīng)常用“已

知”來給出,例如“已知兩餅店餅的價格、形狀、大小……”

在你說明了已知條件后,你應(yīng)該說明問題解決后你該如何做決定,也就是想讓程序給你輸

出什么信息。當(dāng)然,在運行程序之前你并不知道答案,正如你不知道哪個餅店更實惠,但你可

以告訴計算機它應(yīng)該輸出哪個餅店更好。

假設(shè)你和朋友認為,能以最低的價錢買到最大的餅就是最實惠的餅店,即單位面積的餅的

價格最低,這樣每平方英寸5美元的餅就比7美元的餅實惠。因此,只要能算出餅的單位價格,

比較它們,然后打印信息指出哪個餅店的價格低,問題就解決了??梢赃@樣來寫問題描述:計

算機算出比薩餅每平方英寸的價錢,然后輸出是第一種還是第二種單位面積價格較低。

經(jīng)過對問題的深入分析,可以做一些假設(shè)。最后,比薩餅問題的描述如下:

比較兩種比薩餅,它們有相同多的奶油層,一種方的,一種圓的;已知價錢、形狀和大

??;計算機計算兩種比薩餅每平方英寸的價錢并輸出那種價格低。

上面這種描述不易理解,下面這種格式較好:

假設(shè):

兩類比薩餅,Pl、P2

奶油層相等

一種方的,一種圓的,都不是長方形

單位面積價錢低的為最好

已知:

pPl=**;pP2=**(pPi為餅的價錢)

P1,P2的形狀

PLP2的大?。ㄒ杂⒋鐬閱挝唬?/p>

求:

每平方英寸餅的價錢(pPl,pP2)

輸出:

若pPl<pP2,打印“PI店更實惠”

若pPl>pP2,打印“P2店更實惠”

若pPl=pP2,打印“兩店一樣”

##

現(xiàn)在我們學(xué)習(xí)了如何寫問題描述,然后進行編程的下一步——算法設(shè)計。

15.1.3算法設(shè)計

。如何為比薩餅問題規(guī)劃一個算法?

算法就是解決問題的步驟。算法是一個抽象的思想,但它是可表達的且是可執(zhí)行的。比如,

430計算機文化

做奶酪面包就是這樣一組步驟:把水燒開;蒸面包;最后加上奶酪。這些“算法”可以在菜譜

上作為步驟記錄或陳述下來,并且你能照著去操作。

信息網(wǎng)?可行性是一個正確算法的重要特征,如果你耐心地按照算法一步步做,你一定可

以得出正確答案。同樣,如果你按菜譜上的步驟,你也一定能做出奶酪面包。

算法是根據(jù)問題描述中給定的信息得出的。算法一開始并不寫成規(guī)則的程序語言,

算法這樣軟件工程師就可以不管程序語法方面的問題,而致力于計算方法的設(shè)計。在下面

2的階段,把算法改寫成符合程序設(shè)計語言語法的語句,算法就可以執(zhí)行了。

如果你是剛剛開始編程工作的,可能搞不清算法寫到什么程度才算詳盡。比如,該不該具

體說明諸如“如何執(zhí)行”這類問題呢?其實算法的詳盡程度和你要使用什么程序設(shè)計語言有關(guān)。

當(dāng)你把一門語言中所有句型的語法語義都搞熟時,算法只要能表達你的意思就行了。對比薩餅

問題,假設(shè)你使用的是BASIC語言。表15-1給出了一些基于BASIC語言的恰倒好處的算法指令。

表15-1一個BASIC程序算法中寫法的樣本

算法實現(xiàn)的任務(wù)實例

賦值Size=10

列出公式SquareInchPrice=Price/SquareInches

等待輸入數(shù)據(jù)EnterthePriceofapizza

顯示計算結(jié)果DisplaytheSquarelnchPrice

得出結(jié)論Ifthepizzaissquare.calculateSquareinchesbymultiplyingtheSize*Size

重復(fù)某些操作Repeatthepricecalculationsforasmanypizzasastheuserwants

設(shè)計算法,一般你會先自己解決這個問題,然后再把這些步驟記錄下來,因此必須先知道

一些信息,像比薩餅的成本、大小和形狀等。同樣計算機也需要這些初始信息,在算法中應(yīng)該

具體說明計算機如何取得它。程序運行時,提示用戶輸入這些信息。算法可以這樣寫:

AsktheuserfortheshapeofthefirstpizzaandholditinRAMasShape1.

AsktheuserforthepriceofthefirstpizzaandholditinRAMasPrice1.

AsktheuserforthesizeofthefirstpizzaandholditinRAMasSizel.

接著你的算法應(yīng)該詳細說明如何操作這些信息。你想計算比薩餅每平方英寸的價錢,但像

“Calculatethepricepersquareinch”這樣的指令既沒有說明如何計算,也沒有說明對方餅和圓

餅兩種不同情況的處理方法。一種更為恰當(dāng)?shù)膶懛ㄈ鐖D15-2所示。

2.計算圓形比薩餅的面積,

1.計算正方形比薩餅的

diamel使用計算圓形面積的公式兀BK

面積,用一條邊長乘以另

約等于3.142,r?是圓半徑的平

一條邊長。由于正方形邊.

長相等,可以用公式.方。比薩餅的大小是用直徑來

表示的,所以需要將直徑除以

Sizel*Sizel計算

2得到半徑。使用Sizel/2。然

后,求半徑的平方?!北硎居?/p>

算機中的二次平方

IfShape1is?

calculate

3.求出比薩餅的面積后,

乘以每平方英寸的價可即可

圖15-2計算每平方英寸比薩餅的算法

卜線輸?shù)?5章計算機程序設(shè)計431

下載

上面的算法可以算出一塊比薩餅的單價,對第二塊還要寫出同樣的算法:

AsktheuserfortheshapeofthesecondpizzaandholditinRAMasShape2

AsktheuserforthepriceofthesecondpizzaandholditinRAMasPrice2

AsktheuserforthesizeofthesecondpizzaandholditinRAMasSize2

IfShape2issquarethencalculatethesquareinchesusingtheformula:

Squareinches2=Size2*Size2

IfShape2isroundthencalculatethesquareinchesusingtheformula:

Squareinches2=3.142*(Size2/2)A2

SquareinchPrice2=Price2/Squareinches2

最后算法還要指出計算機如何輸出信息。你想讓它告訴你哪種比薩餅單價低,算法可以這

樣寫:

ifSquareinchPrice1<SquareinchPrice2thendisplaythemessage“Pizza1isthebestdeal.”

ifSquareinchPrice2>SquareInchPricelthendisplaythemessage“Pizza2isthebestdeal.”

不要忘記若兩種單價相等程序該輸出什么:

ifSquareinchPrice1=SquareinchPrice2thendisplaythemessage“Bothpizzasarethesamedeal.”

比薩餅問題的整個算法如圖15-3所示。

輸入Pizzal的形狀賦值給Shapely

輸入Pizzal的價錢賦值給Pricel取第一張比薩餅的信息

輸入Pizza1的大小賦值給Size1-

ifShape1issquarethen―

calculatethesquareinchesusingtheformula:

計算第一張比薩餅每

Squareinches1=size1*sizel

平方英寸的價格

IfShape1isroundthen

Calculatethesquareinchesusingtheformula:一

Squareinches1=3.l42*(sizel/2)A2

SquarelnchesPricel=Pricel/Squarelnchsl

輸入Pizza2的形狀賦值給Shape2

輸入Pizza2的價錢賦值給Price2取第二張比薩餅的信息

輸入Pizza2的大小賦值給Size2-

ifShape2issquarethen-

calculatethesquareinchesusingtheformula:

Squareinches2=size2*size2計算第二張比薩餅每

ifShape2isround(hen平方英寸的價格

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計算機文化

—?下載

15.1.4算法表達

。表達一個算法的最好方法是什么?

有幾種方法表達一個算法:結(jié)構(gòu)化英語、偽代碼、流程圖和對象定義。這些工具

不是程序設(shè)計語言,它們不能直接被計算機執(zhí)行。使用它們的目的就是把你的思想用

文字表述出來。

偽代嬴結(jié)構(gòu)化英語是英語的一個子集,用簡短的句型反映過程的進行。如圖15-4表示

?如何用結(jié)構(gòu)化英語來表達比薩餅問題的算法。

?.另一個表達算法的方法是偽代碼。偽代碼好比是算法的注釋系統(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比薩餅程序的偽代碼

第三種方法是流程圖。流程圖是描述計算機?步一步完成任務(wù)的圖表。圖15-5為比薩餅問

題的流程圖。

另一種表達算法的方法是定義計算機要執(zhí)行的對象,并定義操縱每個對象的方法。這種方

法對面向?qū)ο蟮某绦蛟O(shè)計很有價值,后面還將討論。圖15-6定義了一個關(guān)于比薩餅問題的對象。

習(xí)題八

1.如果你是一個,你會致力于信息系統(tǒng)中軟件組件的開發(fā)。

2.按美國國防部的標(biāo)準,約100000行代碼的程序稱為大程序。是對還是錯?

3.寫一個計算機程序之前,必須寫來定義一些運行中要用到的元素。

4._____是完成任務(wù)或解決問題的步驟的有機集合。

5.英語和程序設(shè)計語言混合使用稱之為o

6.____是描述計算機一步一步解決問題的圖形表示方法。

圖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比薩餅程序的對象描述

15.2編寫計算機程序

問題描述和算法通常寫入程序說明書,它們是程序設(shè)計必不可少的藍圖。寫完了

程序說明書后,就可以編寫程序了。程序的編寫就是用程序設(shè)計語言把算法程序化。

編寫程序的人稱為程序員。對于大部分程序設(shè)計語言來說,編程就是輸入命令;還有

程序號計一部分語言只需你選擇對象和屬性或編寫對象的腳本即可。

工作

4用BASIC編寫比薩餅問題的程序,你只需輸入一連串的命令。圖15-7給出了它的

完整的程序。仔細閱讀,就能對程序的基本架構(gòu)有一個大致的了解。

命令字用黑體表示

程序?qū)懗梢粋€步驟表計算機從表中的頂部開始執(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ù)存儲在變量或存儲

INPOT"Enter二二9pizzaz*:",Jizci地址中。變量Shapel$

RO(pricece:squareinchforpizza.存儲文本,如"round”

$表示文本變量。其他

if比二firstpizzais=:Tjare,ttysquareinchesbyrnureplying

onesidefaytheother.變量,如Fricel存儲數(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章計算機程序設(shè)計435

下載

15.2.1程序順序

.。我該如何告訴計算機程序執(zhí)行的順序?

娟(所謂順序執(zhí)行,就是計算機按照程序員指定的順序執(zhí)行每一條指令。第一條語句

兵J'先執(zhí)行,接下來是第二條,……,一直到程序末尾。下面是一段用QBASIC編寫的程

,序,用以輸出<(Thisisthefirstline,"和nThisisthesecondline."

可視化程序PRINT"Thisisthefirstline/;

PRINT"(Thisisthesecondline."

雖然大部分現(xiàn)在的編程語言不需要寫行號,但有些舊的編程語言則要標(biāo)注行號,例如下面

這段用BASIC最初版本寫的程序:

100PRINT"Thisisthefirstline/

200PRINT“Thisisthesecondline."

如果程序中標(biā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)能改變計算機執(zhí)行的順序,執(zhí)行一條指令轉(zhuǎn)而執(zhí)行其他的指令。下

面這段QBAS1C程序使用GOTO語句告訴計算機直接跳往標(biāo)號為"Widget”的語句執(zhí)

行。語句"PRINT'Thisisthesecondline/"永遠不會執(zhí)行。

GOTOPRINT"Thisisthefirstline/

5GOTOWidget

?PRINT""Thisisthesecondline/"

Widget:PRINT“AllDone!”

END

436計算機文化:

--I下載

圖15-9的流程圖說明了計算機先

按標(biāo)號順序執(zhí)行,然后在GOTO語句

的作用下跳往其他語句。

雖然GOTO這種結(jié)構(gòu)很簡單,但

過多的使用會使程序的可讀性和可維

護性很差,所以熟練的程序員忌諱使

用它。1968年,《ACM通訊》雜志發(fā)

表了Dijkstra的一封著名的信

“G。To語句的害處”。他在信中稱,

濫用GOTO語句將使別人很難讀懂你

的算法,這也就意味著這種程序不易

更正、改善和修訂。

有經(jīng)驗的程序員喜歡用除GOTO

語句以外的順序控制結(jié)構(gòu)把程序改寫

成一個個的子程序、過程、模塊或函

數(shù)。子程序、過程、模塊和函數(shù)都是

程序的一段代碼,但不包含在主程序

的順序路徑內(nèi)。圖15-10說明了用

GOSUB語句把執(zhí)行路徑轉(zhuǎn)移到子程序內(nèi)。

1.這是一個主程序。計算機開始執(zhí)

行主程序指令直到遇到GOSUB命令2,GOSUB命令指示計算機轉(zhuǎn)到

4.RETURN命令指示

計算機返回到主程序

圖15-10執(zhí)行GOSUB命令

15.2.3選擇結(jié)構(gòu)

。計算機執(zhí)行程序是能否選擇路徑?

選擇控制結(jié)構(gòu)也稱為決定結(jié)構(gòu)或分支,告訴計算機根據(jù)所列條件的正確與否選擇執(zhí)行路徑。

?彼卜第15章計算機程序設(shè)計437

^>1

比較簡單的選擇結(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ù)控制

。計算機能不止一次的執(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的流程圖描述了計算機如何執(zhí)行循環(huán)結(jié)構(gòu)。

為了對FOR...NEXT這種結(jié)構(gòu)有一個更深刻的了解,

現(xiàn)在假設(shè)你就是計算機,執(zhí)行下面這段程序。你可以用標(biāo)

有N的框來代表內(nèi)存地址。作為計算機,還要有一個顯示

屏幕,用“顯示”框表示。下面讓我們一步步的執(zhí)行這個

循環(huán)。

N屏幕輸出圖15-12計算機執(zhí)行循環(huán)

438計算機文化CM忖川機騫

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。因為這是第二次執(zhí)行這條語句,所以在N框子

中寫上2(把1擦掉)。

4)你應(yīng)該測試一下N的值是否大于3。為什么?因為語句FORN=1TO3表示只有當(dāng)N的值

不大于3時,你才能繼續(xù)循環(huán)下去。現(xiàn)在N=2,繼續(xù)執(zhí)行。

5)執(zhí)行下一條語句,把"There'snoplacelikehome寫入"顯示"框。

6)繼續(xù),遇到NEXT語句,回到FOR語句。

7)把N框中的值改為3,確信框中沒有大于3的數(shù),進入循環(huán)。

8)在顯示框中再寫上"There'snoplacelikehome."NEXT語句使你回到FOR語句,N框中

的值增為4。這次檢查時發(fā)現(xiàn)N的值大于3,這意味著循環(huán)結(jié)束,應(yīng)該跳出。

9)下面的語句是END,程序結(jié)束。

習(xí)題B

1.是用計算機語言描述一個算法的過程。

2.控制能把執(zhí)行順序從這條語句轉(zhuǎn)到另一條語句。

3.結(jié)構(gòu)使計算機按照所給條件的正確與否選擇執(zhí)行路徑。

4.結(jié)構(gòu)能重復(fù)執(zhí)行一段程序直到某一條件為真。

15.3調(diào)試和文檔

編制程序時,你必須對其進行測試代碼的每一段來確定其可以正確地工作。這一過程稱為

調(diào)試(debugging),因為這一過程就是查錯,以避免程序運行時出錯。編碼時,你應(yīng)當(dāng)編制文檔,

以作為永久性的記錄來解釋程序的工作過程。

15.3.1測試程序

O如何了解程序運行正確?

一個計算機程序必須對其進行測試來

保證程序工作正確。測試經(jīng)常包括輸入測

試數(shù)據(jù)來看看程序是否能夠產(chǎn)生正確結(jié)

果。如果程序沒有產(chǎn)生正確結(jié)果,程序員

必須查找程序中的錯誤、修改錯誤、再測

試程序。這個過程可能需要相當(dāng)長的時間,

如圖15-13。但是,測試卻是程序設(shè)計中的

關(guān)鍵一步。圖15-13斯坦福大學(xué)學(xué)生于1967年制作的

例如,要測試Pizza程序,你應(yīng)當(dāng)運視頻,描述了一個程序員對于編程、

測試和調(diào)試過程中的沮喪狀

行程序并輸入數(shù)據(jù)并計算好結(jié)果,假設(shè)你

第15章計算機程序設(shè)計439

使用計算器來計算每平方平方英寸的價格,價格為18.50美元,大小15英寸的比薩餅的每平方

英寸的價格為0.08美元。一種測試程序的方法是運行程序,并輸入價格18.50美元、大小15英寸

和形狀。程序應(yīng)當(dāng)產(chǎn)生結(jié)果008美元。如果不是,你就知道寫程序時出錯了,需要修改錯誤。

但是,測試一組值還不夠。你每次最少應(yīng)當(dāng)測試一個狀態(tài),并且應(yīng)當(dāng)測試每條分支。

Pizza程序有兩個可能的分支來計算每平方英寸價格。一個分支是針對方形餅,一種是針對圓

形餅。即使你輸入了一組測試方形餅的數(shù)據(jù),程序能提供正確結(jié)果,但在你測試了圓形餅數(shù)據(jù)

之前,不能認為程序是正確的。

當(dāng)你在程序中發(fā)現(xiàn)了一個錯誤時,可能是語法錯,也可能是運行時錯誤。語法錯誤是由于

指令沒有按照程序設(shè)計語言的語法規(guī)則編寫所致。例如,當(dāng)你要打印一個消息時,你需要使用

PRINT命令。命令I(lǐng)FAGE=16THEN"Youcandrive.”將產(chǎn)生語法錯誤,因為少了命令字

PRINTo正確的寫法是IFAGE=16THENPRINT"Youcandrive.”

另一種類型的程序錯誤是運行時錯誤。運行時錯誤是當(dāng)你運行程序時出的錯。這類錯誤可

以是由類型錯誤造成,語法正確但不能產(chǎn)生所需的結(jié)果。例如,假設(shè)你在下列Pizza程序的命

令中錯誤地使用了號:

IFSquarelnchPrice1<SquareInchPrice2THENPRINT“Pizza2isabetterdealthanPizza1

由于你在應(yīng)當(dāng)使用符號的地方用了"<"符號,命令將產(chǎn)生錯誤結(jié)果。

其他運行時錯誤歸類為邏輯錯誤。邏輯錯誤是一種程序設(shè)計或邏輯中的錯誤。邏輯錯誤可

能由于流程圖或偽代碼中問題說明不足或解法不完整或不正確造成。邏輯錯誤比起語法錯誤來

通常更難檢測,也更費時間。

15.3.2程序文檔

Q為何需要程序文檔?

一個計算機程序不可避免地要修改。如果程序文檔編制的好,修改程序就比較容易。例如,

假設(shè)兩個餅店都在菜單中增加了一種新的矩形比薩餅。這樣,你和朋友們需要修改程序,以便

可以輸入矩形餅的邊長。首先,需要理解當(dāng)前程序的工作過程,雖然這對于很短的程序來說相

當(dāng)容易,但假如你要了解一個計算收入稅的50000行程序,特別當(dāng)你不是該程序的程序員時,

難度可想而知。你可能需要一些附加的信息來解釋程序邏輯和程序員設(shè)計的計算公式。

程序文檔解釋了程序的工作過程及使用方法。你創(chuàng)建的文檔應(yīng)當(dāng)能為其他程序員用來修改

程序或者為其他人使用程序提供幫助。典型地講,程序文檔有兩種形式:插入到程序代碼中的

注釋和專門制作的文檔。

注釋是插入到計算機程序的代碼行中的解釋性注解。改寫一個程序時,程序員需要閱讀原

來程序以理解程序如何工作,然后修訂適當(dāng)?shù)拇a段。如果一個原有程序的程序員在程序中加

了注釋,那么程序就比較容易理解。

計算機執(zhí)行程序時會略過這些注釋,但這對需要修改程序的程序員來說,注釋是很方便的。

一個文檔比較好的程序都包含解釋程序目的注釋。例如,比薩餅問題有下面的注釋:

REMThePizzaProgram

REMThisprogramtellsyouwhichoftwopizzasisthebetterdeal

REMbycalculatingthepricepersquareinchofeachpizza.

在一些意思不太明確的程序段也應(yīng)加上注釋。比如,語句3.142*(size/2)八2可能對讀者并

不顯而易見,因此在前面加上些注釋會有好處:

REMTheprogramcalculatesthenumberofsquareinches

440計算機文化

1下載

REMinaroundpizzawhere

REMpi=3.142,size/2=radius,and(size/2)A2=radiussquared:

Squareinches=3.142*(size/2)A2

什么地方該加注釋并沒有固定的法則,但如果你參加一個項目,小組可能會制訂一些規(guī)定

來保證程序中使?致的注釋,如果你擁有了這方面的經(jīng)驗,很自然地就會使用注釋。

專門制作的文檔不屬于程序,它包含的是一些對程序員和用戶都有用的關(guān)于程序的信息。

文檔既可以是文字的又可以是電子格式的。既然文檔能為程序員和用戶服務(wù),因此也包含兩類:

程序手冊和用戶參考手冊。

程序手冊中包含所有對程序員有用的信息,包括問題描述和算法。因為程序手冊是軟件開

發(fā)和維護的工具,所以只有程序員才用,用戶不用。用戶參考或稱參考手冊中的信息可以幫助

用戶學(xué)會使用該軟件。用戶參考的電子版本通常能給用戶提供在線式幫助。表15-2比較了用戶

參考和程序手冊中的信息。

表15-2程序文檔

程序員手冊用戶參考

問題描述說明程序功能

以結(jié)構(gòu)化英語、偽代碼或流程圖描述算法如何安裝、啟動和實用程序,以及其中的圖表和菜單

程序源代碼故障分析與排除

程序員一般負責(zé)編排代碼并整理程序手冊,但用戶參考手冊現(xiàn)在一般由專業(yè)的科

技作家去編寫。科技作家專門解釋科技概念和程序,把復(fù)雜的概念簡化供非技術(shù)人員

閱讀。許多大學(xué)開設(shè)科技寫作課程,甚至有的大學(xué)設(shè)有科技寫作學(xué)位。在計算機工業(yè)

科技寫作中有經(jīng)驗的科技作家被聘為業(yè)余的或?qū)I(yè)的雇員。

6

?習(xí)題C

1.輸入已知數(shù)據(jù)來驗證程序是否輸出正確結(jié)果是______過程的-部分。

2.如果你忽略了編程語言的規(guī)則和語法,你可能會犯錯誤。

3.假設(shè)運行比薩餅程序時,輸出結(jié)果為Pizza2價錢便宜。但實驗數(shù)據(jù)說明Pizzal價錢便宜。

因為在你運行程序時出現(xiàn)了這種錯誤,所以應(yīng)歸為_______錯誤。

4.錯誤識別起來最困難而且費時。

5.解釋程序如何工作和及如何使用它。

6.為了解釋程序如何工作,而且使其他修改程序的程序員容易讀懂,程序員往往在程序中

插入?

7.是為程序員編寫的文檔,而是為用戶使用軟件設(shè)計的文檔。

15.4編程語言的特點

在過去的35年里出現(xiàn)了上百種編程語言。一些語言的開發(fā)是為了提高編程效率,降低出錯

率。而另一些則是為專門的編程提供高效的指令集,例如商業(yè)程序和科技程序。其他的是用于

教學(xué)的。

這些語言在描述如何工作和如何給合適任務(wù)類型提供信息時各具特色。例如,PASCAL語

言是一種可編譯的過程性的高級語言。當(dāng)你需要選擇語言來編程時,了解這些語言的特色和它

們的優(yōu)缺點將很有幫助。

第15章計算機程序設(shè)計441

15.4.1過程性語言

Q比薩餅問題程序是用過程性語

言編寫的嗎?

用過程性語言編寫的程序包含一系列的

描述,告訴計算機如何執(zhí)行這些過程來完成

特定的工作。帶有過程性特征的語言稱為過

程性語言。編寫比薩餅程序的BASIC語言就

具有過程性的特征,那些語句確切地告訴了

計算機如何工作:顯示信息請求用戶輸入比

薩餅形狀;請求輸入大小;然后請求輸入價

錢;如果餅是方的,用公式SquareinchPrice

=Price/Squareinches,等等。

過程性的編程語言適合于那些順序執(zhí)行

的算法。用過程性語言編寫的程序有一個起

點和一個終點。程序從起點到終點執(zhí)行的流

程是直線型的,即計算機從起點開始執(zhí)行寫圖15-14過程性語言的執(zhí)行

好的指令序列,直到終點(見圖15-14)。

15.4.2說明性語言

Q是否是所有的語言都需要程序員明確給定解決問題的步驟呢?

說明性語言只需程序員具體說明問題的規(guī)則并定義一些條件即可。語言自身內(nèi)置了方法把

這些規(guī)則解群為一些解決問題的步驟,這就把編程的重心轉(zhuǎn)移到描述問題和其規(guī)則上,而不再

是數(shù)學(xué)公式。因此說明性的語言更適合于思想概念清晰但數(shù)學(xué)概念復(fù)雜的編程工作。

不同于過程性的程序,用說明性語言編寫程序只需你告訴計算機要做什么,而不需告訴它

如何去做。如圖15-15所示,這是一段PROLOG程序,問題是在所列的幾個人中找出誰有姐妹。

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計算機文化

|卜

15.4.3腳本語言

QHTML是一種語言嗎?

HTML一般

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論