《新編計(jì)算機(jī)導(dǎo)論》課件-11第11章 算法與程序設(shè)計(jì)_第1頁(yè)
《新編計(jì)算機(jī)導(dǎo)論》課件-11第11章 算法與程序設(shè)計(jì)_第2頁(yè)
《新編計(jì)算機(jī)導(dǎo)論》課件-11第11章 算法與程序設(shè)計(jì)_第3頁(yè)
《新編計(jì)算機(jī)導(dǎo)論》課件-11第11章 算法與程序設(shè)計(jì)_第4頁(yè)
《新編計(jì)算機(jī)導(dǎo)論》課件-11第11章 算法與程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩54頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第11章算法與程序設(shè)計(jì)即使對(duì)于一個(gè)并不打算成為程序員的人來(lái)說(shuō),學(xué)習(xí)計(jì)算機(jī)程序設(shè)計(jì)和軟件開(kāi)發(fā)的一般知識(shí)也是很有意義的。首先,你在工作中可能會(huì)使用許多程序,你會(huì)發(fā)現(xiàn),一個(gè)文字處理軟件就可能包含了幾十萬(wàn)條程序指令,因此,其中存在一些錯(cuò)誤是在所難免的。同樣,還會(huì)發(fā)現(xiàn),一個(gè)人很難編寫(xiě)一個(gè)文字處理軟件,這通常是由專(zhuān)業(yè)的編程小組共同完成的。雖然現(xiàn)在一般用戶(hù)已經(jīng)不需要去專(zhuān)門(mén)編寫(xiě)自己想用的程序了,但仍然有可能會(huì)通過(guò)修改一些程序(例如宏和二次開(kāi)發(fā))來(lái)滿(mǎn)足某個(gè)特殊的要求,這時(shí),你對(duì)計(jì)算機(jī)編程的了解將有助于擬訂建設(shè)性的計(jì)劃。第11章算法與程序設(shè)計(jì)計(jì)算機(jī)程序就是告訴計(jì)算機(jī)如何解決問(wèn)題的一系列指令的有序集合。但是,寫(xiě)程序比寫(xiě)信要難得多,計(jì)算機(jī)編程非常強(qiáng)調(diào)結(jié)構(gòu)性和嚴(yán)謹(jǐn),絲毫不能馬虎。計(jì)算機(jī)程序設(shè)計(jì)首先從問(wèn)題的描述開(kāi)始,它是算法的基礎(chǔ),而算法則是程序的基礎(chǔ)。計(jì)算機(jī)編程的基本概念包括:?jiǎn)栴}描述、算法設(shè)計(jì)、編碼、控制結(jié)構(gòu)、測(cè)試和建立文檔等。11.1算法算法,也就是分步解決問(wèn)題的過(guò)程,其非正式的定義是:算法是一種逐步解決問(wèn)題或完成任務(wù)的方法。按照這種定義,算法完全獨(dú)立于計(jì)算機(jī)系統(tǒng),并且接收一組輸入數(shù)據(jù),和產(chǎn)生一組輸出數(shù)據(jù)。11.1.1問(wèn)題描述提出問(wèn)題才能解決問(wèn)題,問(wèn)題描述就是要說(shuō)明一些能用來(lái)解決問(wèn)題的要素。一個(gè)表達(dá)清晰的問(wèn)題描述應(yīng)該具備以下三個(gè)特征。1)能說(shuō)明描述問(wèn)題范疇的任何假設(shè)。2)羅列出已知的所有條件。3)具體說(shuō)明需要解決什么問(wèn)題。11.1.1問(wèn)題描述在一個(gè)問(wèn)題描述中,“假設(shè)”就是為了方便設(shè)計(jì)而假定為正確的陳述。問(wèn)題描述中的已知信息就是要計(jì)算機(jī)幫助解決問(wèn)題時(shí)提供給它的信息。已知信息在問(wèn)題描述中經(jīng)常用“已知”來(lái)給出。在說(shuō)明已知條件后,應(yīng)該說(shuō)明問(wèn)題解決后該如何做決定,也就是想讓程序輸出什么信息。11.1.2算法的概念我們先來(lái)分析一個(gè)算法的簡(jiǎn)單例子。假設(shè)要開(kāi)發(fā)一個(gè)從一組正整數(shù)中找到其中最大整數(shù)的算法。這個(gè)算法應(yīng)該能從一組任意的整數(shù)中找出其中的最大值,并且,這個(gè)算法必須具有通用性并獨(dú)立于整數(shù)的個(gè)數(shù)。要完成從許多整數(shù)中找到最大值的任務(wù)不可能(由一個(gè)人或一臺(tái)計(jì)算機(jī))只用一步完成,算法必須一個(gè)個(gè)地去測(cè)試每一個(gè)數(shù)。為此,可以用一種直接的方法,例如先對(duì)一組少量的數(shù)(如五個(gè))進(jìn)行分析,然后把解決方法擴(kuò)大到任意多的整數(shù)。假設(shè)即使是五個(gè)數(shù)的例子,算法也必須一個(gè)個(gè)地處理這些數(shù)??吹降谝粋€(gè)整數(shù)時(shí),它并不知道剩下的其他整數(shù)的值。等處理完第一個(gè)數(shù),算法才開(kāi)始處理第二個(gè)數(shù),照此進(jìn)行。圖11-1表示了解決這個(gè)問(wèn)題的一種方法。11.1.2算法的概念圖11-1在5個(gè)整數(shù)中找出最大值11.1.2算法的概念我們稱(chēng)這個(gè)算法為取最大值,每個(gè)算法都有自己的名字。這個(gè)算法接收一組五個(gè)數(shù)(作為輸入),然后輸出其中的最大值。這個(gè)算法中,為找到最大值采取了下面五個(gè)步驟。第一步:算法檢查第一個(gè)整數(shù)(12)。因?yàn)檫€沒(méi)有檢查其他整數(shù),所以當(dāng)前的最大值就是第一個(gè)數(shù)。算法中定義了一個(gè)稱(chēng)為L(zhǎng)argest的變量,并把第一個(gè)數(shù)的值(12)賦給它。11.1.2算法的概念第二步:算法把上一步得到的最大值Largest(即12)和第二個(gè)數(shù)(8)進(jìn)行比較,發(fā)現(xiàn)目前的最大值大于第二個(gè)數(shù),Largest中的數(shù)還是最大值,不需要改變。第三步:新的數(shù)(13)大于Largest,最大值應(yīng)該由第三個(gè)數(shù)(13)代替。算法把13賦給Largest。第四步:當(dāng)前Largest比第四個(gè)數(shù)(9)大,該步中最大值未改變。第五步:當(dāng)前Largest比第五個(gè)數(shù)(11)大,該步中最大值未改變。最后,因?yàn)橐呀?jīng)沒(méi)有其他數(shù)需要處理,所以算法輸出Largest的值(13)。11.1.2算法的概念現(xiàn)在有兩個(gè)問(wèn)題:首先,第一步中的動(dòng)作與其他步驟中的不一樣。其次,第二步到第五步的程序功能一樣,但程序描述語(yǔ)言不一樣。第一步不同于其他步是因?yàn)槟菚r(shí)最大值Largest還沒(méi)有初始化。如果一開(kāi)始就把最大值Largest賦成0(沒(méi)有正整數(shù)比0?。?,那么第一步就可寫(xiě)成和其他步一樣了。于是,增加一個(gè)新的步驟(稱(chēng)為第0步,表明它要在處理任何其他數(shù)之前完成)。再把其余程序段都寫(xiě)成“如果當(dāng)前的數(shù)大于最大值Largest,那么它就成為最大值”。11.1.2算法的概念這個(gè)算法可以泛化嗎?假使要從N個(gè)正整數(shù)中找到最大值,N的值可能是l000或1000000,或者更多。當(dāng)然,可以重復(fù)每一步。但是如果為程序改變算法,就必須編寫(xiě)N步動(dòng)作。有一種更好的方法可以改進(jìn)它。只要讓計(jì)算機(jī)重復(fù)這個(gè)步驟N次?,F(xiàn)在,在算法圖形表示中就包括了這個(gè)特性,如圖11-2所示。11.1.2算法的概念圖11-2最大值算法的泛化11.1.3三種結(jié)構(gòu)20世紀(jì)70年代,E.Dijkstra首先提出了結(jié)構(gòu)化程序設(shè)計(jì)(StructuredProgramming,SP)方法,主張只用順序、選擇和重復(fù)三種基本控制結(jié)構(gòu)來(lái)嵌套連接成具有復(fù)雜層次的“結(jié)構(gòu)化程序”,每種基本控制結(jié)構(gòu)只有一個(gè)入口和一個(gè)出口,并完成單一的操作。在順序結(jié)構(gòu)中,算法(最終是程序)都是指令的序列,指令可以是簡(jiǎn)單指令或是其他兩種結(jié)構(gòu)之一。11.1.3三種結(jié)構(gòu)有些問(wèn)題只用順序結(jié)構(gòu)是不能夠解決的,需要檢測(cè)條件是否滿(mǎn)足。假如測(cè)試的結(jié)果為真,即條件滿(mǎn)足,則可以繼續(xù)順序執(zhí)行指令;假如結(jié)果為假,即條件不滿(mǎn)足,程序?qū)牧硗庖粋€(gè)指令序列繼續(xù)執(zhí)行。這就是所謂的選擇(判斷)結(jié)構(gòu)。在有些問(wèn)題中,相同的一系列順序指令需要重復(fù),那么就可以用循環(huán)結(jié)構(gòu)來(lái)解決這個(gè)問(wèn)題。從指定的數(shù)據(jù)集中找出最大數(shù)的算法就是這種結(jié)構(gòu)的例子。已經(jīng)證實(shí)其他結(jié)構(gòu)都是不必要的,僅僅使用這三種結(jié)構(gòu)就可以使程序或算法容易理解、調(diào)試或修改,如圖11-3所示。11.1.3三種結(jié)構(gòu)圖11-3順序、判斷、循環(huán)結(jié)構(gòu)11.1.4算法的框圖表示框圖(又稱(chēng)“流程圖”)是算法的圖形表示方法之一,它使用圖的形式掩蓋了算法的細(xì)節(jié),只顯示算法從開(kāi)始到結(jié)束的整個(gè)流程。三種結(jié)構(gòu)的框圖表示如圖11-4所示。11.1.5算法的定義圖11-4三種結(jié)構(gòu)的框圖表示11.1.5算法的定義下面,我們給出算法的正式定義:算法是一組明確步驟的有序集合,它產(chǎn)生結(jié)果并在有限的時(shí)間內(nèi)終止。解釋如下。1)有序集合。算法必須是一組定義完好且排列有序的指令集合。2)明確步驟。算法的每一步都必須有清晰明白的定義。如某一步是將兩數(shù)相加,那么必須定義相加的兩個(gè)數(shù)和加法運(yùn)算,同一符號(hào)不能在某處用作加法符號(hào),而在其他地方用作乘法符號(hào)。11.1.5算法的定義3)產(chǎn)生結(jié)果。算法必須產(chǎn)生結(jié)果,否則該算法就沒(méi)有意義。結(jié)果集可以是被調(diào)用的算法返回的數(shù)據(jù)或其他效果(例如打?。?。4)在有限的時(shí)間內(nèi)終止。算法必須能夠終止。如果不能(例如,無(wú)限循環(huán)),說(shuō)明不是算法。可解問(wèn)題的解決方法為可終止的算法。采用三種基本結(jié)構(gòu)可以為任何可解的問(wèn)題創(chuàng)建算法。結(jié)構(gòu)化編程的原則要求把算法分成幾個(gè)單元,我們稱(chēng)之為子算法(又稱(chēng)子程序、子例程、過(guò)程、函數(shù)、方法和模塊等)。每個(gè)子算法又分為更小的子算法。這個(gè)過(guò)程持續(xù)到子算法變?yōu)樽畋举|(zhì)的(可被立即理解)。11.1.5算法的定義有一些算法在計(jì)算機(jī)科學(xué)中的應(yīng)用非常普遍,稱(chēng)之為基本算法。例如,一些最常用的算法包括:求和、乘積、最大和最小、排序(選擇排序、冒泡排序、插入排序等)和查找(順序查找和折半查找等)。11.2編寫(xiě)計(jì)算機(jī)程序問(wèn)題描述和算法通常寫(xiě)在程序說(shuō)明書(shū)(例如《詳細(xì)設(shè)計(jì)說(shuō)明書(shū)》)中,它們是程序設(shè)計(jì)必不可少的藍(lán)圖。完成程序說(shuō)明書(shū)后,就可以編寫(xiě)程序了。編寫(xiě)程序就是用某種程序設(shè)計(jì)語(yǔ)言把算法程序化,編寫(xiě)程序的人稱(chēng)為程序員。對(duì)于大部分程序設(shè)計(jì)語(yǔ)言來(lái)說(shuō),編程就是輸入命令;有些程序設(shè)計(jì)語(yǔ)言只需要選擇對(duì)象和屬性或編寫(xiě)對(duì)象的腳本即可。11.2.1程序順序所謂順序執(zhí)行,就是計(jì)算機(jī)按照程序員指定的順序執(zhí)行每一條指令。第一條語(yǔ)句先執(zhí)行,接下來(lái)是第二條,……,一直到程序末尾。圖11-5中的流程圖表述了一段小的順序指令:1)開(kāi)始;2)打??;3)打??;4)結(jié)束。一些算法給出的執(zhí)行順序和程序中寫(xiě)的不同,例如在某些情況下跳過(guò)一些指令或重復(fù)執(zhí)行某些指令等。這里,控制結(jié)構(gòu)控制著程序執(zhí)行的順序。一般有三種控制結(jié)構(gòu),即順序控制、選擇控制和循環(huán)控制。11.2.1程序順序圖11-5順序程序執(zhí)行11.2.2順序結(jié)構(gòu)順序控制結(jié)構(gòu)能改變計(jì)算機(jī)執(zhí)行的順序,使得在執(zhí)行一條指令之后轉(zhuǎn)而執(zhí)行其他的指令。下面這段QBASIC程序中,使用GOTO語(yǔ)句告訴計(jì)算機(jī)直接跳往標(biāo)號(hào)為“Widget”的語(yǔ)句執(zhí)行。這樣,語(yǔ)句“PRINT‘Thisisthesecondline.’”將永遠(yuǎn)不會(huì)被執(zhí)行。

