跳轉到內容

Delphi 程式設計/資料型別

來自華夏公益教科書,開放的書籍,開放的世界

首先,讓我們定義一個型別

在 Delphi 中,像在 CVB 以及與 PHPPython 或其他現代語言不同的是,一個變數是型別化的,並且只能包含此型別的值。為了簡單起見,型別是變數的一個屬性。

基本型別

[編輯 | 編輯原始碼]

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!)

華夏公益教科書