集合是由具備某些共同特徵的元素構成的一個總體。在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個字節,分別取出來,原理也是同樣的。