PRINT“Thisisthefirstline.” GOTOWidget PRINT“Thisisthesecondline.” Widget:PRINT“AllDone!” END11.2.2順序結(jié)構(gòu)圖11-6表示的流程圖說(shuō)明了計(jì)算機(jī)先按標(biāo)號(hào)順序執(zhí)行,然后在GOTO語(yǔ)句的作用下跳往其他語(yǔ)句。雖然GOTO結(jié)構(gòu)很簡(jiǎn)單,但過(guò)多的使用會(huì)使程序的可讀性和可維護(hù)性很差,所以熟練的程序員忌諱使用它。有經(jīng)驗(yàn)的程序員喜歡用除GOTO語(yǔ)句以外的順序控制結(jié)構(gòu),把程序改寫(xiě)成一個(gè)個(gè)的子程序、過(guò)程、模塊或函數(shù),這些都是程序的一段代碼,但不包含在主程序的順序路徑內(nèi)。11.2.1程序順序圖11-6執(zhí)行GOTO語(yǔ)句11.2.3選擇結(jié)構(gòu)圖11-7用流程圖描述了計(jì)算機(jī)根據(jù)菱形框中的判斷結(jié)果來(lái)選擇執(zhí)行路徑。

圖11-7選擇結(jié)構(gòu)示例11.2.4重復(fù)結(jié)構(gòu)重復(fù)控制結(jié)構(gòu)又稱(chēng)為循環(huán)結(jié)構(gòu),可以重復(fù)執(zhí)行一條或多條指令直到滿(mǎn)足退出條件為止。在許多程序設(shè)計(jì)語(yǔ)言中,最常用的循環(huán)結(jié)構(gòu)是FOR…NEXT和WHILE…WEND結(jié)構(gòu)。下面的例子用FOR…NEXT結(jié)構(gòu)打印一條信息三次。圖11-8的流程圖描述了計(jì)算機(jī)如何執(zhí)行循環(huán)結(jié)構(gòu)。

