ESTRUCTURAS COMPUESTAS

 

Las estructuras compuestas son estructuras de datos basadas en los tipos de datos ya contemplados anteriormente y que el usuario puede componer de la forma más conveniente. Se pueden clasificar en:

 

-          Estructura

-          Campos de bit

-          Unión

-          Enumeración

 

Existen también tipos de datos que el usuario puede definir en base a otros tipos de datos básicos o estructurados empleando la palabra clave “typedef”.

 

ESTRUCTURAS

 

Una estructura es una variable definida por el programador y que está compuesta por un conjunto de variables que se referencian bajo un mismo nombre. Las variables o elementos de la estructura están relacionadas de una forma lógica desde el punto de vista de la información que tratan.

Para poder emplear una estructura es necesario una declaración de la misma mediante la palabra clave struct,  estableciendo así un patrón o plantilla de la estructura que se va a emplear.

 

Formato de declaración de la plantilla:

 

Struct Nombre_estructura {

            Tipo Elemento1;

            Tipo Elemento2;

            ...

            }Lista_variables;

 

Ejemplo:

 

Struct cliente{

            Int dni;

Char  Nom[35];

Char direct[45];

Float cuenta;

}client1, client2, client3;

 

Con esta estructura se han definido 3 variables

 

Con esta sentencia se ha declarado una plantilla del tipo cliente y a la vez se han definido en memoria tres variables client1, client2 y client3 que contienen los elementos del tipo declarado.

 

 

 

 

 

Struct  {

            Tipo Elemento1;

            Tipo Elemento2;

            ...

            }Lista_variables;

 

Ejemplo:

 

Struct {

            Int dni;

Char  Nom[35];

Char direct[45];

Float cuenta;

}client1, client2, client3;

 

b) después de haber realizado la declaración de la estructura

 

Formato:

struct Nombre_estructura lista_variables;

 

Ejemplo:

Struct cliente client4, client5;

 

REFERENCIA A ELEMENTOS

 

A)    Referenciar elementos

 

Para hacer referencia a cada uno de los  elementos de la estructura se emplea al operador .(punto).

 

Nombre_variable_estructura.nombre_elemento

 

Siguiendo el ejemplo anterior, para referenciar los elementos de la variable client1:

 

Client1.dni, client1,nom, client1.direc, client1.cuenta

 

b) Leer elementos:

Se utilizarán las funciones de lectura dependiendo del tipo de datos de cada elemento.

 

Gets(client1.direc);    scanf(“%f”, &client1.cuenta);

 

c) Escribir elementos:

Se utilizarán las funciones de escritura dependiendo del tipo de datos de cada elemento.

 

puts(client1.direc);     printf(“%s”, &client1.cuenta);

 

 

 

 

 

CARGA DE DATOS

 

a- Inicializando en la definición

            Se especifican en el programa los valores de los datos, al definir las variables, mediante una asignación de valores a los elementos expresados por una lista entre llaves.

 

Ejemplo:

 

Struct cliente client1 = { 34567,

                                   “Antonio López Pérez”,

                                   “c/ Mayor 25 –Madrid”,

                                   125000.5

                                   }

Asignando valores

 

b- Asignando valores

            Se asignan directamente los datos a cada uno de los elementos. No se suele emplear excepto cuando se quiere modificar algún valor de uno o varios elementos.

 

Ejemplo:

 

Strcpy(client1.nom, “Antonio López Pérez”);

Strcpy(client1.direc, “C/ Mayor 25 – Madrid”);

Client1.dni= 24564;

Client1.cuenta = 125000.5;

 

También es posible asignar todos los elementos de una variable estructura a otra variable estructura del mismo tipo.

 

Client1 = client2;

 

c- Introduciendo los valores por teclado

 

Se realiza utilizando las funciones de entrada de datos correspondientes al tipo de datos de cada elemento.

 

Scanf(“%d”, &client1.dni);

Gets(client1.nom)

Gets(client1.direc);

Scanf(“%f”,&client1.cuenta);

 

ESTRUCTURAS ANIDADAS

 

En una plantilla de estructura se pueden anidar otras estructuras que deben estar previamente declaradas.

 

 

 

 

Formato:

 

Struct Nombre_estruct1{

            Tipo elemento1;

            Tipo elemento2;

            ...

            };

Struct nombre_estruct2 elementoa;

            Tipo elemento_b;

            Tipo elemento_b;

            ...

            };

struct Nombre_estruct2 Nombre_variable

 

struct dir{

            char calle[25];

            int codpos;

            char población[20];

            }

struct cliente{

            int dni;

            char nom[35];

            struct dir direc;

            float cuenta;

            };

 

 struct cliente client1;

 

Para referenciar elementos de la estructura anidada se emplea sucesivamente el operador punto.

 

Nombre_variable.Elemento_a.Elemento1

 

Client1.direc.calle      client1.direc.codpos

 

ARRAY DE ESTRUCTURAS

 

Las estructuras, igual que los demás tipos de datos, pueden formar parte de un array. Cuando se define la variable del tipo estructura se indica por un índice el tamaño del array.

 

Struct nombre_estructura nombrevariable[tamaño];

 

Struct cliente clienttab[150];

 

Con esta definición se crea una tabla de 150 elementos, todos del tipo cliente. La referencia a un elemento de la tabla se hará usando el índice correspondiente.

