1. Object Pascal數據類型
l 數據類型描述了變量和常量的使用情況
l Object Pascal是一種強類型的語言,它可以區分不同的數據類型,而不能隨便用一種數據類型代替另一種數據類型。
l 在使用變量和常量時,必須要先對變量或常量進行聲明。
l 優點:有利於編譯器合法有效的處理數據,不會出現硬件錯誤。當類型不滿足要求時,還可以自定義所需要的數據類型。
1.1 有序數據類型
l 有序數據類型:1、整數類型,2、字符類型,3、布爾類型,4、枚舉類型,5、子界類型。
l 任何一個有序類型的數據都有唯一的一個先行數(第一個除外),和唯一的一個後繼數(最後一個除外)。
常用函數
函數 |
參數 |
返回值 |
備註 |
Ord |
有序類型表達式 |
有序類型表達式的序號 |
不能處理64位,如Int64 |
Pred |
有序類型表達式 |
表達式前驅的值 |
在有寫過程時不可用 |
Succ |
有序類型表達式 |
表達式後繼的值 |
在有寫過程時不可用 |
High |
有序類型表達式 |
該類型的最大值 |
同樣適合於短字符串和數組類型 |
Low |
有序類型表達式 |
該類型的最小值 |
同樣適合於短字符串和數組類型 |
l Inc()函數
inc(i)等價於Succ(i)
當i爲整數時,i:=i+1
l Dec()函數
Dec(i)等價與Pred(i)
當i爲整數是,i:=i-1
1.1.1 整數類型
整型是存儲整數數據的類型。是全體帶符號整數的統稱。
整數類型分爲:通用整數類型,和基本整數類型。
通用類型
類型 |
名稱 |
字節數 |
取值範圍 |
整型 |
Integer |
有符號32位 |
-2 147 483 648~2 147 483 647 |
序數型 |
Cardinal |
無符號32位 |
0~4 294 967 295 |
基本整數類型
類型 |
名稱 |
字節數 |
取值範圍 |
短整型 |
Shortint |
有符號8位 |
-128~127 |
小整型 |
Smallint |
有符號16位 |
-32 768~32 767 |
長整型 |
Longint |
有符號32位 |
-2 147 483 648~2 147 483 647 |
64位整型 |
Int64 |
有符號64位 |
-263~263-1 |
字節型 |
Byte |
無符號8位 |
0~255 |
字型 |
Word |
無符號16位 |
0~65535 |
不同數據類型,其存儲能力截然不同,因此,我們儘量推薦使用通用類型:Integer,Cardinal。這兩種類型可以最大限度的發揮CPU和操作系統的性能。
1.1.2 字符類型
l 字符類型只能存儲一個字符
類型 |
名稱 |
字節數 |
取值範圍 |
字符型 |
Char |
1(2)字節 |
存儲一個ANSI字符,通用類型。 |
Ansi字符型 |
AnsiChar |
1字節 |
存儲一個ANSI字符,基本類型。 |
寬字符型 |
WideChar |
2字節 |
存儲一個Unicode字符,基本類型。 |
l ANSI字符集是擴展的ASCII字符集,每個字符佔一個字節。
l WideChar用來支持Unicode。每個Unicode字符佔用2個字節。有65536種取值。可以表達世界上的所有語言。
l 每個字符都對應一個有序整數,其值是對應的ASCII字符的位置
l Chr()函數或#符號
該函數返回ASCII中某序數所代表的字符,與Ord()函數互爲逆函數。
eg: MyChar:=chr(65) //返回A
Mychar:=#65 //返回A
l UpCase()函數
該函數將小寫字母轉換爲大寫字母,
eg: UpCase(a) //返回A
UpCase(A) //返回A
1.1.3 布爾類型
用於邏輯運算
類型 |
名稱 |
字節數 |
取值 |
布爾型 |
Boolean |
1 |
只能爲0(False)或1(True) |
字節布爾型 |
ByteBool |
1 |
0(False)或非0(True) |
寬布爾型 |
WideBool |
2 |
0(False)或非0(True) |
長布爾型 |
LongBool |
4 |
0(False)或非0(True) |
l Boolean是通用類型。推薦使用Boolean。它佔用最少的內存空間。
l 3種基本類型:ByteBool,WideBool,Longbool,是爲了兼容其他語言而設置的。當表達式的值爲0時,則可認爲表達式的值是False,而當表達式的值爲非0時,則可認爲表達式的值是True。
有序數據類型函數計算
函數 |
返回值 |
Ord(False) |
0 |
Ord(True) |
1 |
Succ(False) |
True |
Pred(True) |
False |
High(True) |
True |
Low(True) |
False |
1.1.4 枚舉類型
l 枚舉類型是通過枚舉的方式將該種類型的所有取值用標識符一一列舉出來。
l 定義的一般格式:
Type
TypeName=(val1,val2,…,valn);
……
Var
VariableName:TypeName;
……
l Type:類型說明標識符。TypeName是枚舉類型名稱。Val是自定義的枚舉常量,是一組標記符號,標記符號數目不能超過255個。
l 兩點注意規則:
1、每個枚舉常量必須是標識符,不能是其他數據類型。
2、在枚舉定義語句中,一個枚舉常量只能出現一次。
eg:
Type
weeks=(Sunday,Monday,Tuesday,
Wednesday,Thurday,Friday,Saturday);
Var
w:weeks;
l 枚舉類型是使用整數值來儲存的。枚舉類型的每一個值對應一個整數值。
l 默認情況下,每個值都會根據定義的順序(從0開始),向右依次增加1。Eg:
w:=Wednesday;
ord(w)將返回值3
w:=Sunday;
ord(w)將返回值0
l 通過=運算符重寫賦值過程,自定義每個枚舉的實際值。 eg:
l Type
weeks=(Sunday=1,Monday=2,Tuesday=4,Wednesday,Friday,Thurday,Saturday=Sunday+Tuesday);
l 若枚舉項未被賦值,則未被賦值的枚舉項會自動獲得一個初始值。最後一個明確賦值的枚舉項的序列值上加1。
l 問題:多個枚舉項的序數值相同。
l 枚舉常量不能參與運算,必須通過枚舉變量進行運算。Eg:
w:=Monday; //正確的操作
Sunday+Monday; //錯誤的操作
l 枚舉類型的常用Case間接的輸出。Eg:
Case number of
0:showmessage(‘Sunday’);
1:showmessage(‘Monday’);
2:showmessage(‘Tuesday’);
End;
1.1.5 子界類型
l 子界類型是由1、整型 2、字符型 3、枚舉型 4、布爾型中的某兩個常量指定的該類型的值域區間。
l 定義的一般類型:
Type
TypeName=ConstLow . . ConstHigh;
Var
VirableName:TypeName;
l Type:類型說明標識符。TypeName是子界變量名稱。ConstLow是下界常量,ConstHigh是上界常量,
l 幾點注意規則:
1、子界類型的上、下界常量必修是同一重類型,並且是有序類型。
2、子界類型的上、下界必修依次有序遞增。
3、子界類型變量具有基類型數據的所有運算特性,但運算結果必須在所定義的上下界範圍內。
4、一個子界類型繼承它的常量類型的運算符和標準函數。
5、常量類型相容的不同子界類型可以混合運算。
l 子界類型與其基類型之間,以及同一基類型的不同子界之間可以混合運算。
l 子界類型賦值時,應該保證右端表達式的值不超過左端變量所允許的範圍。
l 參加運算的各量應滿足類型相容性,賦值時,應滿足賦值相容性。
附: 練習題
1、創建一個delphi應用程序,在窗體中加入一個button1、一個edit1和一個edit2;在程序中聲明一個weeks的枚舉類型,類型中包括一個星期的七天,例如:
weeks=(Sunday,Monday,Tuesday,Wednesday,Thurday,Friday,Saturday)
聲明一個weeks的變量w,
並把這個變量w的值顯示在edit1中,
在edit2中顯示w的序號值。
Type weeks = (Sunday,Monday,Tuesday,Wednesday,Thurday,Friday,Saturday); var w:weeks;
procedure TForm1.Button1Click(Sender: TObject); begin w := Monday; self.Edit1.Text := 'Monday'; self.Edit2.Text := inttostr(ord(w)); end;
|
2、創建一個delphi應用程序,在窗體中加入一個button1、一個edit1。聲明一個子界類型值,字界類型值從1至500。聲明此子界類型值的一個變量z1。給這個變量賦值1000,會有何結果?請編程,並截圖。
Type cq1 = 1..500; var z1:cq1;
procedure TForm1.Button1Click(Sender: TObject); begin z1 := 1000;
|
超出界限,出現錯誤: [Error] Unit1.pas(33): Constant expression violates subrange bounds