第三节 用户定义类型
许多语言允许程序员规定
基本数据对象的聚合,乃至聚
合的聚合
1,笛卡尔积
N个集合 A1,A2,…,An的笛卡尔积表示为
A1?A2?… ?An,它是一个集合,其元素为
(a1,a2,…,an),ai?Ai
任意正多边形可表示为
integer *real
2,有限映像
① 定义:从定义域类型 DT的值的
有限集合, 到值域类型 RT的值的
有限集合的函数称为有限映像 。
var a:array[1..50] of char;
表示:整数 1至 50到字符集的有限映像
② 值域对象通过下标选取 。
③ 下标越界会出错,动态检查
④下标可用来选取值域的多个元素
⑤ SNOBOL4的 ARRAY构造符并
不要求值域集的所有元素是同一
类型的
⑥ DT到相应值的特定子集的绑定策略,
,编译时绑定 (静态数组 )
,对象建立时绑定 (执行到分程序时,
动态数组 )
,对象处理时绑定 (对 APL,子集范围可变 )
3,序列
① 序列由任意多个数据项组成,这些
数据项称为该序列的成分,且类型相

② 串是序列
③ 顺序文件的思想也是来自序列的概
念,只能顺序读写
4,递归
若数据类型 T包含属于同一类型 T的成
分, 那么类型 T称为递归类型 。
① 允许在类型定义中使用被定义类型的名

② 指针是建立递归数据对象的重要手段
5.判定或
判定或是一个选择对象结构的构造机
制,规定在两个不同选择对象之间作出适
当的选择 。 每一选择对象结构称为变体 。
例如,PASCAL的变体记录 ;
C的联合 。
6,幂集
类型 T的元素所有子集的集合, 称为
幂集,记为 Powerset(T),T称为基类
型 。
应用,每次的操作对象仅仅是某个集合的
子集 。
7,小结
通过 PASCAL的类型定义和变量说明,
给出用户定义类型显式命名的优点,
① 可读性 ( 选择名字 )
② 可修改性 ( 不修改变量说明 )
③ 可分性 ( 重复使用 )
④ 一致性检查 ( 参考第 8节 )
?匿名类型
var a,record x:integer;
y:array[1..10] of char
end;
?显式命名
type complex=record radius:real;
angle:real
end;
var c1,c2,c3:complex;
第四节 PASCAL类型结构
一, 非结构类型
1,内部类型
integer,real,boolean,char
2,有序类型
每一元素都有唯一的前驱和后继
如,整型,布尔型,字符型
3,定义新的有序类型的方法
? 枚举型 其值不能直接读 /写
? 子界型 动态检查范围
例,
type day=(sunday,monday,tuseday,wednesday,
thursday,friday,saturday);
work_day=monday..friday;
var class_day:work_day;
class_day:=succ(class_day);
二, 聚合构造
1,数组构造
? 构造符 ARRAY允许程序员定义有限映象
array[t1] of [t2]
? PASCAL把下标类型不同的数组看成不
同的类型
type a1=array[1..50] of integer;
a2=array[1..70] of integer;
?, 符合数组, 的概念(见下页)
维数相同,成分类型相同
? PASCAL可定义多维数组
type row=array[-5..10] of integer;
var my_matrax:array[3..30] of row;

var my_matrix:array[3..30,-5..10] of integer;
procedure sort(var a:array[low..high:integer] of ctype);
var i:integer;
more:boolean;
begin {sort}
more:=true;
while more do
begin
more:=false;
for i:=low to high-1 do
begin
if a[i]>a[i+1] then
begin move_right(i);
more:=true
end
end
end
end {sort};
2,记录构造
① 构造符 RECORD用以定义笛卡尔积
② 记录可以整体访问, 也可用圆点
,.”
作为选择符访问单个的域
③ PASCAL的变体记录
type dept=(house,sports,drugs,food,liquor);
month=1..12;
item=record
price:real;
case available:boolean of
true:(amount:integer;
where:dept);
false:(month_expected:month)
end;
var i1,i2:item,
……
i1.price:=5.24;
i1.available:=true;
i1.amount:=29;
i1.where:=liquor;
i2.price:=324.99;
i2.available:=false;
i2.month_expect:=8;
price
available
amount
where
5.24
true
29
liquor
price
available
month_expected
324.99
false
8
④ 使用变体记录不安全
■ 可以对变体赋值
■ 可以改变标识符域
■ 标识符域的标识符可省缺
3,集合构造
?SET构造符是幂集构造受限制的形式
? 基类型只能是有序类型
type vegetable=(bean,cabbage,carrot,celery,lettuce,onion,mushroom,zucchizi);
var my_salad,leftover:set of vegetable;
4,文件构造
?PASCAL文件是任意类型的诸元素的
序列
?PASCAL文件仅能顺序处理
?PUT和 GET操作
type pattern=record …end;
tape=file of pattern;
var t1,t2:tape;
三, 指针
? 指针可引用匿名数据对象
NEW,堆
? 空指针的使用
? 指针的操作,赋值,比较
?PASCAL指针只能指向匿名数据对象
type tree_ref=?binary_tree_node;
binary_tree_node=record
info:char;
left,right:tree_ref
end;
pointer= ?node;
node=record
data:integer;
next:pointer
end;
指针例子
四, 小结,(P37图 2-4)
Pascal类型
非结构类型 指针类型
(递归 )
结构类型
内部类型
整型
实型
字符型
布尔型 枚举类型
子界类型 记录类型
(迪卡尔积 )
变体记录
(判定或 )
数组 集合 文件
第五节 Ada类型结构
一, 标量类型
1,分类 实型
数字类型
标量类型, 整型
枚举类型
2,标量类型的值的集合是有序的,允
许关系运算
离散类型
3,用户自定义类型
type TWO_DIGIT is range 0..99;
type FLOAT_1 is digits 10 range 0.0..3.0;
type FIT_PT is delta 0.01 range 0.00..100.01;
type BOOLLEAN is (FALSE,TRUE);
二, 组合类型
1,数组
① 约束数组类型
? 下标界是静态确定的
type MONTH is (JAN,FEB,MAR,APR,MAY,JUN,
JUL,AUG,SEP,OCT,NOV,DEC);
type YEARLY_PAY is array(MONTH) of INTEGER;
type SUMMER_PAY is array(MONTH range JUL..SEP) of INTEGER;
② 非约束数组类型
? Ada支持动态数组
type SOME_PERIOD_PAY ia array(MONTH
range< >) of INTEGER;
type INT_VERTOR ia array(INTEGER range < >)
of INTEGER;
type BOOL_MAXTRIX is array(INTEGER range < >,
INTEGER range < >) of BOOLEAN;
③ Ada数组类型由分量的类型,下标个
数和下标类型来刻画
④ 界的确定可在数据对象成为实体时,
或参数传递时完成
SPRING_MONTH:SOME_PERIOD_PAY(APR..JUN);
Z:INT_VECTOR(-100..100);
W:INT_VERTOR(20..40);
Y:BOOL_MAXTRIX(0..N,0..M);
其中,界的值不一定静态给出
function SUM(X:INT-VECTOR) return INTEGER;
RESULT,INTEGER:=0;
begin
for I in X’FIRST..X’LAST loop
RESULT:= RESULT+X(I);
end loop;
return RESULT;
end SUM;
可用不同大小的数组作为实参来调用该函数
A:=SUM(Z)+SUM(W);
⑤ 可以在过程的局部说明中说明一个
数组,它的界依赖于一个参数
TEMPORARY:INT_VECTOR(X’FIRST..X’LAST);
⑥ 切片,用以选取一维数组若干个相
继分量
LINE:STRING(1..80);
LINE(1..11):=(‘D’,’e’,’a’,’r’,’’,’f’,’r’,’i’,’e’,’n’,’d’);
2,记录
① 说明形式
type COORDINATE is
record
X:INTEGER range 0..100;
Y:CHARACTER;
end record;
② Ada的判全或是安全的
type DEPT is (HOUSEWARE,SPORTS,
DRUGS,FOOD,LIQUOR);
type MONTH is range 1..12;
type ITEM (AVAILABLE:BOOLEAN,
=TRUE) is
record
PRICE:REAL;
case AVAILABLE of
when TRUE=>AMOUNT:INTEGER;
WHERE:DEPT;
when FALSE=>MONTH_EXPECTED:MONTH
end case;
end record;
判定或可具有缺省初值
也可以说明一个对象的变体是冻结的
单独对判定或赋值是不允许的
PEACH:ITEM;
ORANGE:ITEM(FALSE);
COCA_COLA:ITEM;
COCA_COAL:=ORANGE; (合法 )
COCA_COAL:=(PRICE=>1.99,AVAILABLE=>TRUE,
AMOUNT=>1500,WHER=>FOOD);