Delphi基本類型--枚舉 子界 集合 數組

非常慚愧

接觸Delphi也有一年多了,但是對於其基本類型的使用也是淺嘗輒止,

現在補上吧,亡羊補牢爲時不晚!

根據枚舉定義集合 
  TMyColor = (mcBlue, mcRed);
  TMyColorSet = set of  TMyColor ;

根據枚舉定義數組
type
TMyEnum = (red,green,blue); {定義枚舉}
procedure TForm1.Button1Click(Sender: TObject);
const
    ColorArr: array[TMyEnum] of string=('紅','綠','藍'); {定義數組}
var
    myEnum: TMyEnum; {定義枚舉變量}
begin
for myEnum := Low(ColorArr) to High(ColorArr) do
begin
   ShowMessage(ColorArr[myEnum]);
end;


枚舉類型
  Pascal程序不僅用於數值處理,還更廣泛地用於處理非數值的數據。例如,性別、月份、星期幾、顏色、單位名、學歷、職業等。
  
1、枚舉類型的定義
   格式: type 枚舉類型標識符=(標識符1,標識符2,…,標識符n)

2、枚舉類型數據特點

① 枚舉元素只能是標識符;

例如,下列類型定義是合法的:
      type  days=(sun,mon,tue,wed,thu,fri,sat);
          colors=(red,yellow,blue,white,black,green);
       而下列類型定義是錯誤的:
     type colortype=('red','yellow','blue','white');
            numbers=(1,3,5,7,9);

定義枚舉類型時列出的所有枚舉元素構成了這種枚舉類型的值域(取值範圍)。
 

② 枚舉類型屬於順序類型
   根據定義類型時各枚舉元素的排列順序確定它們的序號,且序號從0開始。

例如,定義type days=(sun,mon,tue,wed,thu,fri,sat);

則, ord(sun)=0,ord(mon)=1,……,以此類推。

枚舉類型中的第一個元素無前趨,最後一個元素無後繼。 
       pred(sat)=fri; succ(sun)=mon; ord(sat)=6; 
 

③ 同一個枚舉元素不能出現在兩個或兩個以上的枚舉類型定義中。如下列定義是錯誤的:
   type color1=(red,yellow,white);
      color2=(blue,red,black); 

 因爲red屬於枚舉類型color1和 color2
  
④ 枚舉類型變量只能進行賦值運算和關係運算,不能進行算術運算和邏輯運算。
  在枚舉元素比較時,實際上是對其序號的比較。

 例如定義如下:
    type days=(sun,mon,tue,wed,thu,fri,sat);
      colors=(red,yellow,blue,white,black,green);
    var color:colors;
      weekday:days;
 則下面語句是合法的:  weekday:=mon;
                     if weekday=sun then write('rest');
 而下面語句是不合法的:

mon:=1;           錯把枚舉值當成變量名;

weekday:=blue;   枚舉值blue不屬於枚舉變量weekday的值域;

read(color);      枚舉類型變量 不能用讀語句進行賦值;

write(weekday); writeln(blue);不能通過寫語句輸出枚舉類型的變量值和枚舉值。
 

⑤ 可以把變量的說明與類型的定義合併在一起,如:
  var holiday,workday:(sun,mon,tue,wed,thu,fri,sat);
     color:(red,yellow,blue,white,black,green);

對枚舉數據的輸入與輸出可通過間接方式進行。輸入時,一般可輸入一個代碼,通過程序進行轉換,輸出時,也只是打印出與枚舉元素相對應的字符串。這在後面的例題中將有使用示例。
  
二、枚舉類型的應用
例1、輸入今天是星期幾的序號,輸出明天是星期幾的英文單詞(星期天序號爲0)。
  type weekday=(sun,mon,tue,wed,thu,fri,sat);
   var i : integer;
     today,tomorrow : weekday;
  begin
   writeln('What date is it'); readln(i);
   case i of                              { 根據輸入轉換成枚舉型 }
    0:today:=sun;
    1:today:=mon;
    2:today:=tue;
    3:today:=wed;
    4:today:=thu;
    5:today:=fri;
    6:today:=sat;
   end;                          

