集合与记录 9.1 集合
以已知序数类型值的集合为值,所构成的类型是集合类型,称已知序数类型为基类型。集合类型的定义形式为:
集合类型名=set of 基类型
限定基类型为枚举类型、字符型、布尔型以及它们的子界和整型子界。由于基类型中不能超过256个可能值,且它们的序数值应在0..255之间,因此基类型不能是短整型、整型、长整型。
表示一个集合值的最通用的方法是逐个枚举集合的元素。下面是集合值标记的例子:
[3,9,15,20] {由3,9,15,20组成的集合}
[ ] {空集}
['l'..'p','z' ]{由字符l,m,n,o,p,z组成的集合}
两个相连的集合对象之间,可以通过下列运算符进行运算
集合运算符: +
产生一个包含两个集合元素的集合
*
产生一个只包含两个集合元素公共元素的集合
-
产生一个包含所有属于第一个集合、但不属于第二个机和的元素的集合
例如:[A,B,C]+[D]等于[A,B,C,D]
[A,B,C]*[A]等于[A]
[A,B,C]-[A]等于[B,C]
关系运算符
=
检查两个集合所包含的元素相同
<>
检查两个集合不相等
<=
检查第一个集合中的元素都在第二个集合中出现
>=
检查第一个集合中的元素包含第二个集合中的所有元素
in
检查集合基类型的一个元素属于集合
例如:[A,B,C]=[A,B,C] 等于true
[A,B,C]<>[C,B,A] 等于FALSE
9.2 记录
记录是描述同一对象的一组类型可能不同的数据的集合。使用记录类型实现了数据逻辑关系和存放形式上的一致。定义记录类型的一般形式
记录类型名=record
域名1:类型1;
域名2:类型2;
……
域名m:类型m;
end;
例如:表示学生信息的记录定义
type
stype=record
name:string[20];
number:integer;
sex:(male,female);
class:1..20
address:string
end;
域为记录类型的元素。记录的每个域都有名称,不同域的数据类型可以各不相同,这一点是数组所不能做到的。引用记录变量的元素采用以下标记法:
(1)直接引用,其形式为
记录变量名.域名
例如:var str1,str2:stype;
则str1.name表示学生str1的姓名,str2.sex表示学生str2的性别。
(2)使用with开域语句,其形式为
with 记录变量名 do 语句
在with语句中,引用记录变量名不再冠以记录变量名,以简化对记录中域的引用写法。例如描述100个学生的数据信息,引入元素类型为stype的数组students。
var
students:array[1..100]of stype;
number_of_boy,number_of _girl,k:integer:
例如下面是一段统计一个班级中男生人数和女生人数的程序。
begin
number_of_boy:=0;number_of_girl:=0;
for k:=1 to 100 do
with student[k] do
if sex=male then number_of_boy:=number_of_boy+1
else number_of_girl:=number_of_girl+1
end;
with语句的嵌套结构的一般形式:
with <记录变量名1> do
with <记录变量名2> do
……
with <记录变量名n> do
<语句>;
使用with嵌套结构时,with的嵌套顺序必须和所打开的记录的嵌套顺序一致,以就是说外层with打开外层记录,内层with打开内层记录。上面的嵌套格式也可以简写为:
with <记录变量名1,记录变量名2,……,记录变量名n> do
<语句>;
若记录是由一部分固定不变和另一部分变化部分是随固定部分中的某个数据项的具体取值而定的数据项所组成的称为记录变体。带记录变体的记录类型定义有以下形式:
type
<类型标识符>=record
<域名1>:<类型1>;
<域名2>:<类型2>;
……
<域名n-1>:<类型n-1>;
case <标志域>:<类型n> of
<常量表1>:<域表1>;
<常量表2>:<域表2>;
……
<常量表m>:<域表m>;
end;
例:重新定义描述学生信息的记录类型stype,对于大专生,不需要增加其他信息,对于本科生,增加专业信息。
type
stype=record
name:string[20];
number:integer;
sex:(male,female);
class:1..20
address:string
case studtype:(s,u) of
s:( );
u:(major:string);
end;