Unidad 10 TIPOS DE DATOS DEFINIDOS POR EL USUARIO Objetivos n n n n Saber definir y utilizar tipos de datos complejos, struct, union, enum. Saber acceder a un campo de una variable struct y union. Saber elegir un tipo de dato struct para un problema dado. Saber utilizar arrays de estructuras para resolver un problema dado. n n n n n Saber pasar estructuras a funciones. Saber definir estructuras jerárquicas. Conocer los campos de bits. Integrar los conceptos metodológicos conocidos con los nuevos tipos de datos. Conocer las ventajas de definir nuestros propios tipos de datos. 2 1 Contenidos n n INTRODUCCIÓN ESTRUCTURAS q q q q q q q q q q n UNIONES q Definición de un tipo estructurado Declaración de variables de tipo estructura Inicialización de variables estructuradas Asignación de variables estructuradas Acceso a elementos individuales de la estructura Punteros a estructuras Arrays de estructuras Paso de estructura a funciones Funciones que devuelven estructuras o punteros a estructuras Estructuras autoreferenciadas q n ENUMERACIONES q q n n Declaración de una unión Declaración de variables Declaración de plantilla Declaración de variables CAMPOS DE BITS EL ESPECIFICADOR typedef Y LOS TIPOS DEFINIDOS POR EL PROGRAMADOR 3 ESTRUCTURAS n Definición: tipo abstracto de datos compuesto por elementos con nombres, de igual o distintos tipos de datos, llamados miembros o componentes y referenciados bajo un mismo identificador. Declaración de una estructura [<Mod_Alm>] struct [nombre_estructura] { tipo nombre_objeto 1; tipo nombre_objeto 2; •Son definiciones de plantillas, no reservan ....... espacio en memoria. ....... •Si se omite nombre_estructura, se toma como anónima y las variables de este tipo deben tipo nombre_objeto n; crearse a continuación de la declaración, no } [var1][,var2]; podrán pasarse como parámetros. •Miembros únicos dentro de la estructura. 4 2 Declaración de variables n n Después de haber realizado la declaración de la plantilla. struct nombre_estructura VAR 1, VAR N; En la declaración de la plantilla. struct [nombre_estructura] { •Se recomienda que las plantillas sean ....... globales. • El nombre_estructura comenzará por T ....... para mejorar la legibilidad del código. } VAR 1, VAR N; • Se lee y escribe cada miembro por separado. 5 Inicialización struct Tf_naci{ int dia; int mes; int anno; }; struct Tdir { char nombre [30]; char calle [30]; char ciudad [20]; char estado; unsigned long int DNI; int codigo; struct Tf_naci nacimiento; }; La estructura anterior nos servirá para crear una variable de tipo Tdir e inicializarla. struct Tdir direccion={ ”PEPE”, “SIERPES”, ”SEVILLA”, ‘D’, 30401326, 41001,2,12,2005 }; 6 3 Asignación Se puede asignar directamente una variable struct a otra del mismo tipo . Ejemplo: siendo direc y direccion variables Tdir, es válido en C: direc = direccion; 7 Referencia a elementos de una estructura n “Selector de componente directo” ‘.’ Nombre_variable . nombre_objeto_miembro q Ejemplos: direc.codigo printf(“%d”,direcc.codigo); gets (direcc.calle); int codigo_postal =direcc.codigo; q acceso a miembros de estructuras de estructuras variable.miembro.submiembro Ejemplo: printf("\n %s, fecha: %d/%d/%d", dir.nombre , dir.nacimiento.dia, dir.nacimiento.mes, dir.nacimiento.anno); q acceso a miembros arrays variable.miembro_array[indice] Ejemplo: ver ejemplo diapositiva 9 PEPE, fecha: 2/12/2005 direccion.ciudad[i]=toupper(direccion.ciudad[i]); n “Selector de componente indirecto” ‘->’ (Para punteros) 8 4 Inicialización struct Tf_naci{ int dia; int mes; int anno; }; struct Tdir { char nombre [30]; char calle [30]; char ciudad [20]; char *estado; unsigned long int DNI; int codigo; struct Tf_naci nacimiento; }; La estructura anterior nos servirá para crear una variable de tipo Tdir e inicializarla. char aux=‘D’; struct Tdir dir={ ”PEPE”, “SIERPES”, ”SEVILLA”, &aux, 30401326, 41001,2,12,2005 }; 9 Punteros a estructuras n Declaración Formato: struct tipo_estructura * Nombre_puntero_structura; Ejemplo: struct Ttrab trabajador, *Ptrabajador = NULL; ……… // durante este proceso carga valor en trabajador Ptrabajador=&trabajador; // •Recuerda que un puntero debe tener un dirección existente o NULL 10 5 Punteros a estructuras n Referencia a elementos de una variable estructurada puntero. Formato: Nombre_Puntero_Estructura ->Nombre_Elemento Ejemplos (basados en diapositiva 9): struct Tdir *ptvar, var= direccion; //declaración Ptvar=&direccion; ptvar->nacimiento.mes // ptvar->miembro.submiembro ptvar->ciudad[0] // ptvar->miembro[exp. índice] *var.nombre || *var.estado //*var.ptmiembro (modificando diapositiva 9) ptvar->estado // ptvar->ptmiembro ++ptvar //incrementa dirección ptvar- sólo en arrays de estructuras ++ptvar->codigo || ++(ptvar->codigo) // suma 1contenido de codigo ++*ptvar->estado //incrementa en 1 el contenido de estado Ver Ropa_str.cpp 11 Array de estructuras n Declaración. struct nombre_tipo_estructura nombre_array [N] [={ n }]; Ejemplos de acceso para: struct Tdir direccion[n]; direccion[i]; direccion[i].nombre; direccion[i].nombre[j]; 12 6 Paso de estructura a funciones. A.- Pasar elementos individuales. n Por valor . Por referencia. Por dirección. § § § § § pasando la dirección del componente de la variable estructurada pasando un puntero al componente de la variable estructurada Ver página 381 13 Paso de estructura a funciones. n B.- Paso de variables completas. § § § Por valor . Por referencia . Por dirección. § § pasando la dirección de la variable estructurada pasando un puntero a una variable estructurada Ver página 385 14 7 Uniones n Definición: Está formada por un conjunto de objetos de igual o distinto tipo de dato, que se referencian bajo un mismo nombre. q q q n Ver ejem. pag. 395 Ropa.cpp Sus elementos comparten la misma zona de memoria, por lo que sólo uno estará activo. La cantidad de bytes que ocupe el tipo union será el tamaño del componente más largo. Se suelen utilizar cuando se desea almacenar varios elementos de forma excluyente, es decir, no ambos a la vez Declaración de un tipo unión union NombreUnion { tipo NombreMiembro 1; ...... tipo NombreMiembro n; }[var]; •Son definiciones de plantillas, no reservan espacio en memoria. •Si se omite NombreUnion, se llama anónima. Las variables de este tipo deben crearse a continuación de la declaración y no podrán pasarse como parámetros. •Miembros únicos dentro de la unión. 15 Enumeraciones n Definición: Es un conjunto de constantes enteras con nombre, que se referencian bajo un identificador común. q n La definición de un tipo enumerado especifica todos los valores posibles que una variable de ese tipo puede tomar. Declaración de un tipo enum enum NombreEnumeración { nombre1 [= valor1], .................... nombreN [= valorN], }[var]; •La lista de nombres son constantes enumeración o enumeradores. •Los valores son opcionales, pero en ausencia de inicializadores explícitos, toman valores enteros 0, 1, 2, ..., etc. •Si algún enumerador tiene asignado un valor, toma dicho valor, en caso contrario, adquiere el valor entero siguiente del enumerador anterior. •Los inicializadores pueden tomar valores positivos, negativos y expresiones. 16 8 Ejemplos n enum Marca {Seat, Renault=Seat-1, Peugeot= Renault+5}; q n enum Marca { Seat = 1, Renault, Peugeot}; q n Seat vale 0, Renault –1 y Peugeot 4. Seat vale 1, Renault 2 y Peugeot vale 3. Varios identificadores pueden tomar el mismo valor, pero cada identificador sólo puede usarse en un tipo enumerado. q q q Por ejemplo: enum color {naranja, rojo = 1, naranja, encarnado = 1}; enum fruta {kiwi, fresa, naranja, pera}; //error naranja está definido en el enum anterior • Ocupan 2 bytes en memoria, que es lo que ocupa un entero. 17 Las teorías son estructuras de ideas que explican e interpretan los hechos. Stephen Jay Gould 18 9