Delphi 程式設計/資料型別
首先,讓我們定義一個型別。
在 Delphi 中,像在 C、VB 以及與 PHP、Python 或其他現代語言不同的是,一個變數是型別化的,並且只能包含此型別的值。為了簡單起見,型別是變數的一個屬性。
Delphi 在這方面非常完善。存在許多預定義型別,您也可以建立自己的型別(我們將在後面看到)。以下是一張包含最有用基本型別(也稱為原始型別)的表格
| 型別 | 描述 | 大小 | 值 |
|---|---|---|---|
| boolean | boolean | 1 位 | True/False |
| char | 字元 | 1 位元組 | ASCII 表(或 ANSI)中的一個項 |
| string | 字元序列 | 取決於其字元數 | ASCII 表(或 ANSI)項的動態表 |
| integer | 正整數或負整數 | 4 位元組 | -2147483648 到 2147483647 |
| cardinal | 無符號整數 | 4 位元組 | 0 到 4294967295 |
| real(等效於 double) | 實數 | 8 位元組 | 5.0 x 10^-324 到 1.7 x 10^308 |
- 備註:以上僅是最流行的預定義型別。僅針對整數型別就有數十種其他型別(smallint、longint、int64...),它們的用途滿足非常具體的需要(例如我們將放入的資料的大小),從而優化了記憶體使用。有關此方面的更多資訊,請參閱 Delphi 幫助內容中的文件。
一個 char(一個字元)類似於 '#', 'A', '2', ';', '.', '?' 等等。它在 char 庫(ASCII)中有一個數字。在 Delphi 中,char 用兩個單引號括起來。如果給定的字元是單引號本身,則應將該字元加倍,換句話說,您必須輸入四個單引號。
var
a, b: char;
begin
a := 'H'; // a = "H"
b := 'i'; // b = "i"
WriteLn(a); // Display "H"
WriteLn(a, b); // Display "Hi"
WriteLn(a, b, '!'); // Display "Hi!"
end.
您已經在上一章中使用過字串,例如 'Hello World' 或 'Hi there' 等等。字串是 char 的序列。
var
text1: string;
character1: char;
然後在 begin 和 end 之間寫入
character1 := 'H';
text1 := 'ello World!';
WriteLn(character1, text1);
如果要在字串中寫入單引號,最佳方法是鍵入兩個連續的單引號
text1 := 'I''m John Doe.';
字串的行為類似於表格。可以使用索引訪問字元
text := 'Hello World!';
WriteLn(text[1]); // Only print "H".
第一個索引是 1(而不是 0)。
可以使用 + 運算子連結字串
firstWord := 'Hello';
secondWord := 'World';
WriteLn(firstWord + ' ' + secondWord + '!');
wholeText := firstWord + ' ' + secondWord + '!';
+ 運算子可以與不同型別的變數一起使用。根據型別,結果將具有不同的型別
- string + string → string
- string + char → string
- char + char → string
- char + string → string
- string + number → 錯誤
- number + string → 錯誤
- number + number → number
- number + char → 錯誤
- char + number → 錯誤
整數是偶數,您可以編寫
a: Integer;
浮點數是十進位制數。它們使用 浮點。您可以編寫
c: Real; // Real is normally the same like Single
a: Single;
b: Double;
d: Extended;
Extended 比 Real 更精確,但需要更多的主儲存空間。
布林值是一個邏輯值。它可以是 'True' 或 'False'。編寫
var
a: Boolean;
begin
a := True;
// or
a := False;
但是,只有在您瞭解下一章中的條件結構時,布林值才有意義。
陣列是字串、浮點數、整數或任何資料型別的集合。它也可以包含一個數組。在這種情況下,我們有一個具有多個維度的陣列。您可以說
a: array [from..to] of data_type;
→ a: array [1..3] of string;
對於一維。對於二維
a: array [fX..tX] of
array [fY..tY] of data_type;
等等。陣列的一個元素例如是
a[1] := 'Hello '
a[2] := 'World'
a[3] := '!';
WriteLn(a[1],
a[2],
a[3]);
記錄(在其他語言中也稱為結構)表示一組異構資料。每個專案都是一個欄位。記錄型別宣告指定每個欄位的名稱和型別。按照慣例,記錄型別的名稱以 "T" 開頭。記錄型別宣告具有以下語法
type recordTypeName= record
listField1: type1;
...
listFieldn: typen;
end
例如,以下宣告建立了一個名為 TDateRec 的記錄型別。
type
TDateRec = record
Year: Integer;
Month: (Jan, Feb, Mar, Apr, May, Jun,
Jul, Aug, Sep, Oct, Nov, Dec);
Day: 1..31;
end;
每個 TDateRec 包含三個欄位:一個名為 Year 的整數值、一個名為 Month 的列舉值以及另一個介於 1 和 31 之間的名為 Day 的整數值。識別符號 Year、Month 和 Day 是 TDateRec 欄位的名稱,其行為類似於變數。但是,TDateRec 型別宣告不會為 Year、Month 和 Day 欄位分配記憶體。當您例項化一個記錄時,記憶體將被分配,您需要執行以下操作
var Record1, Record2: TDateRec;
變數宣告建立了兩個 TDateRec 例項,分別稱為 Record1 和 Record2。
可以使用記錄名稱限定欄位名稱來訪問記錄欄位
Record1.Year := 1922;
Record1.Month := Nov;
Record1.Day := 26;
或者使用 with 指令
with Record1 do
begin
Year := 1922;
Month := Nov;
Day := 26;
end;
以下示例提出一個問題,獲取答案並列印答案
var
_Input, _Linkage: string;
begin
WriteLn('Hello, what is your name?');
ReadLn(_Input);
_Linkage := 'Hello, ' + _Input;
WriteLn(_Linkage);
end.
ReadLn(_Input) 表示應用程式等待使用者輸入文字,然後將文字儲存在變數 _Input 中。
以下另一個示例獲取 ASCII 中字元的數字
var
number: Integer; // Declare number as an integer
_Input: string;
_Char1: char;
begin
WriteLn('Enter a char!');
ReadLn(_Input);
_Char1 := _Input[1];
number := Ord(_Char1);
WriteLn('ASCII is: ', number);
end.
使用 _Input[1] 獲取 _Input 的第一個字元。第一個字元是字元 1(不是像 C++ 中的字元 0!)