FORN=1TO3 PRINT“There’snoplacelikehome.” NEXTN END11.3.1測(cè)試程序圖11-8循環(huán)結(jié)構(gòu)示例11.3測(cè)試和文檔在編制程序的同時(shí)應(yīng)當(dāng)編寫(xiě)文檔,以記錄和解釋程序的工作過(guò)程。編程完成后,必須測(cè)試代碼的每一段來(lái)確定其可以正確地工作。11.3.1測(cè)試程序一個(gè)計(jì)算機(jī)程序必須對(duì)其進(jìn)行測(cè)試以保證程序能正確工作。測(cè)試通常是輸入測(cè)試數(shù)據(jù)來(lái)看看程序是否能夠產(chǎn)生正確結(jié)果。如果沒(méi)有產(chǎn)生正確結(jié)果,程序員必須查找程序中的錯(cuò)誤,修改錯(cuò)誤,再測(cè)試程序。這個(gè)過(guò)程可能需要相當(dāng)長(zhǎng)的時(shí)間,但是,測(cè)試是程序設(shè)計(jì)中的關(guān)鍵步驟。11.3.1測(cè)試程序在程序中發(fā)現(xiàn)的錯(cuò)誤可能是語(yǔ)法錯(cuò)誤,也可能是運(yùn)行時(shí)的錯(cuò)誤。語(yǔ)法錯(cuò)誤是由于指令沒(méi)有按照程序設(shè)計(jì)語(yǔ)言的語(yǔ)法規(guī)則編寫(xiě)所致;運(yùn)行時(shí)錯(cuò)誤是指程序運(yùn)行時(shí)產(chǎn)生的錯(cuò)誤,這類(lèi)錯(cuò)誤可以是由類(lèi)型錯(cuò)誤造成,語(yǔ)法正確但不能產(chǎn)生所需的結(jié)果。其他運(yùn)行時(shí)錯(cuò)誤歸類(lèi)為邏輯錯(cuò)誤。邏輯錯(cuò)誤是一種程序設(shè)計(jì)或邏輯中的錯(cuò)誤。邏輯錯(cuò)誤可能是由于流程圖或偽代碼中問(wèn)題說(shuō)明不足或解法不完整或不正確造成。邏輯錯(cuò)誤比起語(yǔ)法錯(cuò)誤來(lái)通常更難檢測(cè),也更費(fèi)時(shí)間。11.3.2程序文檔一個(gè)計(jì)算機(jī)程序不可避免地要修改。如果程序文檔編制得好,修改程序就比較容易。程序文檔解釋了程序的工作過(guò)程及使用方法。創(chuàng)建的文檔應(yīng)當(dāng)能為其他程序員用來(lái)修改程序或者為其他人使用程序提供幫助。程序文檔一般有兩種形式:插入到程序代碼中的注釋和專(zhuān)門(mén)制作的文檔。注釋是插入到程序代碼行中的解釋性注解。改寫(xiě)一個(gè)程序時(shí),程序員需要閱讀原來(lái)程序以理解程序如何工作,然后修訂適當(dāng)?shù)拇a段。如果一個(gè)程序員在原先的程序中加了注釋?zhuān)敲闯绦蚓捅容^容易理解。計(jì)算機(jī)執(zhí)行程序時(shí)會(huì)略過(guò)這些注釋?zhuān)⑨寣?duì)需要修改程序的程序員來(lái)說(shuō)是很方便的。11.3.2程序文檔專(zhuān)門(mén)制作的文檔不屬于程序,它包含的是一些對(duì)程序員和用戶(hù)都有用的關(guān)于程序的信息。文檔既可以是文字的也可以是電子格式的。文檔包含兩類(lèi),即程序手冊(cè)和用戶(hù)參考手冊(cè)。程序手冊(cè)中包含所有對(duì)程序員有用的信息,包括問(wèn)題描述和算法。用戶(hù)參考手冊(cè)中的信息可以幫助用戶(hù)學(xué)會(huì)使用該軟件。用戶(hù)參考的電子版本通常能給用戶(hù)提供在線式幫助。11.4編程語(yǔ)言的特點(diǎn)在過(guò)去幾十年間出現(xiàn)了上百種編程語(yǔ)言。一些程序設(shè)計(jì)語(yǔ)言的開(kāi)發(fā)是為了提高編程效率,降低出錯(cuò)率。而另一些則是為專(zhuān)門(mén)的編程目的提供高效的指令集。這些語(yǔ)言在描述如何工作和如何給合適任務(wù)類(lèi)型提供信息時(shí)各具特色。例如,Pascal語(yǔ)言就是一種可編譯的過(guò)程性高級(jí)語(yǔ)言。需要選擇程序設(shè)計(jì)語(yǔ)言時(shí),了解這些語(yǔ)言的特色和它們的優(yōu)缺點(diǎn)將很有幫助。11.4.1過(guò)程性語(yǔ)言用過(guò)程性語(yǔ)言編寫(xiě)的程序包含一系列語(yǔ)句,告訴計(jì)算機(jī)如何執(zhí)行這些過(guò)程來(lái)完成特定的工作。帶有過(guò)程性特征的語(yǔ)言稱(chēng)為過(guò)程性語(yǔ)言。過(guò)程性的編程語(yǔ)言適合于那些順序執(zhí)行算法。用過(guò)程性語(yǔ)言編寫(xiě)的程序有一個(gè)起點(diǎn)和一個(gè)終點(diǎn)。程序從起點(diǎn)到終點(diǎn)執(zhí)行的流程是線型的,即計(jì)算機(jī)從起點(diǎn)開(kāi)始執(zhí)行寫(xiě)好的指令序列,直到終點(diǎn),如圖11-9所示。11.3.1測(cè)試程序圖11-9順序執(zhí)行過(guò)程性語(yǔ)言11.4.2說(shuō)明性語(yǔ)言說(shuō)明性語(yǔ)言只需程序員具體說(shuō)明問(wèn)題的規(guī)則并定義一些條件即可。語(yǔ)言本身內(nèi)置了方法,把這些規(guī)則解釋為一些解決問(wèn)題的步驟,這樣就把編程的重心轉(zhuǎn)移到描述問(wèn)題及其規(guī)則上,而不再是數(shù)學(xué)公式。因此,說(shuō)明性的語(yǔ)言更適合于思想概念清晰但數(shù)學(xué)概念復(fù)雜的編程工作。不同于過(guò)程性的程序,用說(shuō)明性語(yǔ)言編寫(xiě)程序只需告訴計(jì)算機(jī)要做什么,而不需告訴它如何去做。如圖11-10所示,這是一段Prolog程序,問(wèn)題是在所列的幾個(gè)人中找出誰(shuí)有姐妹。11.4.2說(shuō)明性語(yǔ)言圖11-10說(shuō)明性語(yǔ)言(Prolog)示例11.4.3腳本語(yǔ)言HTML一般歸為腳本語(yǔ)言。腳本語(yǔ)言以腳本的形式定義一項(xiàng)任務(wù),腳本不能單獨(dú)運(yùn)行,其運(yùn)行需要依附一個(gè)主機(jī)應(yīng)用系統(tǒng)。例如用HTML標(biāo)簽為顯示網(wǎng)頁(yè)編寫(xiě)一個(gè)腳本,這個(gè)腳本由瀏覽器軟件解釋。諸如VisualBASICforApplications(VBA)之類(lèi)的腳本語(yǔ)言包含在許多應(yīng)用程序中,像文字處理軟件和電子表格軟件等,可以用腳本使應(yīng)用程序中的任務(wù)自動(dòng)化,這些自動(dòng)化例程即通常所說(shuō)的宏指令。腳本語(yǔ)言使用起來(lái)比其他編程語(yǔ)言要簡(jiǎn)單,但它提供的控制選項(xiàng)很少。HTML對(duì)不擅長(zhǎng)編程的人是一個(gè)很好的選擇。11.4.4低級(jí)語(yǔ)言程序員需要使用低級(jí)編程語(yǔ)言為處于計(jì)算機(jī)系統(tǒng)低層的硬件(像處理器、寄存器和內(nèi)存地址等)編寫(xiě)指令。低級(jí)語(yǔ)言使程序員可以直接在硬件級(jí)水平上操作機(jī)器。程序員通常使用低級(jí)語(yǔ)言編寫(xiě)像編譯器、操作系統(tǒng)和設(shè)備驅(qū)動(dòng)程序之類(lèi)的系統(tǒng)軟件。低級(jí)語(yǔ)言中的指令一般和處理器的指令相對(duì)應(yīng)。使用低級(jí)語(yǔ)言編程,即使是兩數(shù)相加這樣簡(jiǎn)單的操作也要數(shù)條指令才能實(shí)現(xiàn)。表11-1就是使用低級(jí)語(yǔ)言編寫(xiě)的一段程序,其目的是累加兩個(gè)數(shù)。11.4.4低級(jí)語(yǔ)言表11-1低級(jí)匯編語(yǔ)言指令示例11.4.4低級(jí)語(yǔ)言機(jī)器語(yǔ)言是二進(jìn)制形式的計(jì)算機(jī)能直接執(zhí)行的低級(jí)語(yǔ)言。機(jī)器語(yǔ)言對(duì)人來(lái)說(shuō)既難理解又難掌握,只在早期高級(jí)語(yǔ)言還沒(méi)出現(xiàn)時(shí)使用過(guò)。11.4.5高級(jí)語(yǔ)言高級(jí)語(yǔ)言提供給程序員的指令更像是人類(lèi)的自然語(yǔ)言。20世紀(jì)50年代,科學(xué)家剛開(kāi)始構(gòu)思高級(jí)語(yǔ)言時(shí),曾經(jīng)以為使用高級(jí)語(yǔ)言可以減少編程中的錯(cuò)誤,但事實(shí)相反,語(yǔ)法錯(cuò)誤和邏輯錯(cuò)誤卻更易出現(xiàn)。不過(guò),高級(jí)語(yǔ)言的確降低了出錯(cuò)率并大大縮短了寫(xiě)程序的時(shí)間。高級(jí)語(yǔ)言程序必須翻譯成計(jì)算機(jī)能夠執(zhí)行的指令,因此需要編譯或者解釋。11.4.6編譯程序和解釋程序多數(shù)高級(jí)語(yǔ)言程序在執(zhí)行之前需要使用編譯器軟件把它翻譯為低級(jí)指令。這時(shí),用高級(jí)語(yǔ)言編寫(xiě)的程序稱(chēng)為源代碼,編譯后的程序稱(chēng)為目標(biāo)代碼。編譯程序最終把程序編譯成可執(zhí)行的代碼。因此,調(diào)試源程序需要三步:寫(xiě)程序、編譯程序和運(yùn)行程序。一旦發(fā)現(xiàn)程序有錯(cuò),必須修改源程序并重新編譯,然后才能再測(cè)試。對(duì)于編譯完成后沒(méi)有錯(cuò)誤的程序,再運(yùn)行時(shí)就不用編譯了。11.4.6編譯程序和解釋程序解釋程序是用解釋器軟件而不是用編譯器來(lái)生成可執(zhí)行代碼。運(yùn)行一個(gè)解釋性程序設(shè)計(jì)語(yǔ)言編寫(xiě)的程序時(shí),語(yǔ)言解釋器讀取一條指令,然后把它轉(zhuǎn)化成可執(zhí)行的機(jī)器語(yǔ)言指令,執(zhí)行完這條指令后解釋器再讀入下一條指令并解釋成機(jī)器語(yǔ)言,如此繼續(xù)。解釋語(yǔ)言編寫(xiě)的程序執(zhí)行速度慢,尤其是循環(huán)語(yǔ)句多的程序效率就更低,因?yàn)橛?jì)算機(jī)必須解釋每一條語(yǔ)句,循環(huán)語(yǔ)句就要重復(fù)解釋多次。但調(diào)試解釋性語(yǔ)言程序時(shí)不用編譯,因此調(diào)試所花費(fèi)的時(shí)間似乎要少一些。11.4.7面向?qū)ο笳Z(yǔ)言面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言是建立在用對(duì)象編程的方法基礎(chǔ)之上的。對(duì)象就是程序中使用的實(shí)體或“事物”,例如屏幕上的按鈕圖標(biāo)就是一個(gè)對(duì)象,我們已經(jīng)習(xí)慣于用鼠標(biāo)單擊一個(gè)按鈕。程序員可以使用面向?qū)ο蟮恼Z(yǔ)言來(lái)定義按鈕對(duì)象,在程序運(yùn)行時(shí)把它顯示出來(lái)。對(duì)象屬于一個(gè)具有一定特性的類(lèi)或組?!按翱凇鳖?lèi)是比較常見(jiàn)的類(lèi),所有的窗口對(duì)象,包括應(yīng)用程序窗口,都屬于“窗口”類(lèi),它們具有相同的屬性,如都有一個(gè)標(biāo)題欄和一個(gè)“關(guān)閉”按鈕等。程序員創(chuàng)建一個(gè)窗口對(duì)象時(shí),他就獲得或者說(shuō)繼承了窗口類(lèi)的面向?qū)ο蟮膶傩院筒僮?,但一個(gè)特定的窗口實(shí)例可以具有自己特定的屬性,如標(biāo)題、大小、屏幕程序設(shè)計(jì)上的位置等均可不同。11.4.7面向?qū)ο笳Z(yǔ)言同一對(duì)象可用在不同的程序中,這就擴(kuò)大了程序員的生產(chǎn)率。例如,許多應(yīng)用軟件都給用戶(hù)文件提供了“打開(kāi)”、“保存”、“另存為”、“打印”等操作,如果編寫(xiě)這樣的應(yīng)用程序,定義一個(gè)對(duì)象來(lái)完成這些操作會(huì)很方便,只要程序中用到這些操作,隨時(shí)都可調(diào)用這些對(duì)象。11.4.8事件驅(qū)動(dòng)語(yǔ)言程序事件是指程序必須做出響應(yīng)的動(dòng)作或表現(xiàn),比如按鍵和單擊鼠標(biāo)。程序員用事件驅(qū)動(dòng)語(yǔ)言編程可以使程序隨時(shí)檢測(cè)并響應(yīng)事件。使用圖形界面的程序大部分都是事件驅(qū)動(dòng)的,它們?cè)谄聊簧巷@示諸如菜單這樣的控件,并在用戶(hù)作用于控件時(shí)采取某一動(dòng)作。事件驅(qū)動(dòng)的程序中,代碼段要和圖形化的對(duì)象相關(guān)聯(lián),比如命令按鈕和圖標(biāo)。用戶(hù)操作某一對(duì)象時(shí)產(chǎn)生一個(gè)事件,比如單擊“繼續(xù)”按鈕,該事件就觸發(fā)與此對(duì)象關(guān)聯(lián)的指令執(zhí)行。11.4.9構(gòu)件(組件)實(shí)際中,面向?qū)ο蟪绦蛑械膶?duì)象是由程序設(shè)計(jì)者生成的。但程序員可以購(gòu)買(mǎi)一些稱(chēng)為“構(gòu)件”(也稱(chēng)“組件”)或“庫(kù)”的對(duì)象。構(gòu)件是事先寫(xiě)好的對(duì)象,程序員可以應(yīng)用到自己的程序中。對(duì)于目前流行的編程語(yǔ)言,構(gòu)件可以買(mǎi)到。使用構(gòu)件編程就稱(chēng)為構(gòu)件程序設(shè)計(jì)。程序員可以選擇各種各樣的構(gòu)件來(lái)增強(qiáng)功能,比如電子表格、數(shù)據(jù)庫(kù)管理、專(zhuān)家系統(tǒng)、報(bào)表生成、在線幫助、數(shù)據(jù)查詢(xún)、文字編輯和3D圖形等。11.5選擇編程語(yǔ)言跟人類(lèi)的自然語(yǔ)言一樣,程序設(shè)計(jì)語(yǔ)言也在不斷的改變和進(jìn)化中。在新的語(yǔ)法和表達(dá)式不斷充實(shí)已有語(yǔ)言的同時(shí),那些舊的和過(guò)時(shí)的東西也因?yàn)椴挥枚饾u消退。計(jì)算機(jī)語(yǔ)言的變化是逐步的和有結(jié)構(gòu)的,它往往是隨著該語(yǔ)言的發(fā)行廠商的修改或標(biāo)準(zhǔn)化組織對(duì)其進(jìn)行標(biāo)準(zhǔn)化而發(fā)生變化。11.5選擇編程語(yǔ)言通常情況下,一項(xiàng)任務(wù)可以用不同的編程語(yǔ)言來(lái)實(shí)現(xiàn)。在一項(xiàng)工程選擇編程語(yǔ)言時(shí),應(yīng)該考慮以下問(wèn)題。這種編程語(yǔ)言是否適合于手中的任務(wù)?這種語(yǔ)言在其他的應(yīng)用程序中是否也經(jīng)常使用?項(xiàng)目小組中的人是否都精通這門(mén)語(yǔ)言?如果這些問(wèn)題的回答都是肯定的,那么這門(mén)語(yǔ)言對(duì)這項(xiàng)工程是一個(gè)很好的選擇。了解一些流行語(yǔ)言的特性對(duì)回答第一個(gè)問(wèn)題會(huì)有幫助。11.5選擇編程語(yǔ)言BASIC是為初級(jí)編程者設(shè)計(jì)的,自從1964年問(wèn)世以來(lái),已經(jīng)出現(xiàn)了幾種流行的版本。由于BASIC容易使用和適合于各種計(jì)算機(jī)系統(tǒng),成為最流行和最廣泛使用的語(yǔ)言之一。BASIC是一種過(guò)程性的高級(jí)語(yǔ)言,它的大多數(shù)版本都是解釋執(zhí)行的。BASIC的新版本,像微軟的VisualBasic(VB)就是功能強(qiáng)大的綜合性編程語(yǔ)言,尤其適合于帶有圖形界面的事件驅(qū)動(dòng)程序設(shè)計(jì)。FORTRAN出現(xiàn)于1954年,雖經(jīng)幾次更新,但卻是目前仍在使用的最早的高級(jí)語(yǔ)言。FORTRAN一般被科學(xué)家用來(lái)寫(xiě)大型機(jī)和小型機(jī)上的科學(xué)計(jì)算程序和工程程序。FORTRAN語(yǔ)言在1966年進(jìn)行標(biāo)準(zhǔn)化以后,分別于1977年和1990年兩次重新發(fā)行過(guò)。11.5選擇編程語(yǔ)言Pascal開(kāi)發(fā)于1971年,是編譯執(zhí)行的過(guò)程性高級(jí)語(yǔ)言,它開(kāi)了結(jié)構(gòu)化程序設(shè)計(jì)的先河。但Pascal很少用于專(zhuān)業(yè)編程和商用軟件的開(kāi)發(fā),主要用于幫助學(xué)生學(xué)習(xí)計(jì)算機(jī)編程。C是編譯執(zhí)行的過(guò)程性高級(jí)語(yǔ)言并帶有低級(jí)語(yǔ)言的接口,這種特性給程序員帶來(lái)很大的靈活性,利用這種靈活性,有經(jīng)驗(yàn)的程序員可以使他們的程序速度快、效率高,但也使C程序難于理解、難于調(diào)試和維護(hù)。11.5選擇編程語(yǔ)言C++是支持面向?qū)ο蟮腃語(yǔ)言。許多人認(rèn)為C++的面向?qū)ο筇匦钥梢蕴岣叱绦騿T的效率,但面向?qū)ο蟮某绦蛟O(shè)計(jì)的思維方式與過(guò)程性設(shè)計(jì)迥然不同,因此,剛剛使用C++編程的程序員往往困難重重。SQL

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論