《Pascal語言基礎(chǔ)》PPT課件.ppt
《《Pascal語言基礎(chǔ)》PPT課件.ppt》由會員分享,可在線閱讀,更多相關(guān)《《Pascal語言基礎(chǔ)》PPT課件.ppt(87頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、第2章 Pascal語言基礎(chǔ),Pascal語言體現(xiàn)了結(jié)構(gòu)化程序設(shè)計的概念。它簡便易學(xué),具有清晰明了的模塊結(jié)構(gòu),豐富的數(shù)據(jù)類型和語句。Pascal語言編譯、運行效率高,便于移植,因此廣泛地應(yīng)用于應(yīng)用軟件的開發(fā)。 2.1 數(shù)據(jù)類型 2.2 常量與變量 2.3 運算符和表達式 2.4 基本程序設(shè)計 2.5 過程與函數(shù) 2.6 常用內(nèi)部函數(shù),2.1 數(shù)據(jù)類型,Object Pascal的數(shù)據(jù)類型包括一些標(biāo)準(zhǔn)的數(shù)據(jù)類型,例如:整型、實型、字符型、字符串型和布爾型等等。除此之外,系統(tǒng)還允許用戶自己定義一些較為復(fù)雜的數(shù)據(jù)類型,例如:子界類型、枚舉類型、指針類型、記錄類型以及文件類型等等。 2.1.1 標(biāo)準(zhǔn)數(shù)
2、據(jù)類型 2.1.2 子界類型 2.1.3 枚舉類型 2.1.4 集合類型 2.1.5 指針類型 2.1.6 數(shù)組類型 2.1.7 記錄類型 2.1.8 文件類型,2.1.1 標(biāo)準(zhǔn)數(shù)據(jù)類型,Object Pascal的數(shù)據(jù)類型包括一些基本的簡單數(shù)據(jù)類型,例如:整型、實型、字符型、字符串型和布爾型等等。下表列出了標(biāo)準(zhǔn)的數(shù)據(jù)類型。 數(shù)據(jù)類型表,如圖所示:,2.1.1 標(biāo)準(zhǔn)數(shù)據(jù)類型,2.1.2 子界類型,子界類型是Pascal允許用戶定義的一個結(jié)構(gòu)數(shù)據(jù)類型。如果用戶預(yù)先知道一個變量的范圍,就可以通過定義子界類型和子界類型變量來實現(xiàn)由系統(tǒng)自動檢查變量是否超出了允許的范圍。 子界類型的定義: Type 類
3、型名稱=常量1..常量2; 例如以下代碼: type TMonth=1..12; TScore=A..F;,2.1.2 子界類型,var Month:TMonth; Score:TScore; 如上定義了子界類型變量Month的范圍從112,Score的范圍從AF。,2.1.3 枚舉類型,枚舉類型的定義: Type 類型名稱=(標(biāo)識符1),標(biāo)識符2,,標(biāo)識符n); 用戶經(jīng)常要用到這樣的數(shù)據(jù),它是通過列舉出該數(shù)據(jù)所有的可能值來定義的,如下例: type TWeekDay=(Sun, Mon, Tue, Wed, Thu, Fri, Sat); var WeekDay:TweekDay; 需要注意
4、的是,每個枚舉值只能出現(xiàn)在一個枚舉類型的定義當(dāng)中,而且在每個枚舉類型的定義當(dāng)中只能出現(xiàn)一次。,2.1.4 集合類型,集合類型是Pascal允許用戶定義的一個結(jié)構(gòu)數(shù)據(jù)類型,它使用戶可以運用通常集合運算,例如:交集、并集和差集。集合類型是一些同類型元素的集合,這些基類型元素可以是整型、實型、布爾型、字符型、枚舉型或子界類型。它通常的作用是用來檢驗?zāi)硞€元素是否被包含在一個集合當(dāng)中。 下例用來說明集合類型數(shù)據(jù)的定義方法和運用: type TWeekDay=Set of 1..7; var WeekDay:TWeekDay;,2.1.4 集合類型,begin WeekDay:=1,3,5,6; end;
5、 注意Pascal編輯程序限制了集合數(shù)目,所以整型數(shù)據(jù)不能作為集合類型的基類型。而只能是整型子界?;愋捅仨毷怯行蝾愋?,所以實型、數(shù)組類型不能作為集合類型的基類型。,2.1.5 指針類型,Pascal允許建立動態(tài)數(shù)據(jù)結(jié)構(gòu),它采用指針類型數(shù)據(jù),指針類型變量的引入大大增強了程序的靈活性。一個指針類型變量用于保存一個內(nèi)存地址,由于該內(nèi)存地址指向的是一個動態(tài)分配的變量,所以,在定義指針類型數(shù)據(jù)時,必須說明它所指向變量的類型。 例如: Type Pbirthday=TBirthday; TBirthday=Record Name:String30; Year:Integer;,2.1.5 指針類型
6、,Month:1..12; Date:1..31; end; var Pbirthday1:Pbirthday; Pint:Integer; begin Pbirthday1.Name:=Smith; Pint:=18; end;,2.1.6 數(shù)組類型,數(shù)組類型數(shù)據(jù)是一種用戶定義的結(jié)構(gòu)數(shù)據(jù)類型,它是一些具有相同數(shù)據(jù)類型的元素的集合。根據(jù)數(shù)組的維數(shù)可以將數(shù)組分為一維數(shù)組、二維數(shù)組以及多維數(shù)組,每一維度的下標(biāo)指明了元素的數(shù)目。其下標(biāo)類型包括了除長整型以外的所有有序類型以及長整型的子界類型。 例如: type TOneArray=Array3..39 of Integer; TdoubleArra
7、y=Array125,1..50 of Real; Var OneArray:TOneArray; doubleArray:TdoubleArray;,2.1.7 記錄類型,記錄類型包括了一組元素,但和數(shù)組型數(shù)據(jù)不同的是,記錄類型數(shù)據(jù)可以包括相同的數(shù)據(jù)類型,也可以包括不同的數(shù)據(jù)類型;這些數(shù)據(jù)可以是數(shù)值型的,也可以是非數(shù)值型的。例如:用戶可以使用一個記錄類型數(shù)據(jù)記錄一個學(xué)生的名字、出生日期、籍貫以及學(xué)習(xí)成績等。 例如,一個學(xué)生的記錄類型如下: type TStudent=Record Name:String30; Age:Integer; StudNum:Integer; Score:r
8、eal; end;,2.1.7 記錄類型,var Student1:TStudent; begin Student1.Name:=Smith; Student1.Age:=20; Student1.StudNum:=950007; Student1.Score:=87.5; end;,2.1.8 文件類型,文件類型是用來對文件進行操作的,它包括同一類元素的線性有序組合。Delphi支持的文件類型有文本文件、記錄文件和無類型文件。定義文件類型實際上是定義了一個文件類型的指針。 例如: type TStudent=Record Name:String30; Age:Integer; Stud
9、Num:Integer; Score:real; end;,2.1.8 文件類型,Fstudent=File of Tstudent; Fstr=File of String; var Student1:FStudent; Str:Fstr; begin Student1.Name:=Smith; Student1.Age:=20; Student1.StudNum:=950007; Student1.Score:=87.5; Str=I love Delphi 7.0. end;,2.2 常量與變量,常量和變量是學(xué)習(xí)各種編程語言進行程序設(shè)計的基礎(chǔ)概念,分別代表了在程序運行過程中兩種不同狀態(tài)
10、的量。常量是指在程序運行過程中其值始終不變的量;與之相反,變量則是程序運行過程中其值可以改變的量。 2.2.1 常量 2.2.2 變量,2.2.1 常量,在Pascal中用const關(guān)鍵字來聲明常量,就像在C語言中const關(guān)鍵字一樣,C語言跟Object Pascal語言聲明常量的主要差別是,在Object Pascal語言中不需要在對常量賦值時聲明常量的類型,跟Visual Basic一樣,編譯器能根據(jù)常量的值自動判斷常量的類型并分配內(nèi)存;對于整型常量,編譯器在運行時跟蹤它的值,并不對它分配內(nèi)存。 例如: const ADecimalNumber=3.14; i=10; ErrorStri
11、ng=danger,Danger,Danger!;,2.2.1 常量,編譯器根據(jù)如下規(guī)則來對常量分配內(nèi)存:整型數(shù)被認(rèn)為是最小的Integer類型(10被認(rèn)為是ShortInt,32000被認(rèn)為是SmallInt等);字符串值被認(rèn)為是char類型或string類型(通過$H定義);浮點值被認(rèn)為是extended數(shù)據(jù)類型,除非小數(shù)點位數(shù)小于4位(這種情況被當(dāng)作comp類型);Integer和Char的集合類型被存儲為它們自己。,2.2.2 變量,Object Pascal要求在一個過程、函數(shù)或程序前在變量聲明段中聲明它們。Object Pascal類似Visual Basic,但不像C和C++,是
12、大小寫不敏感的。采用大小寫只是為了可讀性好。 當(dāng)在Object Pascal中聲明一個變量時,變量名在類型的前面,中間用冒號隔開,變量初始化通常要跟變量聲明分開。 Delphi能在var塊中對全局變量賦初值,這里有一些例子演示: var i:Integer=10;,2.2.2 變量,S:String=Hello World; D:Double=3.141579; 能賦初值的變量僅是全局變量,不是那些在過程或函數(shù)中局部變量,而且Delphi編譯器自動對全局變量賦初值。當(dāng)程序開始時,所有的整型數(shù)賦為0,浮點數(shù)賦為0.0,指針為null,字符串為空等等,因此,在源代碼中不必對全局變量賦零初值。,2.
13、3 運算符和表達式,運算符是在代碼中對各種數(shù)據(jù)類型進行運算的符號。例如,有能進行加、減、乘、除的運算符,有能訪問一個數(shù)組的某個單元地址的運算符。表達式由運算對象和運算符兩部分組成。 2.3.1 運算符 2.3.2 表達式,2.3.1 運算符,Object Pa s c a l語言中的運算符(Operators)有: 、not、、*、/、div、mod、and、shl、shr、as、+、、or、xor、=、、、=、in和is等。 按照操作數(shù)數(shù)目的多少來分,運算符分為下面兩類:單目運算符(Unary Operator)和雙目運算符(Binary Operator)。上面的、not和為單目運算符,
14、其余的為雙目運算符。其中+和-也可以作為單目運算符來使用。 單目運算符一般放在操作對象的前面,只有可以放在操作對象的后面。雙目運算符都放在兩個操作數(shù)之間。,2.3.1 運算符,有些運算符是根據(jù)給定的操作數(shù)的數(shù)據(jù)類型做相應(yīng)處理的。例如,運算符not對于整型的操作數(shù)說,做的是按位取反;對于邏輯類型的操作數(shù)來說,它完成的則是邏輯取反。 除了運算符、is和in外,其余操作符都可以對Variant類型的數(shù)據(jù)進行操作。 1. 算術(shù)運算符 2. 邏輯運算符 3. 位運算符 4. 字符串運算符 5. 指針運算符 6. 類運算符 7. 運算符 8. 集合運算符 9. 關(guān)系運算符,2.3.1 運算符,1. 算術(shù)運
15、算符 算術(shù)運算符對浮點數(shù)和整數(shù)進行加、減、乘、除和取模運算。 。,2.3.1 運算符,2. 邏輯運算符 Pascal語言用and和or作為邏輯與和邏輯或運算符,Pascal的邏輯非的運算符是not,它是用來對一個布爾表達式取反。 邏輯運算符對邏輯類型的操作數(shù)進行運算,數(shù)據(jù)結(jié)果也為邏輯類型,2.3.1 運算符,3. 位運算符 位運算符對整型的數(shù)據(jù)進行按位操作,所得結(jié)果也為整型數(shù)據(jù),如表所示。,2.3.1 運算符,4. 字符串運算符 加號(+)還可以作為字符串運算符,它可以將兩個字符串聯(lián)接在一起。如果兩個字符串都是短字符串,那么在結(jié)果字符串長度超過255個字符的情況下,只有前面255個字符有
16、效。,2.3.1 運算符,5. 指針運算符 表中的運算符可以對指針類型的數(shù)據(jù)進行操作。,2.3.1 運算符,6. 類運算符 類運算符as和is對類或類的實例進行操作。此外,關(guān)系運算符=和也可以對類進行操作。 7. 運算符 運算符返回一個變量、過程或函數(shù)的地址。,2.3.1 運算符,8. 集合運算符 集合運算符主要對兩個集合進行操作,判斷兩個集合之間的關(guān)系,如表所示。,2.3.1 運算符,9. 關(guān)系運算符 關(guān)系運算符可以對兩個普通數(shù)據(jù)類型、類、對象、接口類型或字符串類型的數(shù)據(jù)進行比較,結(jié)果數(shù)據(jù)類型為布爾類型,如表2-7所示。,2.3.2 表達式,一個表達式由運算對象和運算符兩部分組成。
17、運算符可以分為算術(shù)運算符、邏輯運算符、串運算符、字符指針運算符、集合運算符、關(guān)系運算符以及運算符。 運算符的優(yōu)先順序如表所示。,,運算符優(yōu)先順序類別1域、指針引用 not2取非* / div mod shl shr and as3乘除法與類型轉(zhuǎn)換 - or xor4加減法= = in is5比較操作 Pascal用and和or作為邏輯與和邏輯或運算符,而C語言使用,2.4 基本程序設(shè)計,基本程序設(shè)計主要包括:程序語句、基本控件、順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)。 2.4.1 程序語句 2.4.2 基本控件 2.4.3 順序結(jié)構(gòu) 2.4.4 選擇結(jié)構(gòu) 2.4.5 循環(huán)結(jié)構(gòu),2.4.1 程序語句,1
18、. 賦值語句 實現(xiàn)功能:為變量賦值。 語法形式::=; 實際舉例:x:=y*z; b:=(x=1) or (y=4) and (z0); t:=sqrt(m)+4*sin(x); 2. GOTO語句 實現(xiàn)功能:改變程序流程至標(biāo)號語句處。 語法形式:goto標(biāo)號; 實際舉例:goto 100;,2.4.1 程序語句,3. IF語句 實現(xiàn)功能:作條件判斷控制流程。 (1) 單分支語句 語法形式: if 布爾型表達式 then 語句; 實際舉例: if x<=100 then y:=x; y:=100; begin 語句組 end;,2.4.1 程序語句,(2) 雙分支語句 語法形式: if 布爾型
19、表達式 then begin 語句組 end else,2.4.1 程序語句,(3) 多層嵌套語句 語法形式: if then begin end else if then begin end;, else begin end;,2.4.1 程序語句,4. CASE語句 多層嵌套的條件語句可讀性差,實際編程中常采用case語句。 實現(xiàn)功能:實現(xiàn)多條件選擇。 語法形式: Case of 數(shù)值1: begin end; 數(shù)值2:,2.4.1 程序語句,begin end; 5. REPEAT語句 實現(xiàn)功能:循環(huán)。 語法形式: repeat ; until ;,2.4.1 程序語句,6. WHILE
20、語句 實現(xiàn)功能:循環(huán)。 語法形式: while do begin end; end; 7. FOR語句 實現(xiàn)功能:循環(huán)。,2.4.1 程序語句,語法形式: for = to do begin end; 8. WITH語句 實現(xiàn)功能:引用一個域或方法。 語法形式: with do begin ,2.4.2 基本控件,組件是可視化編程的基礎(chǔ),開發(fā)人員用它們來設(shè)計用戶界面以及提供給應(yīng)用程序的一些非可視化性能。對于應(yīng)用程序開發(fā)者來說,組件就是他們從組件面板上取得的并放到窗口上的某種事物。在這里,用戶可以通過修改組件屬性、建立事件處理過程來決定組件的外觀或作用。從組件編寫者的角度看,組件就是Object
21、 Pascal語言中的對象。這些對象可以封裝系統(tǒng)提供的行為元素(如標(biāo)準(zhǔn)的Windows 95/98控件)。其他對象能夠完全引入新的可視化或非可視化組件,這種情況下,一個組件的代碼構(gòu)成了該組件的全部行為。 Delphi中有四種基本的組件類型供用戶使用或創(chuàng)建:標(biāo)準(zhǔn)控件、自定義控件、圖形控件和非可視組件。,2.4.2 基本控件,在這里應(yīng)注意組件(component)和控件(control)兩個術(shù)語的交換使用,二者并不完全相同??丶强梢暤挠脩艚缑嬖?。在Delphi中,控件總是組件,因為它們都是從TComponent類派生而來的。組件是一種對象,它可以出現(xiàn)在組件面板上,也可以被放到窗口設(shè)計器上。組件
22、是TComponent類型,它不一定是控件,也就是說,它不一定是可視的用戶界面元素。,【例2-1】,設(shè)計步驟: 建立應(yīng)用程序的用戶界面:選擇“新建”工程,進入窗體設(shè)計器,增加四個標(biāo)簽Label1Label4,四個編輯框Edit1Edit4和一個按鈕Button1,如圖2-1所示。 設(shè)置對象屬性:如表所示。,輸入長方體的長和寬,然后計算并輸出長方體的周長和面積。 分析:設(shè)長方體的長和寬分別為a和b,長方體的周長和面積分別為c和s,結(jié)合題義可求出計算公式:c=2(a+b),s=ab。,【例2-1】, 編寫事件代碼。 Procedure Tform1.Button1Click(Sender:TObj
23、ect); var a,b,c,s:Real; begin a:=strtofloat(edit1.text); b:=strtofloat(edit2.text); c:=2*(a+b); s:=a*b; edit3.text:=floattostr(c); edit4.text:=floattostr(s); end;,2.4.3 順序結(jié)構(gòu),順序結(jié)構(gòu)是程序中最簡單、最常見的基本結(jié)構(gòu)。在該結(jié)構(gòu)中,各操作模塊(對應(yīng)于程序中的“程序段”)按照出現(xiàn)的先后順序依次執(zhí)行,它是任何程序的主體基本結(jié)構(gòu),即使在選擇結(jié)構(gòu)或者更為復(fù)雜的循環(huán)結(jié)構(gòu)中,也常以順序結(jié)構(gòu)作為其子結(jié)構(gòu)。 在順序結(jié)構(gòu)中,通常使用基本控件完成
24、輸入及輸出操作,使用賦值語句等簡單的操作語句組成順序結(jié)構(gòu)即可實現(xiàn)順序結(jié)構(gòu)程序的編寫。,2.4.4 選擇結(jié)構(gòu),選擇結(jié)構(gòu)是計算機科學(xué)用來描述自然界和社會生活中分支現(xiàn)象的重要手段。其特點是:根據(jù)所給定的條件成立(真)或否(假),而決定從實際可能的不同分支中執(zhí)行某一分支的相應(yīng)操作。 在Delphi中,實現(xiàn)選擇結(jié)構(gòu)的語句是If語句和Case語句,這兩種語句又稱為條件語句,條件語句的功能就是根據(jù)表達式的值有選擇地執(zhí)行一組語句。,2.4.4 選擇結(jié)構(gòu),1. If語句 在執(zhí)行一段代碼以前,If語句能讓用戶判斷某個條件是否滿足。 注意如果在一條if語句中有多個條件,用戶需要用括號把這幾個條件分別用括號括起來。
25、在Pascal中的begin和end,就像是C和C++中的“”和“”,例如,下面的代碼是當(dāng)一個條件滿足時要執(zhí)行多條語句: if x=6 then begin DoSomething; DoSomethingElse; DoAnotherThing; end;,2.4.4 選擇結(jié)構(gòu),用if...else能組合多個條件: if x=100 then SomeFunction else if x=200 then SomeOtherFunction else begin SomethingElse; Entirely end;,2.4.4 選擇結(jié)構(gòu),2. case語句 在Pascal中的case語句
26、就像是C和C + +中的switch語句。case語句用來在多個可能的情況中選擇一個條件,而不再需要用一大堆if...else if...else if結(jié)構(gòu),下面的代碼是Pascal的case語句:,2.4.4 選擇結(jié)構(gòu),case SomeIntegerVariable of 101: DoSomething; 202: begin DoSomething; DoSomethingElse; end; 303: DoAnotherthing; else DoTheDefault; end; 注意case語句的選擇因子必須是有序類型,而不能用非有序的類型如字符串作為選擇
27、因子。,2.4.5 循環(huán)結(jié)構(gòu),循環(huán)是一種能重復(fù)執(zhí)行某一動作的語言結(jié)構(gòu),Pascal中的循環(huán)結(jié)構(gòu)和其他語言中的循環(huán)結(jié)構(gòu)相類似,下面列出了在Pascal中要用到的各種循環(huán)結(jié)構(gòu)。 1. for循環(huán) for循環(huán)適合用在事先知道循環(huán)次數(shù)的情況下,下面的代碼在一個循環(huán)中把控制變量加到另一個變量中,共重復(fù)10次: var i,x:Integer; begin x:=0; for i:=1 to 10 do inc(x,i); end;,2.4.5 循環(huán)結(jié)構(gòu),2. while循環(huán) while循環(huán)結(jié)構(gòu)用在先判斷某些條件是否為真,然后重復(fù)執(zhí)行某一段代碼的情況下。while的條件是在循環(huán)體執(zhí)行前進行判斷的。用wh
28、ile循環(huán)的典型例子是當(dāng)文件沒有到達文件結(jié)尾時,對文件進行某一重復(fù)操作。下面的例子演示了每次從文件中讀一行并寫到屏幕上: Program FileIt; $APPTYPE CONSOLE var f:=TextFile; S:=String;,2.4.5 循環(huán)結(jié)構(gòu),begin AssignFile(f,foo.txt); Reset(f); while not EOF(f) do begin readln(f,S); writeln(S); end; CloseFile(f); end. Pascal中的while循環(huán)基本上跟C中的while循環(huán)和Visual Basic中Do While循環(huán)
29、一樣。,2.4.5 循環(huán)結(jié)構(gòu),3. repeat...until repeaat...until循環(huán)與while循環(huán)相似,但考慮問題的角度不同,它在某個條件為真前一直執(zhí)行給定的代碼。因為條件測試在循環(huán)的結(jié)尾,所以循環(huán)體至少要執(zhí)行一遍。Pascal的repeat...until語句大致上同于C語言中的do...while語句。,2.4.5 循環(huán)結(jié)構(gòu),例如,下面的代碼不斷地把一個計數(shù)器加1,直到它大于100為止: var x:Integer; begin x:=1; repeat inc(x); until x100; end;,2.4.5 循環(huán)結(jié)構(gòu),4. Break()過程 在while、fo
30、r或repeat循環(huán)中調(diào)用Break(),使得程序的執(zhí)行流程立即跳到循環(huán)的結(jié)尾,在循環(huán)中當(dāng)某種條件滿足時需要立即跳出循環(huán),這時調(diào)用Break()。Pascal中的Break()類似于C語言中的break和Visual Basic中的Exit語句。下面的代碼演示了在5次循環(huán)后跳出循環(huán)。 var i:Integer; begin for i:=1to 100000 do begin MessageBeep(0); if i=5 then break; end; end;,2.4.5 循環(huán)結(jié)構(gòu),5. Continue()過程 如果想跳過循環(huán)中部分代碼重新開始下一次循環(huán),就調(diào)用Continue()
31、過程。注意下面的例子在執(zhí)行第一次循環(huán)時continue()后的代碼不執(zhí)行: var i:Integer; begin for i:=1 to 3 do begin writeln(i,.Before Continue); if i=1 then continue; writeln(i,.After continue); end; end;,2.5 過程與函數(shù),過程與函數(shù)是實現(xiàn)一定功能的語句塊,可以在程序的其他地方被調(diào)用,也可以進行遞歸調(diào)用。 過程與函數(shù)的區(qū)別在于:過程沒有返回值,而函數(shù)有返回值。 2.5.1 過程 2.5.2 函數(shù) 2.5.3 參數(shù) 2.5.4 子程序的嵌套與遞歸 2.5
32、.5 變量的作用域 2.5.6 Delphi的程序結(jié)構(gòu),2.5.1 過程,過程的定義包括過程原型、過程體的定義。 過程定義的形式如下: procedure procedureName(parameterList);directives; local Declarations; begin statements end;,2.5.1 過程,其中procedureName是過程名,為一個有效的標(biāo)識符。 parameterList為參數(shù)列表,需要指明參數(shù)的個數(shù)及其數(shù)據(jù)類型。 directives是一些關(guān)于函數(shù)的指令字,可以一次設(shè)置多個,使用分號隔開。localDeclarations中定義了該函數(shù)中
33、需要使用的一些臨時變量,通常也叫做本地變量。 在begin與end之間是在函數(shù)調(diào)用時實現(xiàn)特定功能的一系列語句。 上面的parameterList、directives、localDeclarations和statements等為可選部分。,2.5.1 過程,procedure NumString(N: Integer; var S: string); var V: Integer; begin V := Abs(N); S := ; repeat S := Chr(V mod 10 + Ord(0)) + S; V := V div 10; until V = 0; if N < 0 th
34、en S := - + S; end;,2.5.2 函數(shù),函數(shù)的定義與過程非常類似,只是使用的保留字不同,而且多了一個返回值類型。 具體形式如下: function functionName(parameterList):returnType;directives; localDeclarations; begin statements end;,2.5.2 函數(shù),可以將函數(shù)要返回的數(shù)值賦值給Result。 如果函數(shù)體中存在著一些由于判斷而產(chǎn)生的分支語句時,要在每一個分支中設(shè)置返回值。通常要根據(jù)函數(shù)的返回值來確定下一步的操作。,2.5.2 函數(shù),function Power(X: Real;
35、Y: Integer): Real; var I: Integer; begin Result := 1.0; I := Y; while I 0 do begin if Odd(I) then Result := Result * X; I := I div 2; X := Sqr(X); end; end;,2.5.3 參數(shù),一般將函數(shù)定義時參數(shù)列表中的參數(shù)稱為形參,將函數(shù)調(diào)用時參數(shù)列表中的參數(shù)稱為實參。在函數(shù)原型中,多個參數(shù)之間用分號隔開,同一類型的參數(shù)可以放在一起,以逗號隔開。在函數(shù)調(diào)用的時候,在函數(shù)原型中,多個參數(shù)之間用逗號隔開。 一般來說,形參列表和實參列表完全匹配是指參數(shù)
36、的個數(shù)一樣,而且順序排列的數(shù)據(jù)類型也完全一致。對于普通的函數(shù),如果編譯器發(fā)現(xiàn)實參的數(shù)據(jù)類型與形參的數(shù)據(jù)類型不匹配,會將實參的數(shù)據(jù)類型進行一次或多次的“提升”,比如:將Integer類型轉(zhuǎn)換為Double類型。,2.5.3 參數(shù),可以為過程和函數(shù)的參數(shù)指定默認(rèn)數(shù)值。具體方法是在參數(shù)定義后面緊接著一個等號“=”,然后是一個常量。指定默認(rèn)數(shù)值的參數(shù)要放在參數(shù)列表的后部,將沒有指定默認(rèn)數(shù)值的參數(shù)放在參數(shù)列表的前面部分。在函數(shù)調(diào)用的時候,可以為設(shè)置了默認(rèn)值的參數(shù)指定一個新值,在函數(shù)體中,各語句使用的是指定的新值;如果沒有指定新值,則使用默認(rèn)值。同樣,如果存在多個設(shè)置了默認(rèn)值的參數(shù),只有前面的參數(shù)指定了新
37、值,后面的參數(shù)才可以指定新值。,【例2-2】,program Project1; $APPTYPE CONSOLE uses Sysutils; // 為了使用函數(shù)Format //以一定精度顯示一個浮點數(shù) function ShowNum(Num:Double;Precision:Integer=4):Boolean; var MesStr:string; // 浮點數(shù)顯示輸出的內(nèi)容 begin if Precision<=-1 then // 小數(shù)點后的位數(shù)要大于或等于零 begin Result:=False; Exit; // 退出顯示函數(shù) end else begin,定義一個函數(shù)S
38、howNum,可以將一個浮點數(shù)按指定的精度輸出在屏幕上。,【例2-2】,// 設(shè)置顯示的格式 MesStr:=Format(%*.*f,10,Precision,Num); Result:=True; end; Writeln(MesStr); // 顯示數(shù)據(jù) end; begin ShowNum(123.456789); // Precision默認(rèn)為4 ShowNum(123,5); // 參數(shù)對數(shù)據(jù)類型進行升級 // 下面一句代碼不正確,故屏蔽掉 // ShowNum(123.456789,9.13);// 參數(shù)對數(shù)據(jù)類型不能降級 ShowNum(22 div 7,5);// 調(diào)用函數(shù)
39、// 可以根據(jù)函數(shù)的返回值確定下一步的操作 if ShowNum(123.456789,-3)=False then Writeln(數(shù)據(jù)格式設(shè)置錯誤,輸出失敗。); Writeln(按下回車鍵退出。); Readln; end.,【例2-2】,運行結(jié)果如下: 123.4568 123.00000 3.14286 數(shù)據(jù)格式設(shè)置錯誤,輸出失敗。 按Enter鍵退出。 說明: 為了使用函數(shù)Format,需要在uses語句中將Sysutils單元包含進去。,【例2-2】, 由于小數(shù)點后的位數(shù)不可以設(shè)置為負數(shù),所以當(dāng)出現(xiàn)負數(shù)的時候,ShowNum函數(shù)返回False,并調(diào)用Exit函數(shù)立刻退出ShowN
40、um函數(shù)。 在語句ShowNum(123,5);中,首先將整型常數(shù)123轉(zhuǎn)換為浮點型常數(shù),然后進行參數(shù)傳遞。 在語句ShowNum(22 div 7,5);中,22 div 7的結(jié)果為3,然后再轉(zhuǎn)換為浮點型常數(shù)進行參數(shù)傳遞。,2.5.4 子程序的嵌套與遞歸,在一個子程序(過程或函數(shù))中包含另外一個子程序(過程或函數(shù))的調(diào)用,稱為子程序的嵌套。 子程序的遞歸調(diào)用是指一個過程直接或間接調(diào)用自己本身,子程序直接調(diào)用自身稱為直接遞歸,子程序間接調(diào)用自己稱為間接遞歸。在遞歸調(diào)用中,一個過程執(zhí)行的某一步要用到它自身的上一步(或上幾步)的結(jié)果。,2.5.4 子程序的嵌套與遞歸,遞歸調(diào)用在處理階乘運算、級數(shù)運
41、算、冪指數(shù)運算等方面特別有效。 遞歸函數(shù)論是現(xiàn)代數(shù)學(xué)的一個重要分支,數(shù)學(xué)上常常采用遞歸的辦法來定義一些概念。例如,自然數(shù)n的階乘可以遞歸定義為: 遞歸在算法描述中有著重要的地位,很多看似非常復(fù)雜的問題,但使用遞歸后可以很輕松地解決。在間接遞歸調(diào)用中,子程序必須超前引用,即在子程序的首部后面加上保留字forward。,n!=,【例2-4】,編寫程序打印菲波拉西(Fibonacci)數(shù)列。 菲波拉西數(shù)列排列如下: 1 1 2 3 5 8 13 21 34 55 分析:形成此數(shù)列的規(guī)律是,它的頭兩個數(shù)為1,從第三個數(shù)開始其值是它前面的兩個數(shù)之和。即: 。,fibo=,【例2-4】,這里只寫出了菲波
42、拉西函數(shù)的代碼,事件代碼用戶可自己設(shè)計。 Function fact(n:Real):Real; begin if n=1 Or n=2 Then fibo:=1; else fibo:=fibo(n-1)+fibo(n-2); end; 利用遞歸算法能簡單有效地解決一些特殊問題,但是由于遞歸調(diào)用過程比較繁瑣,所以執(zhí)行效率很低,在選擇遞歸時要慎重,2.5.5 變量的作用域,作用域是指一個過程、函數(shù)和變量能被編譯器識別的范圍,例如,一個全局常量的作用域是整個程序,而一些過程中的局部變量的作用域是那些過程。,【例2-5】作用域的演示的示例 Program Foo; $APPTYPE CONSO
43、LE const SomeConstant=100; var SomeGlobal:Integer; R:Real;,2.5.5 變量的作用域,procedure SomeProc(var R:Real); var LocalReal:Real; begin LocalReal:=10.0; R:=R-LocalReal; end; begin SomeGlobal:= SomeConstant; R:=4.593; SomeProc(R); end;,2.5.5 變量的作用域,SomeConstant、SomeGlobal和R是全局變量,它們在程序的任何地方都能被編譯器所識別。過程SomeP
44、roc()有兩個變量R和LocalReal,它們的作用域是這個過程。如果試圖在SomeProc()過程外訪問LocalReal,編譯器將顯示有未知識別符的錯誤。如果在SomeProc()中訪問R,用的是局部變量的R,如果在這個過程外用R,則用的是全局變量的R。,2.5.6 Delphi的程序結(jié)構(gòu),一個Delphi應(yīng)用程序?qū)?yīng)一個工程,從程序結(jié)構(gòu)的角度來看,它由一個主程序與若干個單元組成,而程序段則是構(gòu)成主程序和單元的基本結(jié)構(gòu)要素。 1. 主程序 Delphi工程文件中的代碼即為Delphi應(yīng)用程序的主程序。主程序的結(jié)構(gòu)為: program工程文件名; uses語句 $R*.RES 執(zhí)行部分,2
45、.5.6 Delphi的程序結(jié)構(gòu),Delphi中主程序一般很短,這是因為程序的幾乎所有功能在uses語句所引用的單元中。使用Delphi編程時,主程序由程序由系統(tǒng)自動生成,無需程序員編寫主程序的代碼,程序員所編寫的只是程序所引用的單元文件中的代碼。,2.5.6 Delphi的程序結(jié)構(gòu),2. 單元與作用域 Delphi編程強調(diào)單元或模塊的使用。在引入類之前,單元是模塊化編程的基礎(chǔ),而類也是建立在單元概念基礎(chǔ)上的。在Dilphi的應(yīng)用程序中,單元文件可以用來定義一個窗體,也可以用來定義程序中所使用的子程序、全程變量和常量等。 當(dāng)創(chuàng)建工程時,或是向工程中添加一個新窗體時,Delphi都將自動添加一個
46、新的單元文件,該單元為新窗體定義類與對象。使用菜單命令:“File”中的“New”命令,在“New”選項卡中選擇“Unit”圖標(biāo),就能在當(dāng)前工程中添加一個與窗體無關(guān)的獨立單元。,2.5.6 Delphi的程序結(jié)構(gòu),(1) 單元的結(jié)構(gòu) 單元文件的結(jié)構(gòu)如下所示: unit 單元名 // 單元首部 interface // 接口部分 implementation // 實現(xiàn)部分 end // 單元結(jié)束,2.5.6 Delphi的程序結(jié)構(gòu),(2) 作用域 在單元的接口部分聲明的標(biāo)識符(類型、常量、變量、函數(shù)和過程等)在整個單元內(nèi)(自聲明處起至單元結(jié)束)有效。其他單元(客戶單元
47、)引用該單元時,則在客戶單元內(nèi)有效。 在實現(xiàn)部分隱含聲明的標(biāo)識符,不能在單元外使用,即它們在客戶單元中不可見。這些標(biāo)識符在本單元的實現(xiàn)部分自聲明處起至實現(xiàn)部分結(jié)束的任何程序段中有效。 在實現(xiàn)部分的任何子程序段中聲明的標(biāo)識,則遵循程序段中標(biāo)識符的作用域規(guī)則。,2.5.6 Delphi的程序結(jié)構(gòu),3. 程序段與作用域 一個程序段是由聲明部分和語句部分構(gòu)成的結(jié)構(gòu),其一般結(jié)構(gòu)為: 聲明部分 begin 語句 End 其中聲明部分用來聲明類型、常量、變量、函數(shù)和過程等,語句則是程序段的執(zhí)行部分,可以是簡單語句、復(fù)合語句或簡單語句與復(fù)合語句的任意組合。在聲明部分聲明的標(biāo)識符(類型、常量、變量、函數(shù)和過程)
48、其作用范圍僅限于該程序段內(nèi)。 函數(shù)體和過程體就是典型的程序段。,2.6 常用內(nèi)部函數(shù),為了盡可能地減少開發(fā)應(yīng)用程序的難度和工作量,Delphi提供了一個內(nèi)容十分豐富的程序庫Run-Time Library(RTL),其中包括了大量的基本函數(shù)、過程、常量和變量定義。RTL包含的函數(shù)、過程、常量等都是在System單元中定義的,而System單元會自動地被其他程序單元引用,所以用戶編寫的應(yīng)用程序可以隨時調(diào)用RTL中可用的函數(shù),而不用在程序的uses語句中引用該單元。 2.6.1 數(shù)學(xué)運算函數(shù) 2.6.2 字符處理函數(shù) 2.6.3 時間和日期函數(shù) 2.6.4 數(shù)據(jù)類型轉(zhuǎn)換函數(shù) 2.6.5 格式輸出函數(shù),
- 溫馨提示:
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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。