delphi 集合類型探究

集合是由具備某些共同特徵的元素構成的一個總體。在pascal中,一個集合是由具備同一有序類型的一組數據元素所組成,這一有序類型稱爲該集合的基類型。
 
1、集合類型的定義和變量的說明
  集合類型的通常形式爲:
    set of 基類型;
  基類型能夠是任意順序類型, 而不能是實型或其它構造類型。同時,基類型的數據的序號不得超過255。例以下列說明是合法的:
函數

type numbers =set of 0..9;
   ch=set of char;
   day=(sun,mon,tue,wed,thu,fri,sat);
var s: numbers;
  c:ch;
    weekday:day;

 能夠將類型說明與變量說明合併在一塊兒,如:測試

var s:set of 0..9;                               { 子界型 }
    c:set of char;
    weekday: (sun,mon,tue,wed,thu,fri,sat);      { 枚舉型 }

 注意:集合的元素個數不超過256個,所以 var s:set of integer; 是錯誤的。
2、集合的值
spa

 一、集合的值放在一對方括號中,中間各元素之間用逗號隔開。如:[1,2,5] 和 ['a','e','i'] 都是集合。 code

二、在集合中能夠沒有任何元素,這樣的集合稱爲空集。[] 空集
  三、在集合中,若是元素的值是連續的,則可用子界型的表示方法表示。例如:  
  [1,2,3,4,5, 10,15] 能夠表示成: [1..5,10,15]
  四、集合的值與方括號內元素出現的次序無關。例如[1,5,8 ]和[5,1,8]的值相等。
  五、在集合中同一元素的重複出現對集合的值沒有影響。例如,[1,8,5,1,8]與[1,5,8]的值相等。
  六、每一個元素可用基類型所容許的表達式來表示。如 [1,1+2,4]、[succ(ch)]。 
 htm

3、集合的運算 對象

    集合類型變量不能進行算術運算,集合是無序的,不能使用ord、pred、succ等函數。blog

  一、賦值運算
  只能經過賦值語句給集合變量賦值,不能經過讀語句賦值,也不能經過寫語句直接輸出集合變量的值。如:
內存

     集合變量賦值:     c:=['2'];  i:=[5];  w:=[];
     集合變量賦子界值: c:=['a'..'z'];  i:=[1..7];
     集合變量賦枚舉值: c:=['a','b','d','m'];  i:=[2,4,6,8,10];  
get

     函數賦值操做:添加一個集合元素 Include(s, 1);class

                        刪除一個集合元素 Exclude(s, 1);
   二、集合的並、交、差運算
  能夠對集合進行並(+)、交(*)、差 (-)三種運算,每種運算只有一個運算符、兩個運算對象,運算結果仍爲集合。注意它們與算術運算的區別。

     ① 並運算 (關係代數運算符∪)

         A,B爲兩個集合,由集合A中的元素加上集合B中的與A不重複的全部元素組成的集合,稱爲集合A和B的並。即A+B,如:  

             [X,Y,Z]+[X] 爲 [X,Y,Z]       { 兩個集合中不重複的全部元素 }

             [1]+[4] 爲[1,4] 

     ②  交運算  (關係代數運算符∩)

         A,B爲兩個集合,由既屬於集合A中的元素又屬於集合B中的全部元素組成的集合,稱爲集合A和B的交。即A*B,如:

             [X,Y,Z]*[X] 爲 [X]          { 兩個集合中的相同元素 }

             [X,Y,Z]*[M] 爲 []

     ③差運算   (關係代數運算符-)

         A,B爲兩個集合,由集合A中的元素除去集合B中與A相同的元素組成的集合,稱爲集合A和B的差。即AB,如:

             [X,Y,Z]-[X] 爲 [Y,Z ]      { 在集合A中又不在集合B中的全部元素 }  

             [X,Y,Z]-[M] 爲 [X,Y,Z]  

  三、集合的關係運算: 運算結果爲布爾值

  關係運算符:= 相等、  <> 不相等

   >= 包含,表示前者蘊含後者,至關於集合論中的 <V:FORMULAS>FORMULAS>。

  <= 包含於,表示前者蘊含於後者,至關於集合論中的 。  

  例如:[a,b,c]=[b,c,a]   爲true,元素個數相同,內容相同,無論排列順序如何。

        [a,b,c]>=[a]      爲true;   

        [a,b]<=[a,b,c]    爲true。

  in運算:in的右邊爲集合,左邊爲與集合基類型相同的表達式,爲布爾值。in測試一個元素是否在集合中。至關於集合論中的∈。它們都是二目運算,且前4個運算符的運算對象都是相容  的集合類型。例如:a in[b,c]  爲false。

  設集合a:=[1..10]; x 爲integer,如x在集合a中即刪除a中的元素x,不然把元素x添加到集合a中。程序段以下:

      if x in a then a:=a-[x] else a:=a+[x]

  例一、設全集E={1,2,3,4,5},集合A={1,4},B={1,2,5},C={2,4},則集合

  (A∩B)∪~C 爲(      )。                                 ( NOIP2003單選8 )
      A)空集        B){1}       C){3,5}     D){1,5}      E){1,3,5}

以上內容自轉載:delphi語法基礎--集合類型 http://www.xuedelphi.cn/wenzhang/pascal/2007/12/200712302017_2.htm

如下內容爲探究的內容:

   首先咱們來看一個問題,

var
  sd: set of 1..9;
  t: set of 1..60;
begin
  sd := [];           // sd = []
  sd := [1,2];        // sd = [1,2]
  sd := sd + [15];    // sd = [1,2,15] 按照定義,sd應該爲1到9的值,
                      //  15應該不能加進來,但實際能加進去,使用 Include(sd, 15)也是同樣
  sd := sd + [16];    // sd = [1,2,15] 發現大於16的數字沒法添加進集合內
  sd := sd + [25];    // sd = [1,2,15]
  sd := [];
  showmessage(inttostr(sizeof(sd)));     // 輸出 2
  showmessage(inttostr(sizeof(t)));      // 輸出 8
end;

   出現這種現象,咱們從集合類型的在內存中存儲結構來解析,集合的元素在內存中是按位來存儲的,並以整數字節爲存儲單元,

  好比 sd: set of 1..9 它在內存中須要9位來存儲,超過一個字節8位,因此內存中是分配給2個字節存儲空間。

 咱們能夠經過

 showmessage(inttostr(PWord(@sd)^))

 

來顯示他在內存中的值。

好比 sd = [1,3,5,6]時,按照前面說的,對應二進制數爲:1101010,就是第1位、第3位、第5位、第6位爲1,對應十進制爲106。

位是從第0位開始的,因此第零位也表示一個值。按照此原理,反過來,若是利用下面語句:

 

PWord(@sd)^  := 106;

 

獲得的是sd也是[1,3,5,6],若是sd: set of 1..60 ,則在內存中佔8個字節,分別取出來,原理也是同樣的。

相關文章
相關標籤/搜索