Clienttab[5].nom

 

El tratamiento de los arrays de estructuras es similar al de los arrays de elementos del tipo básico, teniendo en cuenta la forma de referenciar sus elementos.

 

PUNTEROS Y ESTRUCTURAS

 

Los punteros a estructuras funcionan del mismo modo que los punteros a otros tipos de variables pero se emplea un operador específico para referenciar los valores de sus elementos.

 

a-      Definiciónde un puntero a un tipo de estructura

 

Struct nombre_plantilla *nombre_puntero;

 

Ejemplo:

 

            Struct cliente *pclient;

            Struct cliente *pclient;

 

b-     Asignar una dirección al puntero

 

Formato:

En el caso de una variable simple:    Nombre_puntero = &Nombre_variable_estructura

En el caso de una tabla de estructuras: Nombre_puntero = nombre_tabla_estructuras

 

Ejemplo:

            Pclient =&client1;

            Pclient = clienttab;

 

c) Referencia a un valor de la variable estructura apuntada

Se debe utilizar el valor de la variable estructura apuntada ->

 

Ejemplo:

            Pclient -> nom

            Pclient[4] -> direc

 

Referencia a un elemento de una estructura anidada

 

            Pclient -> direc.codpos

 

FUNCIONES Y ESTRUCTURAS

 

El uso de funciones en relación con las estructuras puede ser de dos formas, que dependen de los casos de pasar solamente elementos de la estructura o la estructura completa.

 

 

 

 

 

 

a)Paso de elementos de una estructura

 

Paso por valor:

 

Se pasa a la función el valor de cada uno de los elementos.

 

Llamada a la función:

Funcion(client1.cuenta, client1.dni);

 

Definición de la función:

Void funcion1(float cuenta, int ident){..................}

 

Paso por referencia:

 

Se pasa a la función la dirección de cada uno de los elementos.

 

Llamada al a función:

Funcion2(cliente1.nom, &empleado1.cuenta);

 

Definición de la función:

Void función2(char *pnom, float *pcuenta){.....................}

 

 

b) Paso de toda la estructura

 

Es conveniente que la plantilla de la estructura esté declarada a nivel global.

 

Paso por valor:

 

Se pasa a la función el valor de todos los elementos de la estructura.

 

Llamada a la función

Funcion3(cliente1);

 

Definición de la función:

Void funcion3(struct cliente clien){...........................}

 

Paso por referencia:

 

Se pasa a la función la dirección de la estructura.

 

Llamada a la función.

Funcion4(&cliente1);

 

Definición de la función:

Void funcion4(struct cliente *pclien){........................}

 

 

 

 

Llamada a la función:

Cliente1 =  funcion5();

 

Definición dela función:

Struct cliente funcion5( )

{

            struct cliente client;

            ....

            return client;

            }

 

                       

CAMPO DE BITS

 

Los campos de bits son estructuras compuestas de elementos cuyo tamaño se expresa con uno o más bits. El compilador guarda la información de los campos de bits en la menor unidad de memoria posible. Con este tipo de estructura es posible acceder a los bits de un byte o de una palabra, almacenar variables lógicas en el menor espacio posible y realizar tratamientos sobre los bits deun dispositivo.

            La definición de estructura con campos de bits se realiza de forma similar a las estructuras pero expresando la longitud de cada campo con un número de bits.

 

Struct Nombre_Estructura{

                        Tipo campo1:longitud1;

                        Tipo campo2:longitud2;

                        ......

                        Tipo campon:longitudn;

                        }Lista_variables;

 

El tipo de dato de cada campo de bits debe ser un int o unsigned int y la longitud es el tamaño en bits que tiene cada campo( en un PC es de 1 a 16 bits). Si la longitud es 1 el tipo del campo debe ser necesariamente unsigned, pues no puede contener un valor y un signo al mismo tiempo.

 

Ejemplo:

Struct funcion

{

            unsigned depart: 4;

            unsigned sexo: 1;

unsigned estado: 2;

unsigned situacio: 1;

}funcionario:

 

Con la variable funcionario (utilizando campos de bits) se ha reunido información en un solo byte, mientras que si hubieran utilizado campos de tipo int se habrian necesitado por lo menos 8 bytes.

 

Para referenciar un campo de bits se emplea el mismo procedimiento que en las estructuras.

 

Nombre_variable_estructura.Nombre_campo

 

Funcionaro.situacion

 

No es obligatorio expresar todos los bits de un byte o de una palabra:

 

Ejemplo:

 

Struct func{

                        Unsigned departamento: 4;

                        Unsigned situación: 1:

            }funcionario;

 

El uso de los campos de bits tiene una serie de limitaciones:

 

1.      No se puede obtener la direcciçon de un campo de bits, pues la menor unidad direccionable es el byte.

2.        Se pueden producir problemas con la portabilidad, pues en cada mçaquina puede ser distinto el orden de funcionamiento de los campo, de izquierda a derecha o viceversa.

3.        En algunos compiladores, los campos de bits no pueden formarse como arrays.

 

LAS UNIONES

 

Una uniçon es una estructura en la que sus elementos ocupan la misma posiciçon de memoria. El tamaño de la memoria es el correspondiente al elemento mayor de la uniçon y los demças elementos comparten dicha memoria. En cada momento de la ejecución