var buf: set of 0..15;
i, k: integer;
具体指的是什么呢
var buf: set of 0..15;
i, k: integer;
具体指的是什么呢
声明变量
var buf: set of 0..15;//定义集合类型 0到15之间
i, k: integer;//定义i,k
9.1 集合
把具有某些共同特征的元素构成的一个整体,称为集合。具体在计算机程序设计中,一个集合就是由同一种有序类型的一组数据元素所组成的,这一种有序类型称为该集合的基类型。比如,把整数1,3,5放在一起就组成了一个整数集合,这个集合的基类型就是整型。其中的1,3,5都称为该集合的元素。集合类型是一种使用简便,节省内存面又运算速度快的数据类型。
一、集合类型 的定义
和其它构造类型相似,一般要先说明集合类型,再去定义某个变量为这种集合类型。说明集合类型的方法如下:
type 集合类型名 = set of 基类型;
如:type num = set of 1..10;
upperletter = set of ‘A’..‘Z’;
接下来,就可以定义变量了,如:
var n:num;u:upperletter;
这样,就定义了两个集合型变量,其中n是一个整型集合,不过它只能存放1到10;而u是一个字符型集合,它只能存放26个大写英文字母。也可以把集合类型的说明和集合变量的定义合在一起,如:
var n:set of 1..10;
二、集合的表示
把元素放在一对中括号中,每个元素之间用逗号隔开。
[A,B,C,D]--有四个枚举量的集合 ['A','B','C','D']--有四个字符的集合 [1..20]--包含了1到20中所有整数的集合 [0]--只有一个元素0的单元素集 []--空集
注意:
1、在一个集合中可以没有任何元素,这样的集合称为空集合,用[ ]表示。 集合中最多可以有256个元素。
2、集合的值与方括号内元素出现的次序无关,称为集合元素的无序性。如[1,2,3,4]和[1,2,4,3]是两个相等的集合; 所以ord,pred和succ函数不能用于集合类型的变量。
3、同一元素的重复出现对集合的值没有影响。如[1,2,3,1,1,2]和[1,2,3]也是两个相等的集合;
4、集合中的元素值如果是连续的,则可以用子界类型来表示。如[1,2,3,4,5,8,9,10,15,21,22,23,24],可以表示成[1..5,8..10,15,21..24];
5、集合的基类型可以是任何顺序类型,包括整型、字符型、枚举型、子界型,但不能为实型或其它构造类型;
6、每个元素均可用基类型所允许的表达式来表示。如[1+10,4*2,3..6]。
7、当一个集合变量允许包含有n个元素时,不考虑有重复元素的情况,所构成的集合共有2n种可能。
假设有如下定义:
type numset = set of 1..3;
var n:numset;
则集合n的值有几种可能呢?根据组合数学不难发现共有8种可能,分别为:[ ],[ 1 ],[ 2 ],[ 3 ],[1,2 ],[1,3],[2,3],[1,2,3]。
8、Free Pascal规定集合的元素个数不超过256个(当实际问题所需的元素个数大于256时,可采用布尔数组代替集合类型)。所以如下定义是错误的: var i: set of integer;
三、集合的运算
1、集合的关系运算:集合可以进行相等或不相等、包含或被包含的关系运算,还能测试一个元素是否在集合中。所用的运算符分别是:=、<>、>=、<=、in
注意:集合in运算相当快,在程序中常用集合表达式来描述复杂的测试。 (1)条件表达式: (ch='T') or (ch='t') or (ch='Y') or (ch='y') 可用集合表达式表示为: ch in ['T','t','Y','y'] (2)if (ch>=20) and (ch<=50) then ...;可写成:if ch in [20..50] then ...;
2、集合的并、交、差运算:可以对集合进行并、交、差三种运算,每种运算都只能有一个运算符、两个运算对象,所得结果仍为集合。三种运算符分别用"+"、"*"、"-"表示 。假设有两个基类型相同的集合A、B,如A=[1,3,4,5],B=[4,5,6,7],则A和B可以进行三种集合运算:
运算符 |
名 称 |
表示形式 |
定 义 |
运算结果 |
+ |
并集 |
A+B |
取两个集合中不重复的所有元素 |
[1,3,4,5,6,7] |
* |
交集 |
A*B |
取两个集合中的相同元素 |
[4,5] |
- |
差集 |
A-B |
取在集合A中但又不在集合B中的所有元素 |
[1,3] |
注意:
在程序设计中要把一个元素x填加到集合a中,则用并运算,方法为:a:=a+[x];{注意:一定要把x加上中括号,作为集合才好进行并运算,赋值号两边才相容}。同理,要把一个元素从一个集合中删除,就用差运算,而且一般要先判断该元素是否在集合中,方法为:
if x in a then a:=a-[x];
交运算可以取出两个集合的相同元素,假设a,b,c为同一基类型的集合,方法为:c:=a*b;
3、赋值运算:只能通过赋值语句给集合变量赋值,不能通过读语句赋值,也不能通过write(或writeln)语句直接输出集合变量的值。
输入时,只能借助于赋值语句,如n:=[1,3,5];u:=[‘A’,‘B’,‘C’,‘D’];
输出时,要借助于in运算,假设集合a =[1,3,5,7,9,11,13,15,17,19],x为integer,要求输出20之内的奇数,程序段如下:
for x:= 1 to 20 do
if x in a then write(x:3);