Delphi 是以 Object Pascal 語言為基礎(chǔ)的可視化開發(fā)工具,雖然兩者之間有著很大區(qū)別,但是要學(xué)好 Delphi,首先要掌握的就是 Object Pascal 語言。
?Object Pascal語言編寫環(huán)境
如何使用Delphi編寫Object Pascal 程序。一般來說,使用 Delphi 開發(fā)出來的程序有以下 3 種。
1.圖形界面程序
圖形界面程序是目前Windows 平臺(tái)最常見的應(yīng)用程序,這些程序通過窗體和對(duì)話框與用戶進(jìn)行信息交互,實(shí)現(xiàn)一定的功能。例如Microsoft 公司的Office 系列軟件和正在使用的Delphi 等,它們都是圖形界面程序。
2.控制臺(tái)程序
控制臺(tái)程序是指一些沒有圖形用戶界面的32 位Windows應(yīng)用程序,類似在DOS 環(huán)境下運(yùn)行的程序。這些程序很少要求用戶輸入大量的信息,一般只實(shí)現(xiàn)特定的功能。控制臺(tái)程序的代碼較小,占用的系統(tǒng)資源少,因此編譯、鏈接的速度比較快。
3.服務(wù)器程序
服務(wù)器程序可以接受和處理客戶應(yīng)用程序的請(qǐng)求,并將結(jié)果信息返回給客戶應(yīng)用程序。服務(wù)器應(yīng)用程序一般在后臺(tái)運(yùn)行,不需要大量的人機(jī)交互信息。
下面以開發(fā)一個(gè)簡單的控制臺(tái)程序?yàn)槔蜃x者介紹Delphi 中生成Object Pascal 程序的基本方法,并對(duì)Object Pascal 程序的一般結(jié)構(gòu)進(jìn)行簡單說明。
在Delphi集成開發(fā)環(huán)境中,依次選擇“File”? “New”?“Other”菜單項(xiàng)打開“New Items”對(duì)話框。選中“New”標(biāo)簽頁中的“Console Application”選項(xiàng),單擊“OK”按鈕,代碼編輯器中將自動(dòng)打開一個(gè)初始名為Project1.dpr的控制臺(tái)程序。請(qǐng)將Project1.dpr 文件修改為如下內(nèi)容:
program
? Project1;
{$APPTYPE
? CONSOLE}
//uses
? SysUtils;
var
? str:string;
begin
? // Insert user code here
? writeln(’您好,這是一個(gè)示范程序,請(qǐng)輸入一行文字:’);
? readln(str);
? writeln(’您輸入的是:’,str);
? readln;
end.
依次選擇“File”? “Save
All”菜單項(xiàng)可以將更改后的工程文件保存到指定的文件夾中。本章后面的例子都可以在該工程的基礎(chǔ)上方便地實(shí)現(xiàn)。
按F9鍵進(jìn)入編譯、鏈接、運(yùn)行程序。待程序提示“您好,這是一個(gè)示范程序,請(qǐng)輸入一行文字:” 文字后,用戶可以輸入一些內(nèi)容,例如輸入“早上好!”,程序?qū)⑤敵鼋Y(jié)果:“您輸入的是:早上好!”。
以下是對(duì)該程序的幾點(diǎn)說明:
[if !supportLists]?????????[endif]程序第2 行中{$APPTYPE
CONSOLE}是一個(gè)編譯器指令,它告訴編譯器這個(gè)程序是一個(gè)控制臺(tái)程序。
[if !supportLists]?????????[endif]uses SysUtils 語句前加了兩個(gè)斜線,將這條語句以注釋語句的形式屏蔽掉了,因?yàn)樵谶@個(gè)例子中是不需要SysUtils 單元的。
[if !supportLists]?????????[endif]writeln 和readln兩個(gè)函數(shù)分別表示輸出和輸入一行字符。程序最后的readln 語句是為了鎖定窗口,否則輸出結(jié)果將很快消失。
注釋語句
作為起點(diǎn),首先介紹如何在Object Pascal 代碼中添加注釋。如果不給程序加上適當(dāng)?shù)淖⑨專欢螘r(shí)間后就很難理清程序的流程。同時(shí)編譯器會(huì)將注解忽略,不會(huì)影響程序的編譯與運(yùn)行。
Object Pascal 中有3 種類型的注釋。
花括號(hào)注釋:組合符號(hào)“{”和“}”的成對(duì)使用。——{……}
圓括號(hào)/星號(hào)注釋:組合符號(hào)“(*”和“*)”的成對(duì)使用。——(*……*)
Visual C++風(fēng)格的雙斜杠注釋:符號(hào)“//”的單獨(dú)使用。——//……
注意,相同類型的注釋不要嵌套使用。雖然不同類型的注釋進(jìn)行嵌套在語法上是合法的,但不建議這樣做。
標(biāo)識(shí)符
Object Pascal 語言使用的標(biāo)識(shí)符包括字母 A~Z、a~z、數(shù)字 0~9 及其他一些標(biāo)準(zhǔn)字符。
?Object Pascal 語言的特殊符號(hào)
$ & * # ? ( ) [ ] { } ^ ; : @ < = > , . ? + /? ? ?
?Object Pascal 語言的單個(gè)的特殊符號(hào)
(* *) (. .) .. // := <> >= <=? ?
在 Object Pascal 語言中,標(biāo)識(shí)符用來標(biāo)識(shí)變量、常量、屬性、類、對(duì)象、過程、函數(shù)、程序、組件庫等。標(biāo)識(shí)符可以由任意長度不帶空格的字符串組成,但對(duì)于編譯器來講只有前面
255 個(gè)字符有效。其中,標(biāo)識(shí)符的第 1 個(gè)字符必須是字母或下劃線,其余字符可以是字母、數(shù)字或下劃線。通常,標(biāo)識(shí)符由一個(gè)或多個(gè)具有適當(dāng)意義的英文單詞組成。Object Pascal 語言對(duì)區(qū)分字母的大小寫是不敏感的。
?保留字和指令字
Object Pascal 還定義了 39 個(gè)指令字,它們具有特殊含義。但是,在用戶重新定義了指令字后,在作用域內(nèi)它們就失去了原來的意義。
其中Private、Protected、Public、Published、Automated、On 和At是指令字,但是,應(yīng)當(dāng)視其為保留字,不要定義和它們同名的標(biāo)識(shí)符。
在 Delphi 集成開發(fā)環(huán)境的代碼編輯器中,保留字和指令字以黑體顯示,這樣就大大方便了用戶的使用,不必?fù)?dān)心因?yàn)椴恍⌒亩e(cuò)誤地將保留字或指令字定義為標(biāo)識(shí)符。
?數(shù)據(jù)類型與定義變量
傳遞給過程或函數(shù)的參數(shù)值必須與形參的類型一致。變量是程序代碼中代表一個(gè)內(nèi)存地址的標(biāo)識(shí)符,那么該地址的內(nèi)存內(nèi)容就可以在程序代碼執(zhí)行時(shí)被改變。每個(gè)變量都有一個(gè)名字和數(shù)據(jù)類型,名字可以用來引用變量,數(shù)據(jù)類型決定變量的取值范圍。
1.?dāng)?shù)據(jù)類型概論
Object Pascal 語言提供了非常豐富的數(shù)據(jù)類型,即簡單類型(Simple)、字符串類型(String)、結(jié)構(gòu)類型(Struct)、指針類型(Pointer)、函數(shù)和過程類型(Procedural)和變體類型(Variant)等。
(1)簡單類型(Simple)
簡單類型包括實(shí)數(shù)類型(Real)和有序類型(Ordinal)。有序類型又包括整數(shù)類型、字符類型、布爾類型、枚舉類型和子界類型等。
① 整數(shù)類型;包括的類型:
Integer ?-2 147 483 648~2147 483 647
Cardinal ?0~42 994 967 295
Shortint ?-128~127
Smallint ?-32 768~32? 767
Longint ?-2 147 443 648~2? 147 483 647
Int64 ?-2? ~2?????? -1
Byte ?0~255
Word 0~65 535
Longword 0~4 294 967 295
?②字符類型;字符類型有 3 種字符變量:
AnsiChar ????8 位 ?????????根據(jù)擴(kuò)展 ANSI 字符表排列
WideChar ????16 位? ? ? ?根據(jù) Unicode 碼排列,前 256個(gè) Unicode 字符同 ANSI 字符相同
Char? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Delpi 中通用的字符類型,相當(dāng)于WideChar
注意:因?yàn)橐粋€(gè)字符在長度上并不表示一個(gè)字節(jié),如果程序中必須用到字符的字節(jié)數(shù),最好用 SizeOf()函數(shù)獲取。
③布爾類型
布爾類型包括4種,分別為Boolean、ByteBool、WordBool 和LongBool。Boolean和ByteBool 各占用一個(gè)字節(jié),WordBool 占用兩個(gè)字節(jié),LongBool 占用4 個(gè)字節(jié)。
Boolean的值只能是0(False)或1(True),ByteBool、WordBool 和LongBool 可以是有符號(hào)的整數(shù),為0 值代表False,非0值代表True。
最常用的是Boolean 類型,而ByteBool、WordBool 和LongBool 類型是為了與其他語言和Windows 環(huán)境兼容,因?yàn)閃indows 的API 在返回一個(gè)布爾值時(shí),其值可能是一個(gè)兩字節(jié)的有符號(hào)整數(shù)。如果試圖把返回值賦給Boolean 類型的數(shù)據(jù),編譯器認(rèn)為類型不匹配,若是進(jìn)行類型強(qiáng)制轉(zhuǎn)換,可能使返回值的有效數(shù)據(jù)被截?cái)唷?/p>
④枚舉類型
枚舉類型是由一組有序的標(biāo)識(shí)符組成的,它列出了所有這種類型可以包括的值。例如一個(gè)星期有7 天,程序中分別用 0、1、2、3、4、5、6 來表示一個(gè)星期的每一天,但在程序中很不直觀。
type?//變量名=(枚舉列表)
? DayOfWeek=(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday);
為了引用此枚舉類型,必須聲明一個(gè)DayOfWeek 類型的變量,例如:
var
Days:DayOfWeek;
這樣就聲明了一個(gè)DayOfWeek類型的枚舉變量Days,Days 的值總是標(biāo)識(shí)符列表中的一個(gè)。
為了簡化程序,還可以將類型聲明和變量聲明合二為一,例如:
var
? Days:(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday);
注意:枚舉的元素只能是標(biāo)識(shí)符,標(biāo)識(shí)符的命名規(guī)則必須符合Object Pascal 關(guān)于標(biāo)識(shí)符的規(guī)定。例如不能以數(shù)字打頭,標(biāo)識(shí)符不能是保留字,同一個(gè)枚舉元素不能同時(shí)出現(xiàn)在多個(gè)枚舉中。
⑤子界類型
子界類型是下列類型中某范圍內(nèi)的值,即整型、布爾型、字符型或枚舉型。如果需要限制一個(gè)變量的取值范圍時(shí),子界類型是一個(gè)好的選擇。
⑥實(shí)型
實(shí)型不是有序類型,因?yàn)樗闹涤蚴菬o限的,實(shí)型的數(shù)據(jù)也叫實(shí)數(shù),實(shí)型用于表示通常所說的浮點(diǎn)數(shù)。Object Pascal 語言中的實(shí)數(shù)數(shù)據(jù)(Real)類型
Real48? ? Single????Double????Extended????Comp????Currency????Real。
常用的實(shí)數(shù)類型是 Real、Single、Double。
(2)字符串類型(String)
Object Pascal 的字符串類型分為短字符串和長字符串兩種。
短字符串,指字符串長度最大不超過 255 個(gè)字符的字符序列。當(dāng)編譯開關(guān)的狀態(tài)為{$H-}時(shí),用保留字 String 聲明的是一個(gè)短字符串,不管編譯開關(guān)$H 處于什么狀態(tài)下,用 ShortString聲明的變量總是短字符串類型。保留字String 后用方括號(hào)括起來的無符號(hào)整數(shù),表示字符串的最大長度是200。當(dāng)把一個(gè)字符串賦給一個(gè)短字符類型的變量時(shí),超過其最大長度的將被截掉。短字符串中的每一個(gè)字符都可以通過字符串名加字符索引來訪問。索引是從0 開始的,但索引 0 處存放的是字符串的實(shí)際長度,如下兩行代碼的功能是一樣的,索引1 處才是真正的字符開始處。短字符串的長度是動(dòng)態(tài)改變的,可以使用Low和High 函數(shù)取得字符串的最小序號(hào)和最大序號(hào),Low 的返回值是0,High 的返回值是所聲明的字符串的最大長度。
長字符串的長度幾乎是無限制的,理論上可以達(dá)到2GB,實(shí)際上只會(huì)受計(jì)算機(jī)內(nèi)存的限制。要聲明一個(gè)長字符串,可以用預(yù)定義的標(biāo)識(shí)符AnsiString 或把編譯開關(guān)$H 改為{$H+}后用保留字String 聲明。長字符串在聲明以后自動(dòng)被初始化為空字符串。長字符串中的每個(gè)字符,是從索引1 開始的,長字符串沒有索引0,要取得長字符串的實(shí)際長度,只能調(diào)用Length()函數(shù)。長字符串在它最后一個(gè)字符后自動(dòng)加一個(gè)NULL 字符表示字符串結(jié)束(NULL 字符并不是長字符串的一部分),這一點(diǎn)與字符指針類型(PChar)類似,因此將一個(gè)長字符串轉(zhuǎn)換為PChar類型很方便,語法為:PChar(Str),其中Str 代表長字符串。長字符串被轉(zhuǎn)換為一個(gè)指針,指向字符串的每一個(gè)字符,即使長字符串是空的,強(qiáng)制轉(zhuǎn)換后總是能夠獲得一個(gè)指向以NULL 字符結(jié)束的字符中的指針。Object Pascal 允許字符串和長字符串同時(shí)出現(xiàn)在一個(gè)表達(dá)式中,編譯器會(huì)自動(dòng)根據(jù)需要進(jìn)行轉(zhuǎn)換。
注意:字符串變量必須用一對(duì)單引號(hào)括起來,如果字符串本身就有單引號(hào),這個(gè)單引號(hào)要用兩個(gè)連續(xù)的單引號(hào)表示,如:’His name is ’’Jim’’’。
(3)結(jié)構(gòu)類型(Struct)
結(jié)構(gòu)數(shù)據(jù)類型包括:集合類型、數(shù)組類型、記錄類型、文件類型、類類型、類引用類型和接口類型等。
集合類型是一群具有相同類型的元素的組合,這些類型必須是有限類型,如整型、布爾型、字符型、枚舉型和子界類型。
type ?
Set1=set of ’A’.. ’Z’;?????????? //基類型是子界型 ?
Set2=set of Char;???????????? //基類型是字符型 ?
Set3=set(Jan,Feb,Mar,Apr);???? //基類型是枚舉型
Object
Pascal 語言提供了幾個(gè)用于集合的運(yùn)算符,用這些運(yùn)行符可以判斷集合與集合之間的關(guān)系,例如對(duì)集合增刪元素,求交集運(yùn)算等。賦值運(yùn)算與簡單類型一樣,聲明了一個(gè)集合類型的變量后,要為這個(gè)變量設(shè)定一個(gè)明確的值,例如:
var ?
TInt1,Tint2:set of 1..10;
以上代碼雖然聲明了兩個(gè)集合變量,但變量 TInt1 和 TInt2并不是代表 1~10 組成的集合,必須對(duì)它們賦值:
TInt1:=[1,3,5,7,9];
TInt2:=[2..5,8..10];
這樣TInt1 就是由1、3、5、7、9 組成的集合,TInt2 就是由2、3、4、5、8、9、10組成的集合。
關(guān)系運(yùn)算,就是對(duì)集合類型的運(yùn)算,遵循數(shù)學(xué)中關(guān)于集合運(yùn)算的規(guī)則,運(yùn)算的結(jié)果是布爾值。集合的關(guān)系運(yùn)算就是判斷兩個(gè)集合相互之間的關(guān)系,關(guān)系運(yùn)算符包括:=(等于)、<>(不等于)、>=(大于等于)、<=(小于等于)。
集合 A 等于集合 B,是指兩個(gè)集合中的元素完全一樣(不管元素的排列順序如何),否則就是不相等.
數(shù)組類型
數(shù)組類型是某種數(shù)據(jù)類型的有序組合,其中每一個(gè)元素的值由其相對(duì)位置來指定,可以在數(shù)組的某個(gè)位置上放置數(shù)據(jù),并在需要時(shí)使用這些數(shù)據(jù)。下面代碼聲明了一個(gè) Integer 型的數(shù)組變量:
var ?
TInt:array [1..15] of Integer;
表示 TInt 指向一個(gè)含有 15 個(gè) Integer型元素的數(shù)據(jù)串列,代表每一個(gè)元素的是 1~15 之間的數(shù)字,稱為索引。數(shù)組的每一項(xiàng)由數(shù)據(jù)組名加“[ ]”中的索引來表示。TInt 包含 15 個(gè)變量,TInt[1]代表第 1 個(gè)變量,TInt[2]代表第 2 個(gè)變量,依次類推。
數(shù)組也可以用類型定義:type????Int=array [1..15] of Integer;????var????TInt:Int;
可以用下面的方法對(duì)數(shù)組進(jìn)行賦值: for????I=0 to 15 do????TInt[I]:=0;????//為數(shù)組各元素賦初值為0
數(shù)組可以有多維的,定義及賦值方法如下:
type
? TArr=array [1..15,1..15] of Integer; var
? Arr:TArr;
? C,R:Integer;
??
for
? C:=1 to 15 do
? for R:=1 to 15 do
? Arr[C,R]:=0;????????? //為多維數(shù)組各元素賦初值為0
??
記錄類型:記錄是程序可以成組訪問的一群數(shù)據(jù)的集合。例如下列代碼,說明了一個(gè)記錄類型的定義方法:
type
? TStudent=record
? ID:Integer;
? Name:String[10];
? Age:Integer;
? Memo:String[100];
end;
記錄包含可以保存數(shù)據(jù)的域,每一個(gè)域都有一個(gè)數(shù)據(jù)類型。上面代碼中聲明的 TStuednt
類型有 4 個(gè)域。用下面的方法對(duì)記錄類型的變量進(jìn)行聲明與使用:
var
? Stu:TStudent;
? with Stu do?????? //以下代碼為記錄賦值,也可以只給記錄的單個(gè)域賦值
? begin
??? ID:=1;
? Name:= ’Jim’;
??? Age:=18;
??? Memo:= ’He is a good student.’;
? end;
(4)指針類型(Pointer)
指針是一個(gè)表示內(nèi)存地址的變量。指針類型在任何語言中都比較難理解,也是一種比較靈活的數(shù)據(jù)類型。用以下形式定義指針變量:type????指針類型標(biāo)識(shí)符=^基類型;?
下面列舉一個(gè)對(duì)指針操作的例子,代碼如下:
program Point;???????? //指針示例工程
{$Apptype
? console}
type
? PInt=^Integer;????????????? //定義指針類型 var
? I,K:Integer;
? PI:Pint;?????????????????? //整形指針?
? P:Pointer;???????????????? //無類型指針?
begin
? I:=3;
? K:=5;
? PI:=@K;???????????????? //整形指針指向整形數(shù)據(jù)?
? writeln(’K=’,PI^);
? P:=@I;
? K:=Integer(P^);?????????? //無類型指針指向整形數(shù)據(jù)?
? writeln(’K=’,K);
? PI:=P;?????????????????? //指針之間賦值??
? writeln(’PI^:’,PI^);
? readln;
end.
(5)函數(shù)和過程類型(Procedural)
Delphi 是面向?qū)ο蠛褪录?qū)動(dòng)的,因此以前那種自上而下的結(jié)構(gòu)化設(shè)計(jì)方法已經(jīng)不適合在Delphi 中編程了。函數(shù)和過程是Pascal 語言的兩種子程序,它們可以隨時(shí)被調(diào)用。函數(shù)執(zhí)行時(shí)有返回值,而過程執(zhí)行時(shí),是沒有返回值的。函數(shù)的調(diào)用是為了得到一個(gè)返回值,調(diào)用過程僅僅為了執(zhí)行某種操作。函數(shù)只能出現(xiàn)在表達(dá)式中,不能單獨(dú)使用;過程不能出現(xiàn)在表達(dá)式中,僅能以某個(gè)語句的形式出現(xiàn)。
函數(shù)的使用:函數(shù)在調(diào)用之前必須先聲明。函數(shù)聲明的語法格式如下:
function 函數(shù)名(<形式參數(shù)表>):<類型>;
begin
? <語句>;
? <語句>;
? ...
? <語句>;
end;
函數(shù)調(diào)用的語法格式為:
<函數(shù)名>(<實(shí)參表>);
注意:實(shí)參表中的各個(gè)參數(shù)必須用逗號(hào)分割,其順序必須和函數(shù)說明的順序相對(duì)應(yīng),并且個(gè)數(shù)相同、類型相符。
過程的使用:過程與函數(shù)類似,在調(diào)用之前必須進(jìn)行聲明。過程聲明的語法格式如下:
proceduce
? <過程名>(<形式參數(shù)表>)
begin?
? <語句>
? <語句>
? ...
? <語句>
end;
過程調(diào)用的語法格式為:<過程名>(<實(shí)參表>)
(6)變體類型(Variant)
變體類型能夠在運(yùn)行期間動(dòng)態(tài)地改變類型。變體類型能支持所有簡單的數(shù)據(jù)類型,如整型、浮點(diǎn)型、字符串、布爾型、日期時(shí)間、貨幣及OLE 自動(dòng)化對(duì)象等。
注意:變體類型不能表達(dá)Object Pascal 對(duì)象。
2.Type類型聲明語句
在Object Pascal 中,所有的變量必須是某種特定的數(shù)據(jù)類型,數(shù)據(jù)類型決定了它所能包含的數(shù)值和可進(jìn)行的操作。Object Pascal 提供了豐富的預(yù)定義數(shù)據(jù)類型,更重要的是它允許定義自己的類型,這就要用到類型聲明語句了。類型也有作用域問題,在程序的Type 區(qū)聲明的類型可以在整個(gè)程序中使用。在某個(gè)過程或函數(shù)中聲明的類型則只能在這個(gè)過程或函數(shù)中使用。
類型聲明語句的格式如下:
type 類型標(biāo)識(shí)符=類型描述;
3.定義變量
變量和常量的區(qū)別在于變量在運(yùn)行期間其值是可以改變的。變量必須明確地指定一個(gè)數(shù)據(jù)類型,而常量是通過等號(hào)右邊的數(shù)值隱含確定的。
變量的類型可以是標(biāo)準(zhǔn)的類型,也可以是自己定義的類型,其語法如下:
var?????變量標(biāo)識(shí)符:類型;
4.定義常量
常量的特點(diǎn)是在它運(yùn)行期間不能被修改,因此對(duì)常量的賦值是非法的。Object Pascal 提供了幾個(gè)預(yù)定義的常量,如 True 和 False 等,當(dāng)然也可以聲明自己的常量,其語法如下:
Const 常量標(biāo)識(shí)符=常數(shù);
Object Pascal 的運(yùn)算符
1.算術(shù)運(yùn)算符:
操作符 ?操作 操作數(shù)據(jù)類型 結(jié)果類型
+???? 加 ?????整型、實(shí)型 ????????整型、實(shí)型
-? ? ? 減 ?????整型、實(shí)型 ????????整型、實(shí)型
*? ? ? 乘 ?????整型、實(shí)型 ????????整型、實(shí)型
/? ? ? ?除? ? ?整型、實(shí)型 ????????整型、實(shí)型
mod 取余 ?????整型 ????????????????????整型
div? ? 整除? ? ?整型? ? ? ? ? ? ? ? ? ? ?整型
2.邏輯運(yùn)算符;邏輯運(yùn)算符操作對(duì)象和返回值都為布爾型,
not ????????非? ? ? ? ? 布爾
and? ? ? ? 與? ? ? ? ? 布爾
or? ? ? ? ? ?或? ? ? ? ? 布爾
xor ????????異或? ? ? ?布爾
3.比較運(yùn)算符;比較運(yùn)算符返回值為布爾型(True 或 False),
=? ? ? ? ? 等于 ????????????????????????簡單數(shù)據(jù)類型、指針、集合、字符串或字符串包
<> ????????不等于 ????????????????????簡單數(shù)據(jù)類型、指針、集合、字符串或字符串包
<? ? ? ? ? 小于???????????????????????? 簡單數(shù)據(jù)類型、指針、集合、字符串或 PChar
>? ? ? ? ? 大于???????????????????????? 簡單數(shù)據(jù)類型、指針、集合、字符串或 PChar
<= ????????小于等于???????????????? 簡單數(shù)據(jù)類型、指針、集合、字符串或 PChar
>= ????????大于等于 ????????????????簡單數(shù)據(jù)類型、指針、集合、字符串或 PChar
<= ????????子集 ????????????????????????集合
>= ????????父集 ????????????????????????集合
4.按位運(yùn)算符
通過按位運(yùn)算符可以修改一個(gè)變量的單獨(dú)的位。可以進(jìn)行按位與、或、非、異或,也可以對(duì)一個(gè)數(shù)進(jìn)行向左(Shl)或向右(Shr)移位操作。
5.運(yùn)算符優(yōu)先級(jí)
一個(gè)表達(dá)式中可能有多個(gè)運(yùn)算符,它們的運(yùn)算是有先后順序的,不同的運(yùn)算符在表達(dá)式中的優(yōu)先級(jí)如表4-12 所示。
() 括號(hào)
+,- 正號(hào)和負(fù)號(hào)
^ 乘方
*,/ 乘和除
+,- 加和減,字符串連接
=,>,<,<=,>=,<> 關(guān)系運(yùn)算符
not 邏輯非
and 邏輯與
or 邏輯或
語句
1.常量聲明語句;常量在聲明時(shí)就被賦予了一個(gè)值,在程序執(zhí)行過程中是不可改變的。像變量一樣,常量也有類型。
2.賦值語句—— “=”
3.Goto 語句;Goto 語句可以從程序中的一個(gè)地方直接跳轉(zhuǎn)到另一個(gè)地方。但是從結(jié)構(gòu)化程序設(shè)計(jì)的角度來考慮,盡量不要使用 Goto語句。
goto label;//在使用Goto 語句之前,首先要聲明標(biāo)號(hào)。標(biāo)號(hào)聲明語句如下:
label label1,label2,??,labeln;
4.復(fù)合語句;首尾使用 Begin 和 End 包括起來的一組語句稱為復(fù)合語句。復(fù)合語句可以嵌套使用,也允許有空的復(fù)合語句。
5.If 語句
if? <條件> then
? <語句>
else
? <語句>;
If...Then 語句被認(rèn)為是單語句,在語句結(jié)束時(shí)只有一個(gè)分號(hào)
6.Case 語句;If...Then?Else 語句適合選項(xiàng)較少的情況,如果有很多選項(xiàng)的話利用 If 語句就比較麻煩,在這種情況下,Case 語句就容易多了。Case 語句的語法如下:
case <表達(dá)式> of
? <數(shù)值>:<語句>;
? <數(shù)值>:<語句>;
else
? <語句>;
end;
注意:Case 構(gòu)造中的任何一個(gè)語句都可以是單語句或復(fù)合語句。如果需要在某種情況下執(zhí)行多行代碼,必須將它們用Begin?End 括起來。
7.Repeat語句;Repeat 語句會(huì)重復(fù)執(zhí)行一行或多行語句,直到某一狀態(tài)為真。語句以 Repeat 開始,以 Until 結(jié)束,其后跟隨被判斷的布爾表達(dá)式。例如:
? I:=0;?? repeat
??? I:=I+1;
??? Writeln(IntToStr(I));
? until I>5;
執(zhí)行以上的例子時(shí),會(huì)顯示1~6 的數(shù)字。布爾表達(dá)式I>5直到Repeat?Until 程序段結(jié)束才會(huì)被計(jì)算,也就是Repeat 語句至少要執(zhí)行一次。
8.While語句;While 語句和 Repeat 語句的不同之處在于 While 語句的布爾表達(dá)式在循環(huán)的開始進(jìn)行判斷。如果表達(dá)式的結(jié)果為真則執(zhí)行循環(huán),否則退出循環(huán)。
9.For 語句;For 語句內(nèi)的程序代碼會(huì)執(zhí)行一定的次數(shù)。它需要一個(gè)循環(huán)變量來控制循環(huán)次數(shù)。循環(huán)變量的類型可以是整型、布爾型、字符型、枚舉型或子界型。
10.Break 語句;在各循環(huán)中調(diào)用 Break,可以使得程序的執(zhí)行流程立即跳到循環(huán)的結(jié)尾。例如程序執(zhí)行 5 次后跳出循環(huán).
11.Continue 語句;如果想跳過循環(huán)中部分代碼,并開始下一次循環(huán),可以調(diào)用Continue語句。下面的例子在執(zhí)行第3 次循環(huán)時(shí),Continue 后的代碼不執(zhí)行而繼續(xù)下一次的循環(huán)
12.With 語句;使用記錄類型的變量時(shí),可以通過 With 語句指定一些語句,這些都是針對(duì)某一個(gè)變量來說的,這樣可以簡化代碼的輸入量。
? 過程與函數(shù)
過程與函數(shù)是實(shí)現(xiàn)一定功能的語句塊,是程序中的特定功能單元。可以在程序的其他地方被調(diào)用,也可以進(jìn)行遞歸調(diào)用。過程與函數(shù)的區(qū)別在于過程沒有返回值,而函數(shù)有返回值。
1.過程與函數(shù)的定義;過程與函數(shù)的定義包括過程原型或函數(shù)原型、過程體或函數(shù)體的定義。過程定義的形式如下:
procedure? ProcedureName(ParameterList); directives;
var
? LocalDeclarations;
begin
? statements
end;
ProcedureName 是過程名,是有效的標(biāo)識(shí)符。ParameterList為過程的參數(shù)列表,需要指明參數(shù)的個(gè) 數(shù) 和 數(shù) 據(jù) 類 型 。Directives 是一 些 關(guān) 于 函 數(shù) 的 指 令 字 , 如 果 設(shè) 置 多 個(gè) , 應(yīng) 該 用 分 號(hào) 隔 開 。LocalDeclarations 中定義了該函數(shù)中需要使用的一些臨時(shí)變量,通常也稱作本地變量。在Begin與End 之間是過程調(diào)用時(shí)實(shí)現(xiàn)特定功能的一系列語句。ParameterList、Directives、LocalDeclarations和Statements 都是可選部分。
函數(shù)的定義與過程非常類似,只是使用的保留字不同,而且多了一個(gè)返回值類型。具體形式如下:
function? FunctionName(ParameterList): ReturnType; directives;
var
? LocalDeclarations;
begin
?statements
end;
可以將函數(shù)需要返回的數(shù)值賦值給變量 Result。如果函數(shù)體中存在著一些由于判斷而產(chǎn)生的分支語句時(shí),就要在每一個(gè)分支中設(shè)置返回值。通常要根據(jù)函數(shù)的返回值來確定下一步的操作。注意,這里與Visual C 和 Visual C++不一樣,把一個(gè)值賦給 Result,函數(shù)并不會(huì)結(jié)束。
2.參數(shù)
函數(shù)定義時(shí)參數(shù)列表中的參數(shù)稱為形參,函數(shù)調(diào)用時(shí)參數(shù)列表中的參數(shù)稱為實(shí)參。在定義的函數(shù)原型中,多個(gè)參數(shù)之間用分號(hào)隔開,同一類型的參數(shù)可以放在一起,以逗號(hào)隔開。函數(shù)調(diào)用的時(shí)候,在函數(shù)原型中,多個(gè)參數(shù)之間用逗號(hào)隔開。
一般來說,形參列表和實(shí)參列表完全匹配是指參數(shù)的個(gè)數(shù)一樣,而且順序排列的數(shù)據(jù)類型也完全一致。對(duì)于普通的函數(shù),如果編譯器發(fā)現(xiàn)實(shí)參的數(shù)據(jù)類型與形參的數(shù)據(jù)類型不匹配,會(huì)將實(shí)參的數(shù)據(jù)類型進(jìn)行一次或多次的“提升”,比如把Integer類型轉(zhuǎn)換為Double 類型。可以為過程和函數(shù)的參數(shù)指定默認(rèn)數(shù)值。
指定默認(rèn)數(shù)值的參數(shù)要放在參數(shù)列表的后部,而沒有指定默認(rèn)數(shù)值的參數(shù)要放在參數(shù)列表的前部。在函數(shù)調(diào)用的時(shí)候,可以為設(shè)置了默認(rèn)值的參數(shù)指定一個(gè)新值。在函數(shù)體中,各語句使用的是指定的新值,如果沒有指定新值,則使用默認(rèn)值。同樣,如果存在多個(gè)設(shè)置了默認(rèn)值的參數(shù),只有在前面的參數(shù)指定了新值后,后面的參數(shù)才可以指定新值。
下面的例子定義了一個(gè) OutputNum 函數(shù),可以將一個(gè)浮點(diǎn)數(shù)按指定的精度輸出。通過這個(gè)例子,可以體會(huì)函數(shù)中參數(shù)的使用:
program Project1;
{$APPTYPE
? CONSOLE}
uses? Sysutils;???????????????????????? //為了使用函數(shù)Format
function
? OutputNum(number:double;n:integer = 5):Boolean; var
? Str : string; //浮點(diǎn)數(shù)顯示輸出的內(nèi)容?
begin
? if n <= -1 then?????????????????????? //小數(shù)點(diǎn)后的位數(shù)要大于或等于0
? begin
??? Result:=False;
? Exit;????????????????????????????
? //退出顯示函數(shù)??
? end
? else
? begin
??? //設(shè)置顯示的格式
??? Str := Format(’%*.*f’, [10, n, number]);
??? Result := True ;
??? Writeln(Str);??????????????????????? //顯示數(shù)據(jù)?
? end;
end;
begin
? OutputNum(12.345);??????????????????? //n默認(rèn)為5
? OutputNum(123,3);???????????????????? //參數(shù)對(duì)數(shù)據(jù)類型進(jìn)行升級(jí)?
? //下面一句代碼不正確,故屏蔽掉?
? //OutputNum(123.456789,9.13);?????????? //參數(shù)對(duì)數(shù)據(jù)類型不能降級(jí)?
? //可以根據(jù)函數(shù)的返回值確定下一步的操作
? if OutputNum(123.456789,-3) = False then
? Writeln( ’輸出失敗。’ ) ;
? Readln;
end.
3.過程與函數(shù)的調(diào)用約定
在調(diào)用過程或函數(shù)的時(shí)候,如果參數(shù)列表中具有多個(gè)參數(shù),那么參數(shù)傳遞給過程或函數(shù)的順序會(huì)對(duì)結(jié)果產(chǎn)生一定的影響。對(duì)于不同的語言,參數(shù)傳遞的順序是不同的:Pascal 語言是按照從左向右的順序進(jìn)行傳遞的,而C語言是按照從右向左的順序來傳遞的。為了確定傳遞的順序,可以在過程或函數(shù)定義的時(shí)候,在Directives部分利用指令字指定傳遞的順序。
4.過程和函數(shù)的重載
可以在同一個(gè)作用范圍內(nèi)給不同的過程或函數(shù)取同一個(gè)名稱,這種現(xiàn)象就叫做重載。這樣可以使編程更方便。在重載的情況下,決定使用哪個(gè)過程或函數(shù)的依據(jù)是形參和實(shí)參的一致性,即參數(shù)個(gè)數(shù)、參數(shù)類型以及它們之間的順序,不存在一個(gè)函數(shù)調(diào)用滿足兩個(gè)重載函數(shù)的情況。另外重載函數(shù)必須用指令字Overload 來進(jìn)行說明,函數(shù)的返回值類型不同就不可以作為重載函數(shù)的依據(jù)。下面的兩個(gè)函數(shù)就是重載函數(shù):
function Average(a:Integer; b:Integer):Double;overload;??????? //求整形數(shù)據(jù)的平均值
function? Average(a:Double; b:Double):Double;overload;??????? //求實(shí)數(shù)數(shù)據(jù)的平均值?
5.函數(shù)的遞歸調(diào)用
在 Object Pascal 中,過程或函數(shù)必須先說明再調(diào)用。以上規(guī)則在遞歸調(diào)用時(shí)屬于例外情況。所謂遞歸調(diào)用,是指函數(shù) A 調(diào)用函數(shù) B,而函數(shù) B 又調(diào)用函數(shù) A 的情況,或是指一個(gè)函數(shù)調(diào)用自身的特殊情況。在遞歸調(diào)用中,函數(shù)要進(jìn)行前置,即在函數(shù)或過程的標(biāo)題部分最后加上保留字Forward。
program? Project1;
{$APPTYPE CONSOLE}
var
? Alpha:Integer;
? procedure Test2(var A:Integer);forward;
? //Test2被說明為前置過程
procedure
? Test1(var A:Integer);
begin
? A:=A-1;
? if A>0 then
??? Test2(A);?????????????? //經(jīng)前置說明,調(diào)用未執(zhí)行的過程Test2
procedure? Test2(var A:Integer); //經(jīng)前置說明的Test2 的執(zhí)行部分?
begin
? A:=A div 2;
? if A>0 then
? Test1(A);?????????????? //在Test2 中調(diào)用已執(zhí)行的過程Test1 end;
begin
? Alpha := 15;????????????? //給Alpha
? 賦初值
? Test1(Alpha);???????????? //第1
? 次調(diào)用Test1,遞歸開始?
end.