150 likes | 270 Views
Seminario de Lenguajes A – Opción Ada. Tipos definidos por el usuario Punteros Tipo access: estructuras de datos en tiempo de ejecución type PInteger is access integer; type TFecha is record Dia, Mes, Ano: integer; end record ; type PFecha is access TFecha; PI: PInteger; -- null
E N D
Seminario de Lenguajes A – Opción Ada • Tipos definidos por el usuario • Punteros • Tipo access: estructuras de datos en tiempo de ejecución type PInteger is access integer; type TFecha is record Dia, Mes, Ano: integer; end record; type PFecha is access TFecha; PI: PInteger; -- null PF: PFecha; -- null F: TFecha; • Alocación PI := new integer; PP := new TFecha; • Desalocación • Garbage collector (depende de la implementación) Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 1
Seminario de Lenguajes A – Opción Ada • Tipos definidos por el usuario • Punteros • Referenciación PF.Dia := 20; PF.Mes := 4; PF.Ano := PF.Dia * PF.Mes; F := PF.all; PF.all := F; PF.all.Ano := PF.all.Dia * PF.all.Mes; I := PI.all; PI.all := I; • Qué hacen las siguientes asignaciones? PF1: PFecha; PF2: PFecha; .... PF2 := PF1; PF2 := F; PF2.all := PF1; PF2.all := F; Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 2
Seminario de Lenguajes A – Opción Ada • Tipos definidos por el usuario • Punteros • Operaciones • Asignación PF2 := PF1; • Comparación por igualdad (/desigualdad) if PF1 = PF2 then if PF1 /= PF2 then • Referenciación type PFecha is access TFecha; type TArreglo is array (1..10) of integer; type PArreglo is access TArreglo; PF: PFecha; PA: PArreglo; PF := new TFecha; PF.Dia := PF.Mes; PA := new TArreglo; PA(1) := PA(2); PA.all := (others => 1); • No se permiten operaciones aritméticas sobre access Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 3
Seminario de Lenguajes A – Opción Ada • Tipos definidos por el usuario • Punteros y listas Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 4
Seminario de Lenguajes A – Opción Ada • Tipos definidos por el usuario • Punteros y listas Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 5
Seminario de Lenguajes A – Opción Ada • Tipos definidos por el usuario • Punteros y listas Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 6
Seminario de Lenguajes A – Opción Ada • Tipos definidos por el usuario • Punteros, alocación con inicialización • Tipo access: estructuras de datos en tiempo de ejecución type TFecha is record Dia, Mes, Ano: integer; end record; type TArreglo is array (1..10) of integer; type PInteger is access integer; type PFecha is access TFecha; type PArreglo is access TArreglo; PI: PInteger; PF: PFecha; PA: PArreglo; • Alocación con inicialización PI := new integer'(2); PI := new integer'(2 + 2); PP := new TFecha'(13, PI.all, 1968); PA := new TArreglo'(others => 0); Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 7
Seminario de Lenguajes A – Opción Ada • Tipos definidos por el usuario • Punteros y listas Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 8
Seminario de Lenguajes A – Opción Ada • Tipos definidos por el usuario • Punteros y árboles • Arbol binario de caracteres in order sin repeticiones type Nodo; type Arbol is access Nodo; type Nodo is record Valor: character; Izq, Der: Arbol; end record; Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 9
Seminario de Lenguajes A – Opción Ada • Tipos definidos por el usuario • Punteros y árboles procedure Insertar(A: in out Arbol; C: in character) is begin if A = null then -- árbol vacío A := new Nodo'(C, null, null); -- => crear raíz elsif C < A.Valor then Insertar(A.Izq, C); -- => insertar en rama izquierda elsif C > A.Valor then Insertar(A.Der, C); -- => insertar en rama derecha end if; end Insertar; Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 10
Seminario de Lenguajes A – Opción Ada • Tipos definidos por el usuario • Punteros y árboles function Esta(A: in Arbol; C: in character) return boolean is Result: boolean; begin if A = null then -- árbol vacío Result := false; -- => C no está elsif C < A.Valor then Result := Esta(A.Izq, C); -- buscar en rama izquierda elsif C > A.Valor then Result := Esta(A.Der, C); -- buscar en rama derecha else -- C = A.Valor Result := true; end if; return Result; end Esta; Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 11
Seminario de Lenguajes A – Opción Ada • Tipos definidos por el usuario • Punteros y árboles procedure Put(A: in Arbol) is begin if A /= null then Put(A.Izq); Put(A.Valor); New_line; Put(A.Der); end if; end Put; Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 12
Seminario de Lenguajes A – Opción Ada • Tipos definidos por el usuario • Punteros y árboles with Text_IO; use Text_IO; procedure Clase6_Arbol is ............. A: Arbol; C: character; begin loop Get(C); exit when C = '.'; Insertar(A, C); end loop; Put(A); end Clase6_Arbol; Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 13
Seminario de Lenguajes A – Opción Ada • Tipos definidos por el usuario • Tipos derivados • Tipo nuevo con las mismas características que el tipo base pero incompatible • Provee protección adicional contra la mezcla indeseada de tipos type PInteger is access integer; subtype SubPInteger is PInteger; type NewPInteger is new PInteger; type NewSubPInteger is new SubPInteger; type NewRango is new integer range 0..100; type Arreglo is array (NewRango range <>) of integer; type NewArreglo is new Arreglo; subtype SubArreglo is Arreglo(1..10); subtype SubNewArreglo is NewArreglo; SNA: SubNewArreglo(20..30); Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 14
Seminario de Lenguajes A – Opción Ada • Tipos definidos por el usuario • Tipos derivados type Registro (Disc: NewRango := 0) is record Campo: Arreglo(1..Disc); end record; type NewRegistro is new Registro; R: Registro; NR: NewRegistro; begin R := (10, (others => 10)); NR := (10, (others => 10)); R:=NR; -- ilegal NR:=R; -- ilegal R := Registro(NR); NR := NewRegistro(R); end Clase6_TiposDerivados; Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 15