3.集合
Pascal语言是少数几种将集合作为内部数据类型的程序设计语言之一。
集合与数学中的集合相似,是指具有相同性质的对象的全体。组成集合的每个对象称为集合的元素。集合的特性:
-
集合中的元素是互异的,也就是说相同的元素视为一个元素(互异性)
-
集合中的元素是无序的,即{1,2,3,4,5}和{5,4,3,2,1}是同一个集合(无序性)
-
集合中元素的个数不能超过256个
-
元素和集合的关系是“属于”或“不属于”
3.1集合类型的定义
定义格式:
type <类型名称> = set of <基类型>;
说明:
-
基类型是集合中的元素的类型,可以是字符型、布尔型、枚举类型和子界等顺序类型,不能是整型、实型和其他类型。
-
若基类型是枚举或子界类型,则必须先定义基类型,再定义集合类型。
如:
type week = (sun, mon, tue, wed, thu, fri, sat); age = 0..99; CharSet = set of char; WeekSet = set of weel; AgeSet = set of age; TenSet = set of 1..10; LetterSet = set of 'A'..'z';
集合在内部以位的形式存储其元素,所以在运行速度上和内存利用上更高效。集合如果少于32个元素,会直接存储在CPU的寄存器中,效率会更高。
3.2集合类型变量的声明
集合类型变量的声明与其他类型变量的声明完全相同。
如:
var w1, w2: WeekSet;
也可以不经过类型定义,直接声明集合类型的变量:
var n1, n2: set of (sun, mon, tue, wed, thu, fri, sat); a1, a2: set of 0..99;
3.3集合变量的取值
集合变量的取值称为集合值,形式如下:
[<元素1>, <元素2>, ..., <元素n>]
如果集合的基类型有n个元素,则该集合的取值有2的n次幂个,其中包含一个空集合([])。
3.4集合类型的运算
已知两个相同基类型的集合S1和S2,其元素x,则集合运算法则如下:
1.算术运算
运算 | 表达式 | 运算结果 | 满足交换律 |
---|---|---|---|
并 | S1+S2 | 两个集合中所有不重复的元素组成的新集合 | 是 |
交 | S1*S2 | 两个集合中所共有的元素组成的新集合 | 是 |
差 | S1-S2 | 所有属于S1但不属于S2的元素的集合 | 否 |
2.逻辑运算
运算 | 表达式 | 运算结果 | 满足交换律 |
---|---|---|---|
相等 | S1 = S2 | 如果S1和S2所包含的元素完全相同,则为真 | 是 |
不等 | S1 <> S2 | 如果S1和S2所包含的元素不完全相同,则为真 | 是 |
包含 | S1 >= S2 | 如果S2中的每个元素都在S1中,则为真 | 否 |
被包含 | S1 <= S2 | 如果S1中的每个元素都在S2中,则为真 | 否 |
属于 | x in S1 | 如果元素x被包含在S1中,则为真 |
集合运算的优先级:
优先级 | 运算符 | 操作数 | 结果 |
---|---|---|---|
高 | * | 集合 | 集合 |
中 | +、- | 集合 | 集合 |
低 | =、<>、>=、<= | 集合 | 逻辑 |
最低 | in | 左操作数是元素,右操作数是集合 | 逻辑 |
示例:利用集合实现输入成绩,输出评定等级。界面如下图:
代码如下:
procedure TForm1.Button1Click(Sender: TObject); type TScore = 0..10; Grade = set of TScore; var Bjg, Jg, Zhong, Liang, You: Grade; Score: Real; ScoreDiv10: Integer; begin // 评定按钮单击事件 Bjg := [0, 1, 2, 3, 4, 5]; Jg := [6]; Zhong := [7]; Liang := [8]; You := [9, 10]; Score := StrToFloat(Edit1.Text); ScoreDiv10 := Trunc(Score / 10); if ScoreDiv10 in Bjg then Label2.Caption := '不及格'; if ScoreDiv10 in Jg then Label2.Caption := '及格'; if ScoreDiv10 in Zhong then Label2.Caption := '中'; if ScoreDiv10 in Liang then Label2.Caption := '良好'; if ScoreDiv10 in You then Label2.Caption := '优秀'; end;