Los tipos de datos complejos también se denominan tipos de datos compuestos, que son relativos a tipos de datos simples (o tipos de datos básicos). Prefiero llamarlo un tipo de datos compuestos, obviamente, en realidad es una combinación de uno o más tipos de datos básicos
Tipo enumerado
El programa Pascal no solo se usa para el procesamiento numérico, sino que también se usa más ampliamente para procesar datos no numéricos. Por ejemplo, sexo, mes, día de la semana, color, nombre de la unidad, antecedentes educativos, ocupación, etc.
definición
tipo de enumeración tipo identificador = (identificador 1, identificador 2, ..., identificador n)
Caracteristicas
Los elementos de enumeración solo pueden ser identificadores ; todos los elementos de enumeración enumerados al definir un tipo de enumeración constituyen el rango (rango de valores) de este tipo de enumeración. P.ej
Las siguientes definiciones de tipo son legales:
type
days=(sun,mon,tue,wed,thu,fri,sat);
colors=(red,yellow,blue,white,black,green);
Y la siguiente definición de tipo es incorrecta:
type
colortype=('red','yellow','blue','white');
numbers=(1,3,5,7,9);
Al principio, cuando usé la enumeración por primera vez, apliqué directamente el uso de la enumeración en Java. Obviamente estaba roto.
Los tipos de enumeración son tipos secuenciales: el número de secuencia de cada elemento de enumeración se determina de acuerdo con el orden de disposición de los elementos de enumeración cuando se define el tipo, y el número de secuencia comienza desde 0. P.ej
Defina el tipo days = (sun, mon, tue, wed, thu, vie, sat); luego, ord (sun) = 0, ord (mon) = 1, ..., y así sucesivamente.
El mismo elemento de enumeración no puede aparecer en dos o más definiciones de tipo de enumeración. La siguiente definición es incorrecta:
type
color1=(red,yellow,white); // 因为red属于枚举类型color1和 color2
color2=(blue,red,black);
Las variables de tipo enumeración solo pueden realizar operaciones de asignación y operaciones relacionales , pero no pueden realizar operaciones aritméticas y operaciones lógicas.Cuando se comparan elementos enumerados, en realidad es una comparación de sus números de serie. P.ej:
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);
Puede fusionar la descripción de la variable con la definición de tipo . Este tipo de juego es muy común en Delphi, que equivale a fusionar los dos pasos originales en uno. P.ej:
var
holiday,workday:(sun,mon,tue,wed,thu,fri,sat);
color:(red,yellow,blue,white,black,green);
La entrada y salida de datos enumerados se puede realizar de forma indirecta. Al ingresar, generalmente puede ingresar un código y convertirlo a través del programa. Al generar, solo imprime la cadena de caracteres correspondiente al elemento enumerado. Esto se utilizará en las siguientes preguntas de muestra.
Obtener elemento de enumeración
Adquisición de valor único, si bien esta situación es relativamente rara, no significa que no se pueda adquirir, yo mismo no sabía cómo adquirir la clave y el valor en la enumeración hace mucho tiempo.
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;
Atraviese los valores de la enumeración: el tipo de enumeración es un tipo ordenado, por lo que las variables del tipo de enumeración se pueden utilizar como variables de bucle.
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;
Aplicaciones
Ejemplo: Determine cuál es el color actual.
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;