if (today=sat) then tomorrow:=sun  else tomorrow:=succ(today);
    write('The tomorrow is ');    
   case tomorrow of
    sun:writeln('sunday');
    mon:writeln('monday');
    tue:writeln('tuesday');
    wed:writeln('wednesay');
    thu:writeln('thursday');
    fri:writeln('friday');
    sat:writeln('saturday');
   end;
  end.
    枚舉類型是一種有序類型,所以枚舉類型的變量可以作爲循環變量。

子界類型
如果我們定義一個變量爲integer型,那麼它的取值範圍一般爲-32768~32767。而事實上,每個程序中所用的變量的值都有一個確定的範圍。 例如,人的年齡一般爲1到120歲,一年中的月數爲1到12月,一月中的天數爲1到31天等等。
  如果能在程序中對所用的變量的值域作具體規定,就便於檢查出那些不合法的數據,這就能更好地保證程序運行的正確性且在一定程度上節省內存空間。
  
   子界類型能很好解決上面的問題。此外,在數組的定義中,常用到子界類型,以規定數組下標的範圍。

1、定義格式:
     type 子界類型標識符=常量1..常量2 
      常量1稱爲子界的下界,常量2稱爲子界的上界;
①下界和上界必須是同一順序類型(該類型稱爲子界類型的基類型),且上界的序號必須大於下界的序號。
  例如 type age=1..100;
          letter='a' ..'z';
②可以直接在變量說明中定義子界類型。如:
  type  letter='a'..' z ';
     var ch1,ch2:letter;
  可以合併成:
        var ch1,ch2:'a'..'d';

2、子界類型數據的運算規則
①凡可使用基類型的運算規則同樣適用該類型的子界類型。
 例如,可以使用整型變量的地方,也可以使用以整型爲基類型的子界類型數據。
 
②對基類型的運算規則同樣適用於該類型的子界類型。
 
  例如,div,mod要求參加運算的數據爲整, 因而也可以爲整型的任何子界類型數據。
③基類型相同的不同子界類型數據可以進行混合運算。
 例如:設有如下說明:
  var  x:1..100;
     y:1..500;
     z:1..1000;
      a:integer;
  則下列語句是合法的: a:=Sqr(x)+y+z;   z:=x+y
  下列語句: y:=x+z+a; 當x+y+a的值在1~500範圍內時是合法的,否則會出錯。
三、子界類型應用舉例
例1、使用子界型情況語句,當輸入月、日、年(10 30 1986),輸出30 Oct 1986。
   var month:1..12; day:1..31; year:1900..2003;
   begin
    write('Enter date(mm dd yy):'); readln(month,day,year); write(day);
case month of
     1:write('Jan':5);
     2:write('Feb':5);
     3:write('Mar':5);
     4:write('Apr':5);
     5:write('May':5);
     6:write('Jun':5);
     7:write('Jul':5);
     8:write('Aug':5);
     9:write('Sep':5);
     10:write('Oct':5);
     11:write('Nov':5);
     12:write('Dec':5);
    end;
    writeln(year:7);
   end.
例2、將一個四位的十六進制數轉換成十進制數。
Var ch:char; n:1..4;  d1,d2,d3,d4,t:0..15; s:real;
Begin     
Write('The hex number is ');
For n=1 to 4 do
Begin                    { 把四位的十六進制數分四次作爲字符讀入 }
Read(ch); write(ch);   { 分別轉換爲十進制的數d1,d2,d3,d4, }
if (ch>='0') and (ch<='9')then t:=ord(ch)-48;
if (ch>='a') and (ch<='z')then t:=ord(ch)-87;
if (ch>='A') and (ch<='Z')then t:=ord(ch)-55;
case n of
1:di:=t;
2:d2:=t;
3:d3:=t;
4:d4:=t;
end,
end;
s:=d1*16*16*16+d2*16*16+d3*16+d4;
writeln('dec:',s)
end. 

數組


type


TBigByteArray = array [0 .. MaxInt - 1] of byte;

TBytes = TBigByteArray;

PBigByteArray = ^TBigByteArray;


var


PText: PBigByteArray 

//方法一:指針操作 分配空間

GetMem(PText, 10);


//方法二:動態數組定義 推薦這種方式,代碼簡潔多了

TextArr: array of byte; 

SetLength(TextArr, 10); 


發佈了81 篇原創文章 · 獲贊 20 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章