Object Pascal 語言基礎(chǔ)

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.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,196評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,456評(píng)論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,955評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,195評(píng)論 0 287
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,725評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,608評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,802評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,048評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評(píng)論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,424評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,762評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容

  • 一、Java 簡介 Java是由Sun Microsystems公司于1995年5月推出的Java面向?qū)ο蟪绦蛟O(shè)計(jì)...
    子非魚_t_閱讀 4,224評(píng)論 1 44
  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,184評(píng)論 0 13
  • 一把灰刀一塊磚嘭……磚碎了夢醒了 一座攪拌機(jī)一斗車沙灰吱……機(jī)器轉(zhuǎn)動(dòng)了日子久了,天長了 一根鉛筆一雙望眼哇……孩子...
    黃河流沙閱讀 268評(píng)論 3 8
  • 姓名 倪海峰 企業(yè)名稱 寧波禾隆新材料股份有限公司 組別 312期 謙虛二...
    倪海峰閱讀 61評(píng)論 0 0
  • 每個(gè)人都有自己的英雄,每個(gè)人都能成為英雄。 今天寫的是我的父親,他是一個(gè)60多歲的人了。 今年他開始考駕照,對(duì)于他...
    laviqx閱讀 270評(píng)論 2 0