Skip to Content

Tipos concretos

Los tipos de datos concretos son aquellos que:

  • Son nativos del lenguaje de programación.
  • Es un concepto dependiente del lenguaje de programación.
  • Algunos ejemplos son enteros, arreglos, cadenas de texto, etc.

En el lenguaje de la materia existen distintos tipos de datos concretos.

Tipos enumerados

Un tipo enumerado consiste en una serie finita de constantes, únicos en su tipo.

type  E=enumerateelem1elem2elemkend  enumerate\begin{aligned} &\type \; E = \enumerate \\ &\quad elem1 \\ &\quad elem2 \\ &\quad \ldots \\ &\quad elemk \\ &\bfend \; \enumerate \end{aligned}

De esta forma se definen únicamente los kk elementos que pertenecen al tipo EE.

Si quisieramos usar el elemento elem1elem1 de un tipo enumerado EE, sería:

var  v:Ev:=elem1\begin{aligned} &\var \; v : E \\ &v := elem1 \end{aligned}

Puede ser útil para ciclos for\for dodne el índice tome el valor de un tipo enumerado.

for  i:=elem1  to  elemk  do    od\for \; i := elem1 \; \too \; elemk \; \do \; \ldots \; \od

Tuplas

Las tuplas representan productos cartesianos de distintos tipos. También se conocen como registros/estructuras.

type  personType=tuplename:stringage:natheight:realend  tuple\begin{aligned} &\type \; personType = \tuple \\ &\quad name : \string \\ &\quad age : \nat \\ &\quad height : \real \\ &\bfend \; \tuple \end{aligned}

personTypepersonType corresponde al producto de los tipos string\string, nat\nat y real\real. Donde namename, ageage y heightheight son los campos de la tupla.

Para acceder a los campos de una tupla se hace mediante el operador ..

{    Declaracioˊn y asignacioˊn a campos de tupla    }var  p:personTypep.name:="Juan"p.age:=20p.height:=1.80{    Acceder a campo de tupla    }p.name\begin{aligned} &\{- \;\; \textnormal{Declaración y asignación a campos de tupla} \;\; -\} \\ &\var \; p : personType \\ &p.name := \textnormal{"Juan"} \\ &p.age := 20 \\ &p.height := 1.80 \\ &\\ &\{- \;\; \textnormal{Acceder a campo de tupla} \;\; -\} \\ &p.name \\ \end{aligned}

En la mayoría de lenguajes, cuando se ejecuta un programa a los elementos de un tipo tupla estos son alojados en espacios de memoria contiguos, su espacio es igual a la suma de los espacios que ocupan sus campos.

Arreglos

Los arreglos son colecciones de tamaño fijo de elementos del mismo tipo.

Su declaración es:

{    Arreglo unidimensional    }var  a:array[N1M1]  of  T{    Arreglo multidimensional    }var  a:array[N1M1,  ,  NkMk]  of  T\begin{aligned} &\{- \;\; \textnormal{Arreglo unidimensional} \;\; -\} \\ &\var \; a : \array [N_1 \ldots M_1] \; \of \; T \\ &\\ &\{- \;\; \textnormal{Arreglo multidimensional} \;\; -\} \\ &\var \; a : \array [N_1 \ldots M_1, \; \ldots, \; N_k \ldots M_k] \; \of \; T \\ \end{aligned}

Donde:

  • aa es el nombre de la variable,
  • kk es la cantidad de dimensiones del arreglo.
  • N1,M1,,Nk,Mk  N_1,M_1, \ldots, N_k,M_k \; son números o tipos enumerados que representan los límites de cada dimensión.
  • TT es el tipo de los elementos del arreglo.
{    Asignacioˊn a elemento de arreglo    }a[i1,  ,  ik]:=E{    Acceder a elemento de arreglo    }a[i1,  ,  ik]\begin{aligned} &\{- \;\; \textnormal{Asignación a elemento de arreglo} \;\; -\} \\ &a[i_1, \; \ldots , \; i_k] := E \\ & \\ &\{- \;\; \textnormal{Acceder a elemento de arreglo} \;\; -\} \\ &a[i_1, \; \ldots , \; i_k] \end{aligned}

Donde EE es una expresión de tipo TT.

Algunos ejemplos:

var  precios:array[1..10]  of  int{    arreglo de 10 elementos  precios[1],precios[2],,precios[10]    }var  matriz:array[0..25,5..10]  of  char{    arreglo de caracteres de dos dimensiones  (26×6):matriz[0,5],  matriz[0,6],  matriz[0,7],  ,  matriz[0,10]matriz[1,5],  matriz[1,6],  matriz[1,7],  ,  matriz[1,10]matriz[25,5],  matriz[25,6],  matriz[25,7],  ,  matriz[25,10]}{    Recorriendo  matriz    }for  i:=0  to  25  dofor  j:=5  to  10  domatriz[i,j]:="A"odod\begin{aligned} &\var \; precios : \array [1..10] \; \of \; \intt \\ &\{- \;\; \textnormal{arreglo de 10 elementos} \; precios[1], precios[2], \ldots , precios[10] \;\; -\} \\ \\ &\var \; matriz : \array [0..25,5..10] \; \of \; \char \\ &\{- \;\; \textnormal{arreglo de caracteres de dos dimensiones} \; (26 \times 6): \\ &matriz[0,5], \; matriz[0,6], \; matriz[0,7], \; \ldots , \; matriz[0,10] \\ &matriz[1,5], \; matriz[1,6], \; matriz[1,7], \; \ldots , \; matriz[1,10] \\ &\ldots \\ &matriz[25,5], \; matriz[25,6], \; matriz[25,7], \; \ldots , \; matriz[25,10] \\ &- \} \\ &\\ &\{- \;\; \textnormal{Recorriendo} \; matriz \;\; -\} \\ &\for \; i := 0 \; \too \; 25 \; \do \\ &\quad \for \; j := 5 \; \too \; 10 \; \do \\ &\quad \quad matriz[i,j] := \textnormal{"A"} \\ &\quad \od \\ &\od \end{aligned}

Punteros

Dado un tipo TT un puntero a TT es un tipo de datos que representa el lugar de memoria donde se encuentra almacenado un valor de tipo TT.

Por ejemplo, declarar un puntero a un entero:

var  p:pointer  to  int\var \; p : \pointer \; \too \; \intt

Mediante punteros se puede manipular la memoria disponible al ejecutar un programa.

Para reservar un nuevo bloque de memoria donde pueda almacenarse un elemento de tipo TT se utiliza el operador alloc\alloc. Siguiendo el ejemplo anterior:

alloc(p)\alloc (p)

Para acceder al valor en el bloque de memoria apuntado por pp se utiliza el operador \star

p:=10\star p := 10

Decimos que pp apunta al valor 1010.


Para liberar un bloque de memoria que haya sido reservado antes se usa free\free

free(p)\free (p)

Luego de liberar un bloque de memoria, el puntero pp no apunta a ningún lugar. Por lo que no se puede saber que valor tiene p\star p.

La constante utilizada para representar punteros que no apuntan un lugar es null\null

p:=nullp := \null

Analizando las posibles situaciones de: var  p:pointer  to  personType\var \; p : \pointer \; \too \; personType


punteros
  • (1)(1): el valor de pp es null\null, no señala a una posición de memoria.

En esta situación no se señala ningún lugar de memoria, no tiene sentido acceder a ella con p\star p.

  • (2)(2): la posición de memoria señalada por pp no está reservada.

En esta situación el valor de pp es inconsistente, no debe ser utilizado/accedido. Ya que no se sabe que valor está guardado en memoria (modificarlo puede causar errores o corromper datos).
Los punteros en esta situación se llaman referencias o punteros colgantes (dangling pointers).

  • (3)(3): el valor de pp es la dirección de memoria donde se aloja personTypepersonType después de alloc(p)alloc(p).

En esta última situación, p\star p denota la tupla personTypepersonType señalada por pp.
Por lo que podemos acceder a sus campos p.name\star p.name, p.age,p.height\star p.age, \star p.height o asignar nuevos valores a ellos.

Otra notación que reemplaza los operadores (),(.)(\star), (.) para acceder a los campos de una tupla es \rightarrow

pname:="Juan"page:=20pheight:=1.80\begin{aligned} &p \rightarrow name := \textnormal{"Juan"} \\ &p \rightarrow age := 20 \\ &p \rightarrow height := 1.80 \end{aligned}

Si por ejemplo, tuvieramos una variable qq tal que q:=pq := p entonces qq y pp apuntan al mismo lugar de memoria, esto es llamado aliasing. Si uno de los punteros modifica el valor de la memoria, el otro puntero también verá el cambio.

Los punteros permiten decidir exactamente cuando reservar espacio en memoria y cuando liberarlo.

Última vez actualizado el