¿Qué es programar?: Tipos de datos y estructuras de datos abstractos

Vamos a seguir con un poco de teoría, pero esta vez con algo que se me quedó un poco en el tintero, los tipos de datos. Son una de las cosas más importantes en el mundo de la programación, ya que como comenté en el capítulo anterior, los tipos de datos permiten saber cómo se usa la información que maneja una máquina. Sin tipos de datos, la tarea de comprobar de cómo se trata la información recaería en el programador, lo cual a la larga sería un engorro si encima no hubiera un estándar.

Para ello los lenguajes implementan tipos básico o tipos primitivos, los cuales permiten guardar los elementos más básico en memoria. Algunos de los cuales son los siguientes:

  • integer: Representa un número entero. Dependiendo de la implementación del lenguaje, en rango que puede es de 2147483647 a -2147483648 si se usa 32 bits en la memoria para representarlo; o 9223372036854775807 a -9223372036854775808 si se usa 64 bits. Las operaciones que normalmente se permiten son cambio de signo, aritmética entera (suma, resta, multiplicación y división entera), aritmética modular (que permite obtener el resto de una división) y algunos lenguajes permiten incluso potencias enteras. También se pueden comparar mediante operadores de igualdad o desigualdad.
  • float: Llamado en español coma flotante, permite representar números muy grandes (como 10120) o muy pequeños (como 0.000000241). Para ello usa una representación en binario muy parecida a la notación científica. La diferencia que nos podemos encontrar es la precisión con la que permite mostrar, siendo precisión simple si usa 32 bits y precisión doble si usa 64 bits. Las operaciones que se permiten son cambio de signo, aritmética flotante (suma, resta, multiplicación y división en coma flotante) y potencias y raíces cuadradas. Algunos lenguajes permiten también realizar comparaciones de igualdad o desigualdad.
  • char: Se usa para representar letras o caracteres escritos. Las primeras implementaciones estaban basadas en lo que se conoce como estándar ASCII, que con solo 8 bits permite representar todos los símbolos que se usan en inglés y alguno más de otras lenguas. Actualmente esto está cambiando, y cada vez los lenguajes se intentan adaptar al estándar Unicode, que permite representar todos los símbolos de todos los lenguajes, pudiendo escribir programas en diferentes idiomas.
  • boolean: Permite representar valores de certeza verdadero o falso con los que se puede operar algebraicamente en el espacio booleano o binario, es decir, permite representar operaciones lógicas que se podrán usar en las estructuras lógicas. Las operaciones que se suelen permitir son la negación, la disyunción (o suma booleana) y la conjunción (o multiplicación booleana).

Añadidos a estos tipos básicos, existen algunas estructuras que permiten organizar o tener un nivel de abstracción mayor:

  • array: Estructura que puede contener una serie de datos, todos del mismo tipo. Su tamaño viene fijo a la hora de crear, no pudiendo variarse luego. El acceso de los datos se realiza mediante un índice, que es el número de la posición en la que está. Los datos de texto en muchos lenguajes están realizados así, ya que no dejan de ser un array de caracteres.
    texto : array de 10 caracteres.
    texto = “Hola”.
    Imprimir texto[2]. <- Imprime “o”
  • record: Estructura que puede contener datos en su interior, los cuales son diferenciados por un nombre que se llama campo.
    registro persona:
        nombre : array de 32 caracteres;
        edad : entero;
        peso : flotante;
        altura : entero;
        genero : caracter
    fin.
    
    ernesto : persona = registro:
        nombre = “Ernesto”;
        edad = 26;
        peso = 78,3;
        altura = 181;
        genero = “H”
    fin.
    Imprimir ernesto.edad. <- Imprime “26”
  • variantParecido a un registro. La diferencia radica en que solo se puede usar un valor a la vez.
    variante numero:
        zonaEntera : entero;
        zonaReal : flotante;
    fin.
    
    pi : numero.
    pi = 3.
    Imprimir tipo(pi) <- Imprime “entero”
    pi = 3,141592.
    Imprimir tipo(pi). <- Imprime “flotante”
  • pointerEstructura que permite hacer una referencia a un dato guardado en memoria.
    a : entero = 1.
    punteroA : puntero de entero = referencia a.
    
    Imprimir a. <- Imprime “1”
    dato punteroA = 5.
    Imprimir a. <- Imprime “5”

Puede parecer difícil al principio, pero en cuanto programemos le vamos a pillar el truco enseguida. Aún así, hay algunos lenguajes que añaden aún una capa de abstracción más, creando unos tipos aún más complejos, que, en esencia, son creados con los tipos básicos y las estructuras que te he enseñado. Se llaman tipos abstractos de datos (TDA en inglés), y de los que podemos destacar:

  • Lista: Es un tipo muy parecido a la estructura array, ya que permite tener guardar un conjunto de datos, todos del mismo tipo. La diferencia radica en que muchas implementaciones permiten que las listas tengan un tamaño variable, pudiéndose agrandar o encoger, por lo que no están tan limitados como los arrays. Existen varios subtipos de lista, entre los que destaca las listas ordenadas (contienen sus datos posicionados en un cierto orden).

    Lista ordenada

    Ejemplo de lista ordenada

  • Pila: Sigue el principio LIFO (Último en entrar, primero en salir). Solo permite obtener el último dato insertado, por lo que si quieres obtener una posición intermedia tienes que extraer los datos que hay encima.

    Pila

    Operaciones que se pueden realizar en una Pila. Para obtener el número 1, habría que desapilar el 2 y el 6.

  • Cola: Sigue el principio FIFO (Primero en entrar, primero en salir). Solo permite obtener el primer dato insertado, los demás datos se van insertando detrás.

    Cola

    Operaciones que se pueden realizar en una Cola. Para obtener el número 1, habría que desencolar el 5, el 3 y el 2.

  • Conjunto: Funciona de forma similar que la forma matemática, es decir, es una colección sin un cierto orden de datos no repetidos. Con esto, puedes añadir elementos si no están el conjunto, así como comprobar si hay un cierto elemento en el conjunto, todo sin necesitar posiciones.
  • Mapa: También llamado lista asociativa, permite asociar un dato (la clave), con otro dato (el valor). Una de las implementaciones más comunes son los mapas hash, que funcionan mediante un método que devuelve una representación o id del dato que se quiere introducir, y este id se usa para saber en qué posición ponerlo.

Existen otros más, como los grafos o los árboles, pero la matemática que hay detrás es o muy complicada y me llevaría mucho tiempo explicarla. Aún así podéis mirar la documentación del del lenguaje que uséis, ya que os explicará más en detalle los tipos que contiene de base al empezar a programar.

Anuncios

Un pensamiento en “¿Qué es programar?: Tipos de datos y estructuras de datos abstractos

  1. Pingback: Aprende a programar un videojuego: desde lo básico a lo avanzado | El blog de NEKERAFA

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s