版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第二章 程序設(shè)計語言
§2.1高級程序設(shè)計語言概述§2.2高級程序設(shè)計語言實現(xiàn)計算的方式§2.3高級程序設(shè)計語言的基本特征
§2.4面向?qū)ο蟪绦蛟O(shè)計語言的基本特征§2.5網(wǎng)絡(luò)計算機(jī)時代的編程語言§2.6小結(jié)12.1高級程序設(shè)計語言概述
程序的表達(dá)手段是程序設(shè)計語言。程序設(shè)計語言是人-機(jī)交換信息的媒體;是表達(dá)軟件(程序)的工具;是人-人交換信息的工具。軟件的開發(fā)和使用,協(xié)作開發(fā)、使用修改都要讀程序,程序設(shè)計語言必須規(guī)范化和標(biāo)準(zhǔn)化。最初的語言是機(jī)器語言。機(jī)器語言在內(nèi)存中開辟兩個區(qū):數(shù)據(jù)區(qū)存放數(shù)據(jù);指令區(qū)存放指令。CPU從指令區(qū)第一個地址開始逐條取出指令并釋義執(zhí)行,直到所有的指令都被執(zhí)行完。一般的指令格式如下:操作碼操作數(shù)操作數(shù)表中列出了三種類型的指令:2
DATA SEGMENT
XX DBX
YY DB? DATAENDS CODESEGMENT
ASSUMECS:CODE,DS:DATA START:MOVAX,DATA
MOVDS,AX
MOVAL,XX CMPAL,0
JGEBIGR MOVAL,0FFH
MOVYY,AL
HLT
JEEQUT BIGR:MOV AL,01H
MOV YY,AL
HLTEQUT:MOV YY,AL
HLTCODEENDS
ENDSTART ;數(shù)據(jù)段開始;X值存入XX單元;YY單元留作存函數(shù)Y的值;以上是數(shù)據(jù)段;代碼段開始;CS段中裝入代碼,DS段中裝入數(shù)據(jù);執(zhí)行開始;;將XX中的值轉(zhuǎn)移到運(yùn)算器AL;將運(yùn)算器AL中的值與0比較;如果大于等于0就跳BIGR;X<0,將-1放入運(yùn)算器;將運(yùn)算器中的數(shù)移到Y(jié)Y中;停止;若等于0就跳到EQUT;將數(shù)01H移到運(yùn)算器;將運(yùn)算器中的數(shù)移到Y(jié)Y中
;運(yùn)算器中是0則移到Y(jié)Y中
;代碼段結(jié)束;結(jié)束MASM寫的匯編程序3main(){intx,y;cinx;if(x>0)y=1elseif(x=0)y=0elsey=-1coutx,y;}
用類VC編寫的程序
VC程序更接近數(shù)學(xué)公式。與機(jī)器的運(yùn)算器、寄存器和內(nèi)存地址無關(guān)。高級語言是面向計算過程的,與解題的步驟有關(guān)。
42.2 高級程序設(shè)計語言實現(xiàn)計算的方式機(jī)器只知道根據(jù)機(jī)器語言指令來執(zhí)行程序,高級語言程序必須通過翻譯變成機(jī)器語言程序,這個工作一般由翻譯程序自動完成的。把一種語言翻譯成另一種語言的程序叫做翻譯器(如C++翻成C)。把高級語言程序翻譯成機(jī)器語言程序有兩種做法:編譯和解釋,相應(yīng)的翻譯程序分別叫做編譯器和解釋器。52.2.1 編譯器工作原理第一步詞法分析。一個高級語言程序是編譯(程序)器的輸入。編譯器逐行掃描程序,首先是識別符號串:關(guān)鍵字、字面量、標(biāo)識符(變量名、數(shù)據(jù)名)、運(yùn)算符、注釋行、特殊符號(續(xù)行、語句結(jié)束、數(shù)組等)這六類符號,分別歸類等待處理。這個過程就是詞法分析(LexicalAnalysis)。第二步作語法分析(SyntaxAnalysis)。這時一個語句就作為一串記號(token)流由語法分析器處理。按照語言的文法檢查每個語法分析樹,判定是否為合乎語法的句子。如果是合法句子就以內(nèi)部格式把這個語法樹保存起來,否則報錯。這樣直至檢查完整個程序。第三步做語義分析(SemanticAnalysis)。對各句子的語法樹做檢查:運(yùn)算符兩邊類型是否相兼容;作哪些類型轉(zhuǎn)換(例如實數(shù)向整數(shù)賦值要取整);是否控制轉(zhuǎn)移到不該去的地方;是否有重名或者使語義含糊的記號等。如果有錯轉(zhuǎn)到出錯處理,否則生成中間代碼。6第四步中間代碼生成.中間代碼是向目標(biāo)碼即機(jī)器語言的代碼過渡的一種編碼,其形式盡可能和機(jī)器的匯編語言相似,以便下一步的代碼生成。中間碼不涉及具體機(jī)器的操作碼和地址碼。采用中間碼的好處是可以在中間碼上作優(yōu)化。第五步優(yōu)化。對中間碼程序做局部優(yōu)化和全局優(yōu)化,使運(yùn)行更快,占用空間最小。局部優(yōu)化是合并冗余操作、簡化計算,例如x:=0;可用一條“清零”指令替換.全局優(yōu)化包括改進(jìn)循環(huán)、減少調(diào)用次數(shù)和快速地址算法等。第六步代碼生成。由代碼生成器生成目標(biāo)機(jī)器的目標(biāo)碼(或匯編)程序,要作數(shù)據(jù)分段、選定寄存器等工作,然后生成機(jī)器可執(zhí)行的代碼。第七步連接加載:高級語言源程序經(jīng)編譯后得到目標(biāo)碼程序,但它還不能立即裝入機(jī)器執(zhí)行,一般情況下它是不夠完整的。如程序中用到abs(),sin()這些函數(shù),可直接調(diào)用,不需求絕對值、求正弦的程序,已作為目標(biāo)碼存放在機(jī)器中。編譯后得到的目標(biāo)模塊還需進(jìn)行連接.連接程序(即Linker)找出需要連接的外部模塊并到模塊庫中找出被調(diào)用的模塊,調(diào)入內(nèi)存并連接到目標(biāo)模塊上,形成可執(zhí)行程序。把執(zhí)行程序加載(Loading)到內(nèi)存中合適的位置,即可執(zhí)行。72.2.2高級語言程序的解釋執(zhí)行
對高級語言源程序采取解釋執(zhí)行的方式.解釋執(zhí)行需要有一個解釋器(Interpreter),它將源代碼逐句讀入。先作詞法分析,建立內(nèi)部符號表;再作語法和語義分析,即以中間碼建立語法樹,并作類型檢查。完成檢查后把每一語句壓入執(zhí)行堆棧,壓入后立即解釋執(zhí)行。操作系統(tǒng)的命令、BASIC、VB、Prolog、LISP、Java、JavaScript、Postscript都是解釋執(zhí)行的,各種應(yīng)用軟件提供的界面語言(一般都很小)多半是解釋執(zhí)行的。解釋器不大,工作空間也不大,能根據(jù)程序執(zhí)行情況決定下一步做什么是它的優(yōu)點,解釋執(zhí)行難于優(yōu)化、效率較低,是該語言的缺點。編譯型語言由于可進(jìn)行優(yōu)化(有的編譯器可作多次優(yōu)化),目標(biāo)碼效率很高,是目前軟件實現(xiàn)的主要方式。語言編寫的源程序,都需要進(jìn)行編譯、連接,才能生成可執(zhí)行程序。編譯時花費(fèi)時間但程序的執(zhí)行效率提高。82.3高級程序設(shè)計語言的基本特征
高級程序設(shè)計語言從20世紀(jì)50年代以來己有一千多種,隨著軟件技術(shù)的發(fā)展不斷地出現(xiàn)新版本,每一個新版本都增加新的機(jī)制。下面介紹程序設(shè)計語言最基本的特征。2.3.1變量、表達(dá)式、賦值用高級語言編程是為了對數(shù)據(jù)實施計算,將輸入的數(shù)據(jù)經(jīng)過表達(dá)式的計算得到輸出數(shù)據(jù)。參與計算的數(shù)據(jù)、結(jié)果在編程時是不存在的。只能用變量表示它。如己知三角形三邊長度求而積:s:=0.5*(a+b+c);area:=sqrt(s*(s-a)*(s-b)*(s-c));其中a,b,c,s,area是變量,0.5是常量,“+”和“*”是運(yùn)算符,sqrt是平方根函數(shù),它們構(gòu)成了表達(dá)式。“:=”是賦值號。表達(dá)式是常量、變量、函數(shù)調(diào)用或者由它們和運(yùn)算符組成的序列。表達(dá)式中的變量都是有值的.賦值號左端的變量在寫程序時可以沒值,即使有值,計算執(zhí)行之后也會被賦成新值。用變量寫程序的好處是通用,以上語句不僅可以算出三邊長為3、4、5的三角形面積,任何三角形面積都可以算出(只要輸入a、b、c的正確值即可)。一個計算只要有了明確的數(shù)學(xué)表達(dá)式(也就是該計算的數(shù)學(xué)模型)編程是比較容易的.程序中的一條語句對應(yīng)著計算機(jī)的一條命令(用一條或多條指令來實現(xiàn))。一個賦值語句就是一條賦值命令。92.3.2程序的控制結(jié)構(gòu)程序約定自上向下、自左向右地執(zhí)行,即順序地執(zhí)行語句(或表達(dá)式)。但不僅限于此,計算機(jī)之所以能自動計算,它能通過判斷將程序轉(zhuǎn)到應(yīng)該執(zhí)行的地方。人們就是通過巧妙地安排控制轉(zhuǎn)移,使計算機(jī)實施算法。1.最基本的程序控制語句無條件轉(zhuǎn)移語句:在匯編語言時代就有了Jump指令使執(zhí)行跳轉(zhuǎn),對應(yīng)的高級語言語句是無條件轉(zhuǎn)移語句:gotoloop;其中l(wèi)oop是跳轉(zhuǎn)到的語句的標(biāo)號(數(shù)字或標(biāo)識符)。條件轉(zhuǎn)移語句:加上條件判斷子句if(E)就是條件轉(zhuǎn)移語句:If(E)gotoloop;其中E是條件(布爾)表達(dá)式,求值結(jié)果是‘真’、‘假’值。如果為‘真’轉(zhuǎn)移到標(biāo)號為l的語句,為‘假’則按順序執(zhí)行下一條語句。有了這兩個語句再加上簡單語句(賦值、調(diào)用、輸入/出),就可以實現(xiàn)程序的任何執(zhí)行控制。102.結(jié)構(gòu)化程序的控制結(jié)構(gòu)
goto語句相互交織使設(shè)計出的程序控制結(jié)構(gòu)成為不可分解的一個整體。盡管算法設(shè)計精巧,但牽一發(fā)而動全身。程序一大,修改很困難。顯式使用goto
語句使得任何寫錯轉(zhuǎn)移語句標(biāo)號的小錯誤都會導(dǎo)致滅項之災(zāi)。使程序控制邏輯是結(jié)構(gòu)化的,顯式使用goto
語句,程序依然難于閱讀。早期的編程語言是語句級的.用簡單準(zhǔn)語句集合加goto構(gòu)成復(fù)雜的程序控制。然而顯式地使用goto語句是極其危險的。這是因為:三種結(jié)構(gòu)化的基本控制結(jié)構(gòu)11出了錯易于找出錯誤并修改易閱讀導(dǎo)致易擴(kuò)充、修改,大程序易于分析。程序控制結(jié)構(gòu)清晰,是它用關(guān)鍵字控制程序塊(語句組)。任何控制轉(zhuǎn)移不能進(jìn)入這些控制塊,除非入口。塊中轉(zhuǎn)出也不能直接轉(zhuǎn)到程序其他處,只能轉(zhuǎn)到出口。在出/入口增加檢查語句就使得程序錯誤真正局部化。程序塊級(語句組)控制采用語句括號使程序邏輯與表示法結(jié)構(gòu)完全一致。可直接編程。程序語言結(jié)構(gòu)化以后,編程對流程圖的依賴就很少了。Nassi-Schneldermann提出了結(jié)構(gòu)化流程圖(主要取消流線及箭頭),因沒有直接用類似結(jié)構(gòu)化編程語言的偽代碼方便而沒有流行起來。結(jié)構(gòu)化控制結(jié)構(gòu)的優(yōu)點:12無假塊條件分支和嵌套if語句
if(E)thenSTendif
if(E1)thenS1elseifE2thenS2…elseSm
endif
無假塊條件語句是正規(guī)條件語句的簡化,很常用。嵌套語句在否定部分用關(guān)鍵字elseif,有的語言用elsif。只有當(dāng)所有條件均有‘假’時才執(zhí)行else塊。逐個檢查m個條件效率很低,有時似無必要。3.結(jié)構(gòu)化編程語言的其他控制結(jié)構(gòu)結(jié)構(gòu)化程序只需三種基本結(jié)構(gòu)重復(fù)和嵌套。但為了方便編程,第三代語言派生出許多結(jié)構(gòu)。以下簡略說明。(1)條件分支13case語句也叫分情形語句。根據(jù)條件變量Z的值單獨(dú)執(zhí)行S1,S2…,Sn,執(zhí)行完Si自動跳到endcase(C語言例外,它要加上break才跳。否則執(zhí)行Si+1到Sn)。case語句流程圖14(2)循環(huán)結(jié)構(gòu)do-until和for結(jié)構(gòu)
do-until語句形式是doSuntilE,先執(zhí)行再判斷,若E為‘真’不再循環(huán)。正好和先判斷再執(zhí)行的do-while語句是相反的。將它改成do-while結(jié)構(gòu)十分容易。條件取反,先執(zhí)行一次S塊。do-until流程圖15for-do語句以控制變量增減值或枚舉集合值計數(shù)的循環(huán)。for-do是do-while的另一種變體結(jié)構(gòu),其書寫格式有多種變體。
for-do流程圖16(3)順序控制gotoloop 多數(shù)語言作為歷史遺留保留,不提倡使用,Java取消了該語句。break C/C++中用于跳出塊到endcase(switch)。continue 僅用于循環(huán),立即結(jié)束本次循環(huán),作下次循環(huán)。exit 立即跳到末端出口。abort(STOP)強(qiáng)行停止本程序。delayXX 延遲XX時間后繼續(xù)執(zhí)行。raise-exception 引發(fā)異常,處理異常。執(zhí)行了raise后跳到exception指明的異常處理段執(zhí)行,處理后不再返回。在Java、C++中是try-catch-finally語句,把可能出現(xiàn)異常的代碼放入try塊(它包含catch、finally兩種塊),通過throw引發(fā),catch捕捉后處理,finally為可選的善后處理。通常把一切影響正常順序執(zhí)行的,如調(diào)用/返回、前跳、延遲、異常、控制語句都?xì)w為順序控制。常見的有以下語句:172.3.3 數(shù)據(jù)類型計算機(jī)中計算對象(不管是常量、變量)都是有類型的,不能把一個實數(shù)和邏輯‘真’值(true)相加。指出數(shù)據(jù)類型的一個目的就是要避免這類錯誤的發(fā)生。各語言轉(zhuǎn)換函數(shù)(inttoreal或realtoint)不盡相同,有的是把類型名作為轉(zhuǎn)換函數(shù)名,不兼容的類型,如整數(shù)和布爾一般不能轉(zhuǎn)換,但C語言例外。18常用的基本類型int/integer 整型對應(yīng)為數(shù)學(xué)中整數(shù)real/float/double 實型(浮點類型)對應(yīng)為數(shù)學(xué)中實數(shù)logical/Boolean 布爾型(邏輯型)只有‘真’、‘假’值char/character 字符型ASCII碼的所有可見字符string 字符串類型enum 枚舉類型,用戶預(yù)定義的一串標(biāo)識符最常見的最基本的數(shù)據(jù)類型就是純量類型,程序設(shè)計語言提供了下面幾種基本數(shù)據(jù)類型:floatx,y; //x,y是單精度浮點數(shù)intiCount,doubledbPert//整型和雙精浮點conststringsPASSWORD=”Espresso”//串常量boolfFinished//布爾型變量CommandButtona //對象變量variantmyVar //變體變量符號常量、變量則要先聲明類型才能使用。例如VC中可以這樣聲明:19數(shù)組類型
數(shù)組的特征是所有元素均為同一類型。charstr[15];
聲明了16個元素的數(shù)組,每個元素都是字符串類型。因為隱含數(shù)組每一元素從0下標(biāo)開始,聲明時只要指出下標(biāo)值的上界。如果每一元素又是一數(shù)組那么就可以得到如矩陣一樣的二維數(shù)組:doubleMatrix[9][9];是10*10=100元素的方陣,元素類型為雙精度浮點數(shù)。第一下標(biāo)是行,第二下標(biāo)是列。使用時只能一個元素接著一個元素去賦值。Matrix(2,3)=30.23//第3行第4列元素賦以30.23變量代表單個數(shù)據(jù)值叫純量變量。如果代表多個(數(shù)組)或多種(記錄)值就叫它結(jié)構(gòu)型數(shù)據(jù)的變量。先來說數(shù)組:20記錄類型
structperson{ charname[15];intage; charsex[8]; chartelnumber[15]; charlable[9];}student[99];相同或不同類型數(shù)據(jù)組成的結(jié)構(gòu)叫記錄.記錄型記錄了對象的屬性信息,記錄的各個組成部分,稱為記錄域,各個域的數(shù)據(jù)類型可以不相同。下面給出用VC聲明的一個例子:21指針類型指針類型是一種很重要的數(shù)據(jù)類型,但同時也是一種簡單卻不大好理解的數(shù)據(jù)類型。在講述指針之前,首先來看一個例子(采用C語言來描述):
int i; //定義一個整型變量I i=1; //i賦值為1 i=i+1; //表達(dá)式計算 計算機(jī)語言中的變量代表的只是計算機(jī)內(nèi)存中的一個存儲單元。這個單元中存放的內(nèi)容是變化的,所以把它叫做變量。
每個變量都有一個名字(標(biāo)識符),對應(yīng)為存儲單元的地址,存儲單元的內(nèi)容為變量的值。引用變量的值時直接把變量名放到用值的地方(賦值語句的兩邊)。程序運(yùn)行時按地址存取內(nèi)容。如果某個變量的值是內(nèi)存中的地址.這個變量叫指針變量。指針變量示意圖22C語言中指針類型,以類型指明符‘*’表示。它所指向的對象是有類型的。
inti,*p;//聲明i為整型,P為整型對象的指針charc,*pCh;//聲明c為字符型,pCh
為指向字符里對象指針
‘*’放在變量標(biāo)識符之前,出現(xiàn)在類型標(biāo)識符之后,指明它所修飾的標(biāo)識符是指向該類型對象的指針.p是指向整型的指針,*p是p所指向的無名變量的代名詞.聲明完成后變量p有存儲單元但無內(nèi)容.
C語言中指針類型232.3.4過程及數(shù)據(jù)傳遞函數(shù)sin的自變量(參數(shù))為x,并指出其函數(shù)(返回)值是Double類型.每當(dāng)程序中出現(xiàn)求正弦時,直接調(diào)用該過程,稱函數(shù)引用,即引用該函數(shù)的(返回)值。一個主程序中寫三段相似代碼的執(zhí)行情況是一樣的,只是省寫了兩次,多了三次實參和形參匹配(置換)的執(zhí)行過程。求正弦值的程序被分離開來,可以被多次調(diào)用,這種分離出來的部分叫子例程(routine),執(zhí)行完后依然返回原處。帶返回值的叫函數(shù)過程,不帶返回值的叫子例程過程.簡稱子程序。在C語言中統(tǒng)稱為函數(shù)。使用過程可以降低程序復(fù)雜性、提高編程效率、使程序結(jié)構(gòu)變得消晰明了。過程(函數(shù))24函數(shù)的語法形式類型標(biāo)識符函數(shù)名(形式參數(shù)表)形式參數(shù)說明{說明部分語句}函數(shù)的返回值通過return語句返回。返回值的類型為定義的函數(shù)類型,若return語句中表達(dá)式類型與函數(shù)類型不一致,則轉(zhuǎn)換為函數(shù)類型。無返回值的函數(shù),定義為void類型。若無參數(shù),寫void是被初始化的內(nèi)部變量,壽命和可見性僅限于函數(shù)內(nèi)部若不說明類型,一律自動按整型處理,若為void即為無返回C語言函數(shù)的定義及調(diào)用25函數(shù)有兩類庫函數(shù)I/O,分類,轉(zhuǎn)換,診斷,目標(biāo)控制,圖形,接口,進(jìn)程控制,處理,數(shù)學(xué),文本窗口,內(nèi)存,雜務(wù),時間和日期用戶自定義函數(shù)從使用角度C語言中函數(shù)的作用,就與其它程序中的子程序一樣,以模塊的形式出現(xiàn),而且允許一個函數(shù)被多次調(diào)用,但不允許自己調(diào)函數(shù)自己本身。26函數(shù)有兩類函數(shù)形式角度有參函數(shù),定義:類型標(biāo)識符,函數(shù)名(形式參數(shù)分配表列)形參說明{說明部分語句 }無參函數(shù),定義:類型標(biāo)識符,函數(shù)名(){說明部分語句}27函數(shù)的調(diào)用調(diào)用前先說明函數(shù)原型:在調(diào)用函數(shù)的說明部分按如下形式說明:類型標(biāo)識符被調(diào)用函數(shù)名(含類型說明的形參表)調(diào)用形式函數(shù)名(實參)嵌套調(diào)用C語言不允許嵌套定義,但可以嵌套調(diào)用遞歸調(diào)用函數(shù)直接或間接調(diào)用自身計算機(jī)軟件技術(shù)基礎(chǔ)28/**例***函數(shù)的定義和調(diào)用,兩數(shù)相加**************/main(){floatadd(floatx,floaty);floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}29/****例*******庫函數(shù)的調(diào)用***********************//*Thisprogramusesthetextwindowsfunctionsto*//*demonstratetheuseofthelibraryfunction*/#include"stdio.h"#include<stdlib.h>#include<conio.h>#include<graph.h>main(){inti,j;charbuffer[80];_clearscreen(_GCLEARSCREEN);_setvideomode(_TEXTC80);
clearthescreensetthedisplayascolorandtextmodel30while(!kbhit()){for(i=0;i<=15;i++){_settextcolor(i);for(j=48;j<=90;j++){/*sprintfisafunctionwhichtransfertheascii*//*value(j)tocharformatandthenstoreintothe*//*arraynamedasbufferinthisprogram*/sprintf(buffer,"%c",j);_outtext(buffer);}}}}16kindsoftextcolorshowtheasciivaluefrom48to90,i.e.form0~9,:;<=>?@,A~Z31/***例***函數(shù)返回值為定義的函數(shù)類型,*//*由于已定義為int型,輸入實數(shù)就出錯**/main(){inta,b,c,d;floate;printf("Pleaseinputthreedatas\n");scanf("%d,%d,%d",&a,&b,&c);d=max(a,max(b,c));e=max(a,max(b,c));printf("Thelargestdatainputedis%d\n",d);printf("Thelargestdatainputedis%f\n",e);}max(x,y)intx,y;{intz;z=x>y?x:y;return(z);}322.3.5變量的生命期和Static變量
程序中變量生命期隨其聲明所在程序塊而異。程序一執(zhí)行完它的所有數(shù)據(jù)變量均失去意義,它所在的存儲區(qū)則可另行分配其他程序裝入執(zhí)行。因此,主程序中變量的生命期比過程中變量生命期要長,內(nèi)嵌的子過程其變量生命期更短,最長的是文件變量,它放入磁盤,程序沒有了它依然存在,所以按“生命期”的長短有:持久變量 除非人為銷毀全局變量 出了程序便失去定義靜態(tài)局部變量 見下文自動變量(局部變量) 出了所在塊便失去定義循環(huán)控制變量 出了循環(huán)便失去定義常常有一種需要,一個局部變量在它所在的局部程序塊消失后依然保留其值,又不希望它是全局變量被該局部塊以外的程序引用。例如偽隨機(jī)數(shù)發(fā)生器,為使偽隨機(jī)數(shù)每次調(diào)用新值,則上次數(shù)是生成下次數(shù)的種子,如不希望其他操作影響這個發(fā)生器,此時用Static(靜態(tài))變量更方便。332.3.6 輸入/輸出
程序的輸入/輸出分作兩大類:一類是程序之間以文件形式進(jìn)行數(shù)據(jù)傳遞;另一類是人一機(jī)交互,把人們可識別的形式(字符串、數(shù))按一定格式輸入到程序變量中。輸出則相反,按用戶要求的格式顯示或打印。這一般由高級程序設(shè)計語言以過程調(diào)用(標(biāo)準(zhǔn)過程)的形式實現(xiàn)。過程在高級語言內(nèi)部通過調(diào)用操作系統(tǒng)的系統(tǒng)調(diào)用完成。Scanf(“%d%d%d,&n1,&n2,&n3)/*%d表示讀入一個十進(jìn)制整數(shù),&n1表示讀到n1的存儲單元中。*/Printf(“DF,CF=%12.7%12.7f\n”,df,cf)輸出:DF,CF=__35.2272410___0.0000000C語言的輸出語句功能很強(qiáng)且具有計算功能;輸出變量處直接寫表達(dá)式,可以輸出其結(jié)果值。例如:Printf(“DF,CF=%12.7f%12.7f\n”,a+b*df,3.0/7.0)C語言把格式合并到輸入(scanf)和輸出(printf)函數(shù)中,這組函數(shù)在終端上功能很強(qiáng),一般形式是輸入/出一個串,串中特殊符號“%”批示格式,出現(xiàn)幾次“%”串后跟幾個待輸入/出的變元。例如:342.4面向?qū)ο蟪绦蛟O(shè)計語言的基本特征面向?qū)ο笳Z言是過程語言的進(jìn)一步發(fā)展,面向?qū)ο蟪绦蛟O(shè)計(90年代-現(xiàn)在)(ObjectOrientedProgramming—OOP)模塊:(對象)類---屬性(數(shù)據(jù))和方法(操作或功能)組成代表語言:Smalltalk,C++,Java程序設(shè)計范式=對象+消息人眼睛,鼻子..,直立行走…吃飯、走路、笑、工作…汽車發(fā)動機(jī),輪子…陸地行進(jìn)、變速、變向…2.4.1面向?qū)ο蟪绦蛟O(shè)計概述
351、面向?qū)ο蠛兔嫦蜻^程程序設(shè)計面向過程程序設(shè)計:功能抽象(核心)、自頂向下設(shè)計、逐步求精(基本思想)面向?qū)ο蟪绦蛟O(shè)計:對象的抽象(類)和封裝(核心)、類的認(rèn)定和設(shè)計以及建立在類上的類組織關(guān)系。362、面向過程程序設(shè)計舉例學(xué)生注冊管理系統(tǒng)的設(shè)計過程對當(dāng)前系統(tǒng)進(jìn)行任務(wù)設(shè)計(模塊化)任務(wù)分解(子任務(wù)模塊化)子任務(wù)在分解,…….,一直到原子任務(wù)算法實現(xiàn)原子任務(wù)。373、面向?qū)ο蟪绦蛟O(shè)計舉例學(xué)生注冊管理系統(tǒng)的設(shè)計過程學(xué)生類的認(rèn)定(學(xué)生信息屬性、學(xué)生信息的操作)學(xué)生類的設(shè)計(數(shù)據(jù)成員、函數(shù)成員)應(yīng)用程序的實現(xiàn)classstudent{
private:charname[20];intage;boolsex;………
public:search();edit();insert();del();save();……};voidmain(){studentsts[87];sts[0].edit();…}38類與抽象數(shù)據(jù)類型(封裝和接口)C/S模式和消息傳遞繼承多態(tài)(重載和虛函數(shù))模板(*)C++的異常處理(*)組件技術(shù)(*)4、面向?qū)ο蟪绦蛟O(shè)計基本概念392.4.2類與抽象數(shù)據(jù)類型暴露接口、隱藏實現(xiàn)細(xì)節(jié)用戶沒有必要知道實現(xiàn)細(xì)節(jié)開發(fā)者需要修正開發(fā)過程中留下的bug,以及升級的需要C++中使用關(guān)鍵字private對信息進(jìn)行隱藏,public公開類的接口信息隱藏封裝(encapsulation)就是把每個對象的數(shù)據(jù)(屬性)和操作(行為)包裝在一個類中,并盡可能隱藏對象的內(nèi)部細(xì)節(jié)。一般限制直接訪問對象的屬性,而應(yīng)通過操作接口訪問,這樣使程序中模塊之間關(guān)系更簡單、數(shù)據(jù)更安全。對程序的修改也僅限于類的內(nèi)部,使得由于修改程序所帶來的影響局部化。40類的組成=數(shù)據(jù)成員(屬性)+函數(shù)成員(方法)將數(shù)據(jù)成員和函數(shù)成員結(jié)合成一個有機(jī)整體的過程,就是封裝封裝的有機(jī)整體就是抽象數(shù)據(jù)類型,C++中稱之為類面向?qū)ο蟮姆椒ㄟM(jìn)行分析設(shè)計時首先需要確定抽象數(shù)據(jù)類型,也就是類的認(rèn)定。換一個角度,抽象數(shù)據(jù)類型也是面向?qū)ο蠓椒ㄖ袑κ挛锏囊粋€抽象概括,如上面的classStudent,該類就是對學(xué)生信息的一個概括。類的具體實例稱為對象,對象是對抽象數(shù)據(jù)類型的一個具體化,如studentzhangsan;可以生成一個具體的學(xué)生對象zhangsan.[注]在面向?qū)ο蟪绦蛟O(shè)計中,int類型也可以被看成抽象數(shù)據(jù)類型。inta;就說明了一個整型對象a.41封裝和面向?qū)ο蟪绦?22.4.3C/S模式與消息使用面向?qū)ο蠓绞皆O(shè)計和實現(xiàn)的程序具有與眾不同的編程模式。在面向?qū)ο蟪绦蛑?,類和對象表現(xiàn)為服務(wù)器,使用類和對象的模塊(如C++中的函數(shù))表現(xiàn)為客戶,客戶通過特殊的方式請求服務(wù),這個方式就是消息(消息可以包含參數(shù))。客戶/服務(wù)器模式消息(message)相當(dāng)于過程語言的過程調(diào)用,可帶實在參數(shù):方法(method)則相當(dāng)于過程定義,帶參數(shù)也是形式參數(shù),一定要有方法體(執(zhí)行語句集).面向?qū)ο笾兄挥邢⒁环椒ǎ瑳]有過程調(diào)用一過程體的說法。舉例:zhangsan.insert(s);可以把zhangsan這個對象的信息添加到一個對象數(shù)組中。432.4.4繼承性繼承性:是自動地共享類、子類和對象中的方法和數(shù)據(jù)的機(jī)制,它是面向?qū)ο蠹夹g(shù)所獨(dú)有的。繼承性支持代碼重用。繼承的傳遞性:如果C1繼承C2,C2繼承C3,則C1(間接)繼承C3。多重繼承:一個子類具有多個超類時,它可以繼承它們的結(jié)構(gòu)和方法。舉例:classPerson{charIDcard[18];charname[20];………..};classStudent:publicPerson{charstudentcode[8];chardeparment[15];……………};Student類繼承了Person類的屬性和方法。44類繼承的實例:假設(shè)某公司的雇員分為兩類:計時雇員和月薪雇員,而他們的工資計算方式是不同的。比如月薪員工有醫(yī)療保險而計時員工卻沒有。月薪員工又分為兩類:專業(yè)人員和項目經(jīng)理。類似地,他們的工資計算方式也是不同的。比如項目經(jīng)理可以有項目提成而專業(yè)人員則沒有。顯然,首先要定義一個雇員類,它記錄了所有雇員都擁有的屬性和方法。然后再定義一個計時雇員類,它繼承了雇員類的屬性和方法,并有自己專有的屬性和方法,同樣,月薪員工繼承了雇員類的屬性和方法并有自己的專有特性。當(dāng)然,根據(jù)需要,可以再定義兩個類:專業(yè)人員類和項目經(jīng)理類,它們都是月薪員工類的子類。經(jīng)過分析,可得到圖所示的類繼承圖.雇員信息繼承關(guān)系45每個類的屬性和方法如下:462.4.5多態(tài)性多態(tài)性:(polymorphism)是指允許不同類的對象對同一消息作出的響應(yīng)不相同。即允許把同一消息發(fā)送給超類及其子類不同對象的能力。一般類中定義的屬性或行為,被特殊類繼承后,可以具有不同的數(shù)據(jù)類型或者是表現(xiàn)出不同的行為。這使得同一個屬性或行為在一般類及其各個特殊類中具有不同的語義多態(tài)性作用:允許超類及各子類的對象各自以不同的方法響應(yīng)同一消息,即所謂的“同一接口,多種方法”。在實際使用的時候有2種方式:編譯時的多態(tài)性——靜態(tài)連編:編譯時就將對象和方法的代碼連接起來,其優(yōu)點是執(zhí)行速度快,所需內(nèi)存小,缺點是靈活性差;運(yùn)行時的多態(tài)性——動態(tài)連編:運(yùn)行時才按照具體的數(shù)據(jù)類型和參量數(shù)來確定將哪個方法同對象連接起來,其優(yōu)點是具有相當(dāng)大的靈活性,有利于建立類庫,便于重用和擴(kuò)充。47多態(tài)性舉例
voidEmployee::Print_List(){ Employee*Scan; for(Scan=Link;Scan!=NULL;Scan=Scan->Link) Print_Empl();};voidManager::Print_List(){ cout<<”\n\nManager:\n”;//打印經(jīng)理題頭
Print_Empl();//打印經(jīng)理記錄數(shù)據(jù)
cout<<”\nEmployeeSupervised:\n”; Employee::Print_List();//打印所轄雇員表};注意到上述類中有許多方法是同名的,但是,由于它們所屬類不同,編譯器不會弄混。例如Print_List方法:這時p一>Print_List()就是多態(tài)的,有時是父類Employee實例的數(shù)據(jù),有時是子類Manager實例數(shù)據(jù),因為面向?qū)ο笤试S子類實例就是父類實例。*p所代表的既可以是雇員也可以是經(jīng)理,這種多態(tài)性的好處是不因雇員經(jīng)理數(shù)量多少而更改程序.48總之:通過使用面向?qū)ο蟪绦蛟O(shè)計的抽象、封裝、繼承和多態(tài)性等機(jī)制,程序更易于維護(hù)、更新和升級。利用代碼可重用性,程序員可以在程序中大量使用成熟的類庫,從而縮短程序的開發(fā)時間,提高程序員的工作效率和程序的可靠性。492.5網(wǎng)絡(luò)計算機(jī)時代的編程語言網(wǎng)絡(luò)時代的軟件部署:面向?qū)ο笳Z言和技術(shù)是分布式客戶/服務(wù)器計算時代的產(chǎn)物??蛻粽军c即客戶對象,服務(wù)器站點就是服務(wù)器對象,它們相互發(fā)消息,共同協(xié)作完成應(yīng)用。它們可以建立在局域網(wǎng)、廣域網(wǎng)上,把每個對象安裝到各個站點上。網(wǎng)絡(luò)時代的軟件開發(fā):分布式客戶/服務(wù)器計算時代,服務(wù)器提供的程序往往是事先編好了的.客戶端只要編一些“使用”服務(wù)器提供的“服務(wù)”(程序運(yùn)行后的結(jié)果)的簡單對象(程序),就完成了應(yīng)用開發(fā)。只有不存在這種服務(wù)時才去開發(fā)服務(wù)器端的程序。再者,開發(fā)客戶端和服務(wù)器端程序也不是像單主機(jī)計算時代那樣,基本上是從第一句寫到最后一句,而是在系統(tǒng)提供的控件、構(gòu)件(系統(tǒng)類)的基礎(chǔ)上,選定參數(shù)生成實例對象。網(wǎng)絡(luò)時代的軟件應(yīng)用:Internet把全世界計算資源聯(lián)接起來,世界上有無數(shù)資源,如何找到它是關(guān)鍵問題。找到之后,只需訂閱(租賃),到時候發(fā)消息,它回復(fù)你計算結(jié)果。這如同打電話付費(fèi)一樣?!败浖褪欠?wù)”,可以想象,應(yīng)用程序使用發(fā)生了重大變化。網(wǎng)絡(luò)時代軟件開發(fā)專業(yè)的分工:軟件開發(fā)多限于應(yīng)用服務(wù)提供商(ASP),他們可以做得十分完關(guān)。在自己選定的業(yè)務(wù)范田內(nèi),把功能件做成標(biāo)準(zhǔn)的構(gòu)件.并由他們自己升級維護(hù):使用者只要有一個連接各種服務(wù)的小程序,開發(fā)者的工作重心是問題分析、建立計算模型、建立計算框架、連接上選定的構(gòu)件(填滿框架)。網(wǎng)絡(luò)計算:簡介502.5.1HTML和XML
HTML:網(wǎng)絡(luò)計算在網(wǎng)站之間傳遞的是主頁。主頁按http協(xié)議傳遞,頁面格式是HTML(超文本標(biāo)記語言)。每個站點上都有瀏覽器可以識別以約定標(biāo)簽標(biāo)記過的正文,標(biāo)簽成對形如:<tag>正文</tag>,標(biāo)簽層層嵌套,如一本書先章、節(jié)、段落后復(fù)合語句、簡單語句。經(jīng)過標(biāo)記之后一段正文信息就成為結(jié)構(gòu)化數(shù)據(jù)。傳到另一站點后,瀏覽器讀出這段正文,就原封不動地轉(zhuǎn)移了,即使是圖文并茂的多媒體文檔也照傳無誤。XML:但HTML約定的60多個標(biāo)簽表達(dá)能力有限。它只知道傳遞的內(nèi)容是符號串和二進(jìn)制塊。于是,人們發(fā)展了可以由用戶定義標(biāo)簽的XML可擴(kuò)展的置標(biāo)語言)語言,從而可描述頁面的數(shù)據(jù)內(nèi)容。頁面格式由XSL或CSS子語言描述.XML可描述數(shù)據(jù)關(guān)系比較復(fù)雜的數(shù)據(jù)結(jié)構(gòu),如圖、表、樹、索引文件和數(shù)據(jù)庫中定義的數(shù)據(jù)關(guān)系。在數(shù)據(jù)庫服務(wù)器站點上根據(jù)不同客戶要求,從庫中取出數(shù)據(jù)放入XML文檔,傳送到不同站點的客戶機(jī)上,各站點上的客戶就可以按標(biāo)簽理解并使用它們。腳本語言:盡管HTML和XML在當(dāng)今萬維網(wǎng)上傳送信息(寫主頁)是不可或缺的工具,但它們不是傳統(tǒng)意義上的編程語言.它們只能描述、傳遞數(shù)據(jù),不能表達(dá)對這些數(shù)據(jù)的操作.也就是客戶接到數(shù)據(jù)庫中的數(shù)據(jù)后還要自己編寫程序完成數(shù)據(jù)處理。為此,發(fā)展了各種腳本語言,腳本語言隨同Web頁面一起傳送到另一站點,該站點的瀏覽器叮以立即執(zhí)行。512.5.2腳本語言有常規(guī)的基本類型和算術(shù)邏輯運(yùn)算,有弱化的可變類型;有變量、表達(dá)式、賦值語句;有if--then_else和迭代控制(do_while、for_do);有函數(shù)和過程調(diào)用機(jī)制;有封裝和可見性控制(public、private):與可視界面、鍵盤、鼠標(biāo)聯(lián)系緊密。借助可視界面工具編程。而可視界面本身是用面向?qū)ο髮崿F(xiàn)的。例如,窗體就是類,在其中定義屬性(全局變量)和方法或事件,運(yùn)行時給出值就是實例對象。支持事件驅(qū)動,用戶或其他對象可隨機(jī)驅(qū)動;一般都有到大語言的接口:有限定的背景(應(yīng)用領(lǐng)域)。例如,支持一般小型Windows應(yīng)用程序,如VB(VBScript):支持?jǐn)?shù)據(jù)庫應(yīng)用.如Delphi、PowerBuilder:支持網(wǎng)絡(luò)客戶端應(yīng)用的,如JavaScript;支持打印控制的,如PostScript、PCL。腳本語言(ScriptLanguage)是小型的編程語言.它是依附于某一特定環(huán)境下的編程語言,它們的特點是:腳本語言的語法特征小巧而簡單多采用解釋執(zhí)行源代碼?;趯ο蠖皇敲嫦?qū)ο螅ㄖ挥姓Z言內(nèi)定義的簡單繼承,沒有用戶定義的繼承,甚至沒有顯式的類機(jī)制)。522.5.3網(wǎng)絡(luò)編程語言為了在網(wǎng)絡(luò)各結(jié)點上共同完成協(xié)作計算,為了程序能隨主頁到處傳送,迫切需要一個全新的與平臺無關(guān)的編程語育。因為已有的編程語言和本機(jī)操作系統(tǒng)聯(lián)系太深,編譯后的目標(biāo)碼就是所在機(jī)器的目標(biāo)碼,特別是編譯后優(yōu)化代碼完全要取決于目標(biāo)碼指令系統(tǒng)不同的機(jī)器。同一源代碼程序在兩個機(jī)器上生成的目標(biāo)碼程序不同早有定論。1996年由Sun公司研制的Java可以做到平臺無關(guān).以下結(jié)合Java語言介紹網(wǎng)絡(luò)編程語言的特點。Java稱為純面向?qū)ο笳Z言,它在C++成功的基礎(chǔ)上,進(jìn)行了創(chuàng)新改進(jìn),采取“改造”C++的策略,基本是C++哪里不合適就改哪里.53Java虛擬機(jī)(JVM)的建立.所謂虛擬機(jī)就是不管你操作系統(tǒng)的平臺是什么,建立一個解釋Java代碼的執(zhí)行系統(tǒng)(RuntimeSystem),正確地執(zhí)行。本機(jī)操作系統(tǒng)是實在地機(jī)器執(zhí)行系統(tǒng).是實現(xiàn)虛擬機(jī)的手段。每臺機(jī)器若都能實現(xiàn)虛擬機(jī)的功能,則Java的平臺無關(guān)性就得到第一層的保證。第二層,執(zhí)行的代碼必須統(tǒng)一。Java源代碼是統(tǒng)一的,但編程可執(zhí)行代碼就不一定了。如不同類型字長不統(tǒng)一,有的整型數(shù)32位,有的64、128位。再如復(fù)合操作碼本可簡化操作.但不同系統(tǒng)復(fù)合習(xí)慣不同,帶來微小差別……所以,Java采用泛代碼(Unicode)的中間碼技術(shù)。泛代碼也叫字節(jié)碼(bytecode),操作碼和最小字長都是16位的雙字節(jié)。這樣,Java源代碼變?yōu)樗刑摂M機(jī)都可執(zhí)行的中間碼,保證大家對Java源程序理解一樣,執(zhí)行結(jié)構(gòu)一樣。其示意圖如下所示。平臺無關(guān)54JVM上執(zhí)行Java程序的過程
55編譯----解釋執(zhí)行Java代碼是解釋執(zhí)行的,這是指它的中間代碼。從Java源代碼要經(jīng)過編譯器Javac翻譯,這不妨礙源程序在類庫支持下派生類,因為類支持也是中間碼。Java虛擬機(jī)首先要裝入類,檢查代碼(安全)后解釋執(zhí)行。為了提高解釋效率,發(fā)展了即時編譯技術(shù)(Just-in-time)。即對于多次重復(fù)或耗時較長的段落編譯后,作為模塊暫存,下次遇到則直接執(zhí)行目標(biāo)碼。即時編譯技術(shù)目前還在向智能化方向發(fā)展。更為純粹的面向?qū)ο笳Z言Java無全程變量,無主函數(shù)main(),從而函數(shù)全改方法。類中的方法均缺省為‘虛’函數(shù),更加支持動態(tài)加載。取消C++中的模板而用動態(tài)的實例類型化Object類。為了封裝更干凈,取消了C++的頭文件和C的預(yù)處理。一個或多個功能相關(guān)的類組成為包(package,即名字空間),從而為構(gòu)件規(guī)范化提供了基礎(chǔ)。支持多線程多線程即共享資源的并行執(zhí)行的‘子進(jìn)程’??梢蕴岣邎D形用戶界面的交互性能。C++中多線程是由程序員控制鎖來完成的。Java的Java.lang包提供Thread類大為簡化了多線程就用程序的開發(fā)。線程概念后面介紹。56方法型構(gòu)(接口)和方法體可以顯式分開在C++中己經(jīng)實現(xiàn),方便了編程和修改。只要接口(及其所帶參數(shù))不變,方法體可隨意修改而不影響該方法的程序。然而,把接口作為類型有其更深遠(yuǎn)的意義。接口類是一組方法型構(gòu)而無方法體,除有常量外沒有屬性。接口類和普通類一樣可以嵌套和繼承,且可以多繼承,可以聲明接口實例。接口類由普通類實現(xiàn)(寫出各方法的體)。比C++的強(qiáng)類型更強(qiáng),要求顯示方法聲明,編譯器可以發(fā)現(xiàn)錯誤消息。取消了指針,杜絕了內(nèi)存的非法訪問。增設(shè)自動無用單元回收集,減少內(nèi)存分配帶來的問題。特
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 員工安全生產(chǎn)合同范例
- 賓館裝潢合同范例
- 開模具合同模板寫好
- 工地施工勞務(wù)合同范例
- 賓館裝修安全合同范例
- 工裝產(chǎn)品購銷合同模板
- 場地辦公租賃合同范例
- 家具制造勞務(wù)合同范例
- 賣方居間方合同模板
- 全域整治合同范例
- 2019蘇版GT14-2019馬鞍板圖集
- 2024年國藥集團(tuán)招聘筆試參考題庫含答案解析
- 成本效益分析匯報
- 委托購買設(shè)備協(xié)議書
- 大學(xué)音樂表演職業(yè)生涯規(guī)劃書
- 硫酸脲氨化造粒復(fù)合肥料的生產(chǎn)技術(shù)
- 圖像學(xué)完整分
- 神奇的數(shù)學(xué):牛津教授給青少年的講座
- 醫(yī)院消防安全培訓(xùn)記錄
- 2022-2023年初級經(jīng)濟(jì)師之初級經(jīng)濟(jì)師人力資源管理真題附答案
- 危險化學(xué)品裝卸作業(yè)安全技術(shù)操作規(guī)程
評論
0/150
提交評論