网站首页 > 精选教程 正文
复杂数据类型又称为复合数据类型,它是相对于简单数据类型(或者基本数据类型)而言的。我更愿意称之为复合数据类型,很明显它其实是由一种或者多种基本数据类型组合而成
枚举类型
Pascal程序不仅用于数值处理,还更广泛地用于处理非数值的数据。例如,性别、月份、星期几、颜色、单位名、学历、职业等。
定义
type 枚举类型标识符=(标识符1,标识符2,…,标识符n)
特点
枚举元素只能是标识符; 定义枚举类型时列出的所有枚举元素构成了这种枚举类型的值域(取值范围)。例如
下列类型定义是合法的:
type
days=(sun,mon,tue,wed,thu,fri,sat);
colors=(red,yellow,blue,white,black,green);
而下列类型定义是错误的:
type
colortype=('red','yellow','blue','white');
numbers=(1,3,5,7,9);
起初我在第一次使用枚举的时候直接套用Java中枚举的用法,很明显挂了。
枚举类型属于顺序类型: 根据定义类型时各枚举元素的排列顺序确定它们的序号,且序号从0开始。例如
定义type days=(sun,mon,tue,wed,thu,fri,sat); 则, ord(sun)=0,ord(mon)=1,……,以此类推。
同一个枚举元素不能出现在两个或两个以上的枚举类型定义中。如下列定义是错误的:
type
color1=(red,yellow,white); // 因为red属于枚举类型color1和 color2
color2=(blue,red,black);
枚举类型变量只能进行赋值运算和关系运算,不能进行算术运算和逻辑运算. 在枚举元素比较时,实际上是对其序号的比较。例如:
type
days=(sun,mon,tue,wed,thu,fri,sat);
colors=(red,yellow,blue,white,black,green);
var
color:colors;
weekday:days;
//则下面语句是合法的:
weekday:=mon;
if weekday=sun then
write('rest');
{而下面语句是不合法的:}
mon:=1; {错把枚举值当成变量名}
weekday:=blue; {枚举值blue不属于枚举变量weekday的值域}
read(color); {枚举类型变量 不能用读语句进行赋值}
write(weekday); {不能通过写语句输出枚举类型的变量值和枚举值。}
writeln(blue);
可以把变量的说明与类型的定义合并在一起,这种玩法在Delphi中很常见,相当于由原来的两步合并为了一步。例如:
var
holiday,workday:(sun,mon,tue,wed,thu,fri,sat);
color:(red,yellow,blue,white,black,green);
对枚举数据的输入与输出可通过间接方式进行。输入时,一般可输入一个代码,通过程序进行转换,输出时,也只是打印出与枚举元素相对应的字符串。这在后面的例题中将有使用示例。
获取枚举元素
单值获取,虽然这种情况比较少见,但是不代表不能获取,很早之前我自己也不太清楚如何获取枚举中的key和value
implementation
//该单元必须引入
uses System.TypInfo;
{$R *.dfm}
type
TColors = (Red, Green, Blue);
procedure TForm1.Button1Click(Sender: TObject);
var
Colors: TColor;
Info: PTypeInfo;
EnumName: string;
EnumValue: Integer;
begin
Info := TypeInfo(TColors);
//获取value对应的名称
EnumName := GetEnumName(Info, 1);
//获取名称对应的value
EnumValue := GetEnumValue(Info, EnumName);
ShowMessage(EnumName + ',' + EnumValue.ToString);
end;
遍历枚举中的值:枚举类型是一种有序类型,所以枚举类型的变量可以作为循环变量。
uses System.TypInfo;
{$R *.dfm}
type
TColors = (Red, Green, Blue);
procedure TForm1.Button1Click(Sender: TObject);
var
Colors: TColors;
Info: PTypeInfo;
EnumPoint: PTypeData;
EnumName: string;
EnumValue: Integer;
begin
Info := TypeInfo(TColors);
//获取PTypeInfo的指针对象
EnumPoint := GetTypeData(Info);
//利用TypeData中的MinValue和MaxValue函数实现遍历
for var I := EnumPoint.MinValue to EnumPoint.MaxValue do begin
EnumName := GetEnumName(Info, I);
EnumValue := GetEnumValue(Info, EnumName);
ShowMessage(EnumName + ',' + EnumValue.ToString);
end;
end;
应用实例
例:判断当前的颜色是什么。
implementation
uses System.TypInfo;
{$R *.dfm}
type
TColors = (Red, Green, Blue);
procedure TForm1.Button1Click(Sender: TObject);
var
Colors: TColors;
begin
case Colors of
Red: begin
ShowMessage('红色');
end;
Green: begin
ShowMessage('绿色');
end;
Blue: begin
ShowMessage('蓝色');
end;
end;
end;
猜你喜欢
- 2025-01-10 如何使用JavaScript遍历对象?
- 2025-01-10 面试官:来,讲一下枚举类型在开发时中实际应用场景!
- 2025-01-10 SpringBoot中Jackson实现自定义序列化和反序列化控制5种方式总结
- 2025-01-10 EnumMap&EnumSet的用法
- 2025-01-10 枚举虽好,但务必记得避坑
- 2025-01-10 Python学习 -- 枚举类
- 2025-01-10 为什么阿里不建议在返回对象中使用枚举
- 2025-01-10 你知道 Java 中关键字 enum 是一个语法糖吗?反编译枚举类
- 2025-01-10 深入剖析枚举:从简单概念到高级应用
- 2025-01-10 Java 枚举与策略模式、函数式接口的结合:实现高内聚低耦合的设计
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)