Delphi 是以 Object Pascal 語言為基礎(chǔ)的可視化開發(fā)工具煤蹭,雖然兩者之間有著很大區(qū)別,但是要學(xué)好 Delphi肴熏,首先要掌握的就是 Object Pascal 語言鬼雀。
?Object Pascal語言編寫環(huán)境
如何使用Delphi編寫Object Pascal 程序。一般來說蛙吏,使用 Delphi 開發(fā)出來的程序有以下 3 種源哩。
1.圖形界面程序
圖形界面程序是目前Windows 平臺最常見的應(yīng)用程序,這些程序通過窗體和對話框與用戶進(jìn)行信息交互鸦做,實現(xiàn)一定的功能励烦。例如Microsoft 公司的Office 系列軟件和正在使用的Delphi 等,它們都是圖形界面程序泼诱。
2.控制臺程序
控制臺程序是指一些沒有圖形用戶界面的32 位Windows應(yīng)用程序坛掠,類似在DOS 環(huán)境下運(yùn)行的程序。這些程序很少要求用戶輸入大量的信息坷檩,一般只實現(xiàn)特定的功能却音。控制臺程序的代碼較小矢炼,占用的系統(tǒng)資源少系瓢,因此編譯、鏈接的速度比較快句灌。
3.服務(wù)器程序
服務(wù)器程序可以接受和處理客戶應(yīng)用程序的請求夷陋,并將結(jié)果信息返回給客戶應(yīng)用程序欠拾。服務(wù)器應(yīng)用程序一般在后臺運(yùn)行,不需要大量的人機(jī)交互信息骗绕。
下面以開發(fā)一個簡單的控制臺程序為例藐窄,向讀者介紹Delphi 中生成Object Pascal 程序的基本方法,并對Object Pascal 程序的一般結(jié)構(gòu)進(jìn)行簡單說明酬土。
在Delphi集成開發(fā)環(huán)境中,依次選擇“File”? “New”?“Other”菜單項打開“New Items”對話框刹枉。選中“New”標(biāo)簽頁中的“Console Application”選項屈呕,單擊“OK”按鈕微宝,代碼編輯器中將自動打開一個初始名為Project1.dpr的控制臺程序虎眨。請將Project1.dpr 文件修改為如下內(nèi)容:
program
? Project1;
{$APPTYPE
? CONSOLE}
//uses
? SysUtils;
var
? str:string;
begin
? // Insert user code here
? writeln(’您好,這是一個示范程序嗽桩,請輸入一行文字:’);
? readln(str);
? writeln(’您輸入的是:’,str);
? readln;
end.
依次選擇“File”? “Save
All”菜單項可以將更改后的工程文件保存到指定的文件夾中岳守。本章后面的例子都可以在該工程的基礎(chǔ)上方便地實現(xiàn)棺耍。
按F9鍵進(jìn)入編譯种樱、鏈接嫩挤、運(yùn)行程序消恍。待程序提示“您好狠怨,這是一個示范程序佣赖,請輸入一行文字:” 文字后,用戶可以輸入一些內(nèi)容外傅,例如輸入“早上好萎胰!”技竟,程序?qū)⑤敵鼋Y(jié)果:“您輸入的是:早上好!”嚼沿。
以下是對該程序的幾點說明:
[if !supportLists]?????????[endif]程序第2 行中{$APPTYPE
CONSOLE}是一個編譯器指令骡尽,它告訴編譯器這個程序是一個控制臺程序擅编。
[if !supportLists]?????????[endif]uses SysUtils 語句前加了兩個斜線爱态,將這條語句以注釋語句的形式屏蔽掉了锦担,因為在這個例子中是不需要SysUtils 單元的洞渔。
[if !supportLists]?????????[endif]writeln 和readln兩個函數(shù)分別表示輸出和輸入一行字符。程序最后的readln 語句是為了鎖定窗口堤瘤,否則輸出結(jié)果將很快消失本辐。
注釋語句
作為起點慎皱,首先介紹如何在Object Pascal 代碼中添加注釋茫多。如果不給程序加上適當(dāng)?shù)淖⑨尩乩妫欢螘r間后就很難理清程序的流程。同時編譯器會將注解忽略洁闰,不會影響程序的編譯與運(yùn)行扑眉。
Object Pascal 中有3 種類型的注釋腰素。
花括號注釋:組合符號“{”和“}”的成對使用弓千⊙蠓茫——{……}
圓括號/星號注釋:組合符號“(*”和“*)”的成對使用谴餐∑裆ぃ——(*……*)
Visual C++風(fēng)格的雙斜杠注釋:符號“//”的單獨(dú)使用厌殉∧暾恚——//……
注意熏兄,相同類型的注釋不要嵌套使用摩桶。雖然不同類型的注釋進(jìn)行嵌套在語法上是合法的帽揪,但不建議這樣做转晰。
標(biāo)識符
Object Pascal 語言使用的標(biāo)識符包括字母 A~Z、a~z酵幕、數(shù)字 0~9 及其他一些標(biāo)準(zhǔn)字符芳撒。
?Object Pascal 語言的特殊符號
$ & * # ? ( ) [ ] { } ^ ; : @ < = > , . ? + /? ? ?
?Object Pascal 語言的單個的特殊符號
(* *) (. .) .. // := <> >= <=? ?
在 Object Pascal 語言中笔刹,標(biāo)識符用來標(biāo)識變量舌菜、常量日月、屬性山孔、類台颠、對象串前、過程实蔽、函數(shù)局装、程序铐尚、組件庫等宣增。標(biāo)識符可以由任意長度不帶空格的字符串組成爹脾,但對于編譯器來講只有前面
255 個字符有效。其中落竹,標(biāo)識符的第 1 個字符必須是字母或下劃線筋量,其余字符可以是字母桨武、數(shù)字或下劃線呀酸。通常性誉,標(biāo)識符由一個或多個具有適當(dāng)意義的英文單詞組成错览。Object Pascal 語言對區(qū)分字母的大小寫是不敏感的倾哺。
?保留字和指令字
Object Pascal 還定義了 39 個指令字羞海,它們具有特殊含義却邓。但是腊徙,在用戶重新定義了指令字后昧穿,在作用域內(nèi)它們就失去了原來的意義。
其中Private厅瞎、Protected和簸、Public锁保、Published爽柒、Automated浩村、On 和At是指令字心墅,但是怎燥,應(yīng)當(dāng)視其為保留字铐姚,不要定義和它們同名的標(biāo)識符驳糯。
在 Delphi 集成開發(fā)環(huán)境的代碼編輯器中氢橙,保留字和指令字以黑體顯示帘睦,這樣就大大方便了用戶的使用竣付,不必?fù)?dān)心因為不小心而錯誤地將保留字或指令字定義為標(biāo)識符古胆。
?數(shù)據(jù)類型與定義變量
傳遞給過程或函數(shù)的參數(shù)值必須與形參的類型一致逸绎。變量是程序代碼中代表一個內(nèi)存地址的標(biāo)識符棺牧,那么該地址的內(nèi)存內(nèi)容就可以在程序代碼執(zhí)行時被改變颊乘。每個變量都有一個名字和數(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ù)類型(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個 Unicode 字符同 ANSI 字符相同
Char? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Delpi 中通用的字符類型康愤,相當(dāng)于WideChar
注意:因為一個字符在長度上并不表示一個字節(jié),如果程序中必須用到字符的字節(jié)數(shù)检激,最好用 SizeOf()函數(shù)獲取叔收。
③布爾類型
布爾類型包括4種饺律,分別為Boolean蓝晒、ByteBool芝薇、WordBool 和LongBool洛二。Boolean和ByteBool 各占用一個字節(jié)晾嘶,WordBool 占用兩個字節(jié)垒迂,LongBool 占用4 個字節(jié)机断。
Boolean的值只能是0(False)或1(True)欢揖,ByteBool她混、WordBool 和LongBool 可以是有符號的整數(shù)坤按,為0 值代表False晋涣,非0值代表True。
最常用的是Boolean 類型佃扼,而ByteBool兼耀、WordBool 和LongBool 類型是為了與其他語言和Windows 環(huán)境兼容瘤运,因為Windows 的API 在返回一個布爾值時,其值可能是一個兩字節(jié)的有符號整數(shù)郁季。如果試圖把返回值賦給Boolean 類型的數(shù)據(jù)梦裂,編譯器認(rèn)為類型不匹配年柠,若是進(jìn)行類型強(qiáng)制轉(zhuǎn)換毅往,可能使返回值的有效數(shù)據(jù)被截斷。
④枚舉類型
枚舉類型是由一組有序的標(biāo)識符組成的渴丸,它列出了所有這種類型可以包括的值谱轨。例如一個星期有7 天,程序中分別用 0吠谢、1土童、2、3工坊、4献汗、5、6 來表示一個星期的每一天罢吃,但在程序中很不直觀。
type?//變量名=(枚舉列表)
? DayOfWeek=(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday);
為了引用此枚舉類型昭齐,必須聲明一個DayOfWeek 類型的變量尿招,例如:
var
Days:DayOfWeek;
這樣就聲明了一個DayOfWeek類型的枚舉變量Days,Days 的值總是標(biāo)識符列表中的一個阱驾。
為了簡化程序就谜,還可以將類型聲明和變量聲明合二為一,例如:
var
? Days:(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday);
注意:枚舉的元素只能是標(biāo)識符里覆,標(biāo)識符的命名規(guī)則必須符合Object Pascal 關(guān)于標(biāo)識符的規(guī)定丧荐。例如不能以數(shù)字打頭,標(biāo)識符不能是保留字租谈,同一個枚舉元素不能同時出現(xiàn)在多個枚舉中篮奄。
⑤子界類型
子界類型是下列類型中某范圍內(nèi)的值捆愁,即整型、布爾型窟却、字符型或枚舉型昼丑。如果需要限制一個變量的取值范圍時,子界類型是一個好的選擇夸赫。
⑥實型
實型不是有序類型菩帝,因為它的值域是無限的,實型的數(shù)據(jù)也叫實數(shù)茬腿,實型用于表示通常所說的浮點數(shù)呼奢。Object Pascal 語言中的實數(shù)數(shù)據(jù)(Real)類型
Real48? ? Single????Double????Extended????Comp????Currency????Real。
常用的實數(shù)類型是 Real切平、Single仗扬、Double述暂。
(2)字符串類型(String)
Object Pascal 的字符串類型分為短字符串和長字符串兩種。
短字符串,指字符串長度最大不超過 255 個字符的字符序列舱馅。當(dāng)編譯開關(guān)的狀態(tài)為{$H-}時笑陈,用保留字 String 聲明的是一個短字符串役纹,不管編譯開關(guān)$H 處于什么狀態(tài)下蟀瞧,用 ShortString聲明的變量總是短字符串類型。保留字String 后用方括號括起來的無符號整數(shù)届氢,表示字符串的最大長度是200欠窒。當(dāng)把一個字符串賦給一個短字符類型的變量時,超過其最大長度的將被截掉退子。短字符串中的每一個字符都可以通過字符串名加字符索引來訪問岖妄。索引是從0 開始的,但索引 0 處存放的是字符串的實際長度絮供,如下兩行代碼的功能是一樣的衣吠,索引1 處才是真正的字符開始處。短字符串的長度是動態(tài)改變的壤靶,可以使用Low和High 函數(shù)取得字符串的最小序號和最大序號缚俏,Low 的返回值是0,High 的返回值是所聲明的字符串的最大長度贮乳。
長字符串的長度幾乎是無限制的忧换,理論上可以達(dá)到2GB,實際上只會受計算機(jī)內(nèi)存的限制向拆。要聲明一個長字符串亚茬,可以用預(yù)定義的標(biāo)識符AnsiString 或把編譯開關(guān)$H 改為{$H+}后用保留字String 聲明。長字符串在聲明以后自動被初始化為空字符串浓恳。長字符串中的每個字符刹缝,是從索引1 開始的碗暗,長字符串沒有索引0,要取得長字符串的實際長度梢夯,只能調(diào)用Length()函數(shù)言疗。長字符串在它最后一個字符后自動加一個NULL 字符表示字符串結(jié)束(NULL 字符并不是長字符串的一部分),這一點與字符指針類型(PChar)類似颂砸,因此將一個長字符串轉(zhuǎn)換為PChar類型很方便噪奄,語法為:PChar(Str),其中Str 代表長字符串人乓。長字符串被轉(zhuǎn)換為一個指針勤篮,指向字符串的每一個字符,即使長字符串是空的色罚,強(qiáng)制轉(zhuǎn)換后總是能夠獲得一個指向以NULL 字符結(jié)束的字符中的指針碰缔。Object Pascal 允許字符串和長字符串同時出現(xiàn)在一個表達(dá)式中,編譯器會自動根據(jù)需要進(jìn)行轉(zhuǎn)換戳护。
注意:字符串變量必須用一對單引號括起來手负,如果字符串本身就有單引號,這個單引號要用兩個連續(xù)的單引號表示姑尺,如:’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 語言提供了幾個用于集合的運(yùn)算符拣凹,用這些運(yùn)行符可以判斷集合與集合之間的關(guān)系森爽,例如對集合增刪元素,求交集運(yùn)算等嚣镜。賦值運(yùn)算與簡單類型一樣爬迟,聲明了一個集合類型的變量后,要為這個變量設(shè)定一個明確的值菊匿,例如:
var ?
TInt1,Tint2:set of 1..10;
以上代碼雖然聲明了兩個集合變量付呕,但變量 TInt1 和 TInt2并不是代表 1~10 組成的集合计福,必須對它們賦值:
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)算,就是對集合類型的運(yùn)算悉罕,遵循數(shù)學(xué)中關(guān)于集合運(yùn)算的規(guī)則赤屋,運(yùn)算的結(jié)果是布爾值。集合的關(guān)系運(yùn)算就是判斷兩個集合相互之間的關(guān)系壁袄,關(guān)系運(yùn)算符包括:=(等于)类早、<>(不等于)、>=(大于等于)嗜逻、<=(小于等于)涩僻。
集合 A 等于集合 B,是指兩個集合中的元素完全一樣(不管元素的排列順序如何)栈顷,否則就是不相等.
數(shù)組類型
數(shù)組類型是某種數(shù)據(jù)類型的有序組合逆日,其中每一個元素的值由其相對位置來指定,可以在數(shù)組的某個位置上放置數(shù)據(jù)萄凤,并在需要時使用這些數(shù)據(jù)室抽。下面代碼聲明了一個 Integer 型的數(shù)組變量:
var ?
TInt:array [1..15] of Integer;
表示 TInt 指向一個含有 15 個 Integer型元素的數(shù)據(jù)串列,代表每一個元素的是 1~15 之間的數(shù)字靡努,稱為索引坪圾。數(shù)組的每一項由數(shù)據(jù)組名加“[ ]”中的索引來表示。TInt 包含 15 個變量颤难,TInt[1]代表第 1 個變量神年,TInt[2]代表第 2 個變量,依次類推行嗤。
數(shù)組也可以用類型定義:type????Int=array [1..15] of Integer;????var????TInt:Int;
可以用下面的方法對數(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ù)的集合。例如下列代碼栅屏,說明了一個記錄類型的定義方法:
type
? TStudent=record
? ID:Integer;
? Name:String[10];
? Age:Integer;
? Memo:String[100];
end;
記錄包含可以保存數(shù)據(jù)的域飘千,每一個域都有一個數(shù)據(jù)類型堂鲜。上面代碼中聲明的 TStuednt
類型有 4 個域。用下面的方法對記錄類型的變量進(jìn)行聲明與使用:
var
? Stu:TStudent;
? with Stu do?????? //以下代碼為記錄賦值护奈,也可以只給記錄的單個域賦值
? begin
??? ID:=1;
? Name:= ’Jim’;
??? Age:=18;
??? Memo:= ’He is a good student.’;
? end;
(4)指針類型(Pointer)
指針是一個表示內(nèi)存地址的變量缔莲。指針類型在任何語言中都比較難理解,也是一種比較靈活的數(shù)據(jù)類型霉旗。用以下形式定義指針變量:type????指針類型標(biāo)識符=^基類型痴奏;?
下面列舉一個對指針操作的例子,代碼如下:
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ū)動的厌秒,因此以前那種自上而下的結(jié)構(gòu)化設(shè)計方法已經(jīng)不適合在Delphi 中編程了读拆。函數(shù)和過程是Pascal 語言的兩種子程序,它們可以隨時被調(diào)用鸵闪。函數(shù)執(zhí)行時有返回值檐晕,而過程執(zhí)行時,是沒有返回值的蚌讼。函數(shù)的調(diào)用是為了得到一個返回值辟灰,調(diào)用過程僅僅為了執(zhí)行某種操作。函數(shù)只能出現(xiàn)在表達(dá)式中篡石,不能單獨(dú)使用芥喇;過程不能出現(xiàn)在表達(dá)式中,僅能以某個語句的形式出現(xiàn)凰萨。
函數(shù)的使用:函數(shù)在調(diào)用之前必須先聲明乃坤。函數(shù)聲明的語法格式如下:
function 函數(shù)名(<形式參數(shù)表>):<類型>;
begin
? <語句>;
? <語句>;
? ...
? <語句>;
end;
函數(shù)調(diào)用的語法格式為:
<函數(shù)名>(<實參表>);
注意:實參表中的各個參數(shù)必須用逗號分割,其順序必須和函數(shù)說明的順序相對應(yīng)沟蔑,并且個數(shù)相同、類型相符狱杰。
過程的使用:過程與函數(shù)類似瘦材,在調(diào)用之前必須進(jìn)行聲明。過程聲明的語法格式如下:
proceduce
? <過程名>(<形式參數(shù)表>)
begin?
? <語句>
? <語句>
? ...
? <語句>
end;
過程調(diào)用的語法格式為:<過程名>(<實參表>)
(6)變體類型(Variant)
變體類型能夠在運(yùn)行期間動態(tài)地改變類型仿畸。變體類型能支持所有簡單的數(shù)據(jù)類型食棕,如整型、浮點型错沽、字符串簿晓、布爾型、日期時間千埃、貨幣及OLE 自動化對象等憔儿。
注意:變體類型不能表達(dá)Object Pascal 對象。
2.Type類型聲明語句
在Object Pascal 中放可,所有的變量必須是某種特定的數(shù)據(jù)類型谒臼,數(shù)據(jù)類型決定了它所能包含的數(shù)值和可進(jìn)行的操作朝刊。Object Pascal 提供了豐富的預(yù)定義數(shù)據(jù)類型,更重要的是它允許定義自己的類型蜈缤,這就要用到類型聲明語句了拾氓。類型也有作用域問題,在程序的Type 區(qū)聲明的類型可以在整個程序中使用底哥。在某個過程或函數(shù)中聲明的類型則只能在這個過程或函數(shù)中使用咙鞍。
類型聲明語句的格式如下:
type 類型標(biāo)識符=類型描述;
3.定義變量
變量和常量的區(qū)別在于變量在運(yùn)行期間其值是可以改變的。變量必須明確地指定一個數(shù)據(jù)類型趾徽,而常量是通過等號右邊的數(shù)值隱含確定的续滋。
變量的類型可以是標(biāo)準(zhǔn)的類型,也可以是自己定義的類型附较,其語法如下:
var?????變量標(biāo)識符:類型;
4.定義常量
常量的特點是在它運(yùn)行期間不能被修改吃粒,因此對常量的賦值是非法的。Object Pascal 提供了幾個預(yù)定義的常量拒课,如 True 和 False 等徐勃,當(dāng)然也可以聲明自己的常量,其語法如下:
Const 常量標(biāo)識符=常數(shù);
Object Pascal 的運(yùn)算符
1.算術(shù)運(yùn)算符:
操作符 ?操作 操作數(shù)據(jù)類型 結(jié)果類型
+???? 加 ?????整型早像、實型 ????????整型僻肖、實型
-? ? ? 減 ?????整型、實型 ????????整型卢鹦、實型
*? ? ? 乘 ?????整型臀脏、實型 ????????整型、實型
/? ? ? ?除? ? ?整型冀自、實型 ????????整型揉稚、實型
mod 取余 ?????整型 ????????????????????整型
div? ? 整除? ? ?整型? ? ? ? ? ? ? ? ? ? ?整型
2.邏輯運(yùn)算符;邏輯運(yùn)算符操作對象和返回值都為布爾型熬粗,
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)算符可以修改一個變量的單獨(dú)的位」菽桑可以進(jìn)行按位與诗良、或、非鲁驶、異或鉴裹,也可以對一個數(shù)進(jìn)行向左(Shl)或向右(Shr)移位操作。
5.運(yùn)算符優(yōu)先級
一個表達(dá)式中可能有多個運(yùn)算符钥弯,它們的運(yùn)算是有先后順序的径荔,不同的運(yùn)算符在表達(dá)式中的優(yōu)先級如表4-12 所示。
() 括號
+,- 正號和負(fù)號
^ 乘方
*,/ 乘和除
+,- 加和減脆霎,字符串連接
=,>,<,<=,>=,<> 關(guān)系運(yùn)算符
not 邏輯非
and 邏輯與
or 邏輯或
語句
1.常量聲明語句总处;常量在聲明時就被賦予了一個值,在程序執(zhí)行過程中是不可改變的睛蛛。像變量一樣鹦马,常量也有類型。
2.賦值語句—— “=”
3.Goto 語句忆肾;Goto 語句可以從程序中的一個地方直接跳轉(zhuǎn)到另一個地方荸频。但是從結(jié)構(gòu)化程序設(shè)計的角度來考慮,盡量不要使用 Goto語句客冈。
goto label;//在使用Goto 語句之前试溯,首先要聲明標(biāo)號。標(biāo)號聲明語句如下:
label label1,label2,??,labeln;
4.復(fù)合語句;首尾使用 Begin 和 End 包括起來的一組語句稱為復(fù)合語句郊酒。復(fù)合語句可以嵌套使用,也允許有空的復(fù)合語句键袱。
5.If 語句
if? <條件> then
? <語句>
else
? <語句>;
If...Then 語句被認(rèn)為是單語句燎窘,在語句結(jié)束時只有一個分號
6.Case 語句;If...Then?Else 語句適合選項較少的情況,如果有很多選項的話利用 If 語句就比較麻煩蹄咖,在這種情況下褐健,Case 語句就容易多了。Case 語句的語法如下:
case <表達(dá)式> of
? <數(shù)值>:<語句>;
? <數(shù)值>:<語句>;
else
? <語句>;
end;
注意:Case 構(gòu)造中的任何一個語句都可以是單語句或復(fù)合語句。如果需要在某種情況下執(zhí)行多行代碼蚜迅,必須將它們用Begin?End 括起來舵匾。
7.Repeat語句;Repeat 語句會重復(fù)執(zhí)行一行或多行語句,直到某一狀態(tài)為真谁不。語句以 Repeat 開始坐梯,以 Until 結(jié)束,其后跟隨被判斷的布爾表達(dá)式刹帕。例如:
? I:=0;?? repeat
??? I:=I+1;
??? Writeln(IntToStr(I));
? until I>5;
執(zhí)行以上的例子時吵血,會顯示1~6 的數(shù)字。布爾表達(dá)式I>5直到Repeat?Until 程序段結(jié)束才會被計算偷溺,也就是Repeat 語句至少要執(zhí)行一次蹋辅。
8.While語句;While 語句和 Repeat 語句的不同之處在于 While 語句的布爾表達(dá)式在循環(huán)的開始進(jìn)行判斷。如果表達(dá)式的結(jié)果為真則執(zhí)行循環(huán)挫掏,否則退出循環(huán)侦另。
9.For 語句;For 語句內(nèi)的程序代碼會執(zhí)行一定的次數(shù)。它需要一個循環(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)時,Continue 后的代碼不執(zhí)行而繼續(xù)下一次的循環(huán)
12.With 語句待诅;使用記錄類型的變量時叹坦,可以通過 With 語句指定一些語句,這些都是針對某一個變量來說的卑雁,這樣可以簡化代碼的輸入量募书。
? 過程與函數(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)識符寥茫。ParameterList為過程的參數(shù)列表遣蚀,需要指明參數(shù)的個 數(shù) 和 數(shù) 據(jù) 類 型 。Directives 是一 些 關(guān) 于 函 數(shù) 的 指 令 字 坠敷, 如 果 設(shè) 置 多 個 妙同, 應(yīng) 該 用 分 號 隔 開 。LocalDeclarations 中定義了該函數(shù)中需要使用的一些臨時變量膝迎,通常也稱作本地變量粥帚。在Begin與End 之間是過程調(diào)用時實現(xiàn)特定功能的一系列語句。ParameterList限次、Directives芒涡、LocalDeclarations和Statements 都是可選部分。
函數(shù)的定義與過程非常類似卖漫,只是使用的保留字不同费尽,而且多了一個返回值類型。具體形式如下:
function? FunctionName(ParameterList): ReturnType; directives;
var
? LocalDeclarations;
begin
?statements
end;
可以將函數(shù)需要返回的數(shù)值賦值給變量 Result羊始。如果函數(shù)體中存在著一些由于判斷而產(chǎn)生的分支語句時旱幼,就要在每一個分支中設(shè)置返回值。通常要根據(jù)函數(shù)的返回值來確定下一步的操作突委。注意柏卤,這里與Visual C 和 Visual C++不一樣,把一個值賦給 Result匀油,函數(shù)并不會結(jié)束缘缚。
2.參數(shù)
函數(shù)定義時參數(shù)列表中的參數(shù)稱為形參,函數(shù)調(diào)用時參數(shù)列表中的參數(shù)稱為實參敌蚜。在定義的函數(shù)原型中桥滨,多個參數(shù)之間用分號隔開,同一類型的參數(shù)可以放在一起弛车,以逗號隔開齐媒。函數(shù)調(diào)用的時候,在函數(shù)原型中纷跛,多個參數(shù)之間用逗號隔開喻括。
一般來說,形參列表和實參列表完全匹配是指參數(shù)的個數(shù)一樣忽舟,而且順序排列的數(shù)據(jù)類型也完全一致。對于普通的函數(shù),如果編譯器發(fā)現(xiàn)實參的數(shù)據(jù)類型與形參的數(shù)據(jù)類型不匹配叮阅,會將實參的數(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è)置了默認(rèn)值的參數(shù)指定一個新值。在函數(shù)體中眯分,各語句使用的是指定的新值拌汇,如果沒有指定新值,則使用默認(rèn)值弊决。同樣噪舀,如果存在多個設(shè)置了默認(rèn)值的參數(shù),只有在前面的參數(shù)指定了新值后飘诗,后面的參數(shù)才可以指定新值与倡。
下面的例子定義了一個 OutputNum 函數(shù),可以將一個浮點數(shù)按指定的精度輸出昆稿。通過這個例子纺座,可以體會函數(shù)中參數(shù)的使用:
program Project1;
{$APPTYPE
? CONSOLE}
uses? Sysutils;???????????????????????? //為了使用函數(shù)Format
function
? OutputNum(number:double;n:integer = 5):Boolean; var
? Str : string; //浮點數(shù)顯示輸出的內(nèi)容?
begin
? if n <= -1 then?????????????????????? //小數(shù)點后的位數(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ù)對數(shù)據(jù)類型進(jìn)行升級?
? //下面一句代碼不正確,故屏蔽掉?
? //OutputNum(123.456789,9.13);?????????? //參數(shù)對數(shù)據(jù)類型不能降級?
? //可以根據(jù)函數(shù)的返回值確定下一步的操作
? if OutputNum(123.456789,-3) = False then
? Writeln( ’輸出失敗溉潭【幌欤’ ) ;
? Readln;
end.
3.過程與函數(shù)的調(diào)用約定
在調(diào)用過程或函數(shù)的時候,如果參數(shù)列表中具有多個參數(shù)岛抄,那么參數(shù)傳遞給過程或函數(shù)的順序會對結(jié)果產(chǎn)生一定的影響别惦。對于不同的語言,參數(shù)傳遞的順序是不同的:Pascal 語言是按照從左向右的順序進(jìn)行傳遞的夫椭,而C語言是按照從右向左的順序來傳遞的掸掸。為了確定傳遞的順序,可以在過程或函數(shù)定義的時候蹭秋,在Directives部分利用指令字指定傳遞的順序扰付。
4.過程和函數(shù)的重載
可以在同一個作用范圍內(nèi)給不同的過程或函數(shù)取同一個名稱,這種現(xiàn)象就叫做重載仁讨。這樣可以使編程更方便羽莺。在重載的情況下,決定使用哪個過程或函數(shù)的依據(jù)是形參和實參的一致性洞豁,即參數(shù)個數(shù)盐固、參數(shù)類型以及它們之間的順序荒给,不存在一個函數(shù)調(diào)用滿足兩個重載函數(shù)的情況。另外重載函數(shù)必須用指令字Overload 來進(jìn)行說明刁卜,函數(shù)的返回值類型不同就不可以作為重載函數(shù)的依據(jù)志电。下面的兩個函數(shù)就是重載函數(shù):
function Average(a:Integer; b:Integer):Double;overload;??????? //求整形數(shù)據(jù)的平均值
function? Average(a:Double; b:Double):Double;overload;??????? //求實數(shù)數(shù)據(jù)的平均值?
5.函數(shù)的遞歸調(diào)用
在 Object Pascal 中,過程或函數(shù)必須先說明再調(diào)用蛔趴。以上規(guī)則在遞歸調(diào)用時屬于例外情況挑辆。所謂遞歸調(diào)用,是指函數(shù) A 調(diào)用函數(shù) B孝情,而函數(shù) B 又調(diào)用函數(shù) A 的情況鱼蝉,或是指一個函數(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.