En el capítulo anterior se comenzó a analizar los datos estructurados, en los que se expusieron tablas y demostradores. En esta ocasión analizaremos tres nuevos tipos de datos: estructuras o registros, texturas y enumerados.
Mientras que en la tabla todos los datos son del mismo tipo, en la estructura o registro hay un conjunto de datos que no deben ser del mismo tipo. Los datos que componen la estructura corresponden a una unidad o elemento, el tipo de datos más común que se almacena en el disco. En el fichero de la biblioteca, por ejemplo, hay un registro (o estructura) de cada libro, donde hay código, título, escritor, número de páginas, etc. (datos de distinto tipo).
Dado que es imposible utilizar un índice para determinar un dato en la estructura comparándolo con las tablas, a cada dato o campo se le asigna un nombre, por lo que para identificar un dato se deberá especificar la estructura y los nombres del campo.
El lenguaje C utiliza la palabra clave y el operador “struct” para manejar estructuras.
Al igual que en otros tipos de datos, diferenciaremos la definición y uso de las estructuras, pero en este caso la definición se realizará en dos pasos, ya que mientras en el primero se define la estructura abstracta con los campos correspondientes (definición de la estructura), en el segundo se definirá la (s) variable (s) de este tipo.
En el programa 1 definimos y utilizamos el registro del fichero de la biblioteca.
Por lo tanto, como se puede observar, los nombres y tipos de los campos de la definición de la estructura aparecen entre los distintos reyes y}, struct y nombre por delante y por detrás. En el uso, por el contrario, una vez definida inicialmente la variable de este tipo, se especifica la variable de representación de los campos, el operador • y el nombre del campo.
Si existen dos variables del mismo tipo de estructura, la asignación entre ellas con unos compiladores es posible por una sola asignación, mientras que con otros se debe completar zonalmente. Sin embargo, en contra de lo que ocurría con las tablas, el nombre de una variable de tipo estructural indica su valor y no su referencia. Por lo tanto, al determinar una estructura como parámetro se le especificará previamente y lo que se intercambiará será su índice.
Se pueden combinar estructuras y demostradores. Por un lado, el componente de una estructura puede ser un demostrador y, por otro, como ya se ha comentado anteriormente, en la estructura se utilizan demostrativos, sobre todo en las llamadas de funciones.
A modo de ejemplo, pensemos que para escribir la estructura anterior, la de la biblioteca, tenemos una función y como parámetro la referencia de la estructura del libro. Esta función se define en el programa 2 y en lugar de utilizar el operador • se utilizará el operador Previa, ya que (* demostrador). el campo y el campo de demostradores son equivalentes a C. En el primer programa se sustituiría la orden printf por la siguiente llamada:
print_lib_bat ( liburu)
La utilización de demostradores estructurales permite referenciar en una estructura otra variable de la misma estructura. Esto es muy utilizado para definir y utilizar listas, filas, pilas, etc.
En el programa 3 se presenta una estructura y una función utilizada para definir el árbol binario de strings. La función escribe el árbol de izquierda a derecha utilizando el algoritmo recursivo.
Los mismos agentes analizados en las estructuras de definición y uso de los embalajes (. A pesar de la utilización de - ), el objetivo de este tipo de datos es radicalmente distinto, ya que aunque los campos descritos en ambos pueden ser de distinto tipo, en las recopilaciones estos campos son interpretaciones diferentes del tipo que corresponde a un único campo, mientras que en las estructuras son componentes de un conjunto. Por tanto, al leer un dato de tipo recopilación sólo se podrá utilizar uno de los campos definidos en el mismo. Aunque este tipo se utiliza poco, su uso más extendido se debe a que se gasta menos memoria para tratar lo leído de un fichero como un tipo diferente de datos. Por ejemplo, en el programa 4 se imprime un trozo de memori de 80 bytes, pero según un código son 80 caracteres o 20 números enteros.
Como se ve en el programa, las envolturas se pueden combinar con exhibidores y tableros. De esta forma se ha enviado el índice de una recogida a la función y los campos de la recogida son tablas. Las envolturas también se pueden combinar con estructuras, ya que es posible que dentro de una estructura haya alguna que otra, y viceversa, que haya estructuras dentro de la envoltura.
Este tipo de datos se utiliza cuando el valor posible de una variable es uno de los componentes de un grupo corto. Lo que se hace en este tipo se puede hacer con caracteres o números enteros (asignando un código a cada valor), pero para que el programa sea legible ocurre un tipo de dato muy apropiado. La definición de la lista se compone de la palabra clave enum, el nombre del tipo y los posibles valores, separados por comas y entre llaves.
En el programa 5 se puede ver su aplicación con una función que aplica una tarifa diferente según el día de la semana:
Como dijimos en el anterior, C no tiene capacidad para definir nuevos tipos de datos, pero algo parecido se puede hacer con la posibilidad de definir sinónimos a través del operador typedef.
Con este método los programas mejoran la legibilidad, pero no se crea un nuevo tipo de datos real, ya que la única conclusión es que en tiempos de compilación se trata de una mera traducción de strings
De esta forma se puede definir el tipo de datos booleano como se puede observar en el Programa 6: