UNIDAD 4 ESTRUCTURAS Y UNIONES Programación Primavera 2010 Contenido Definición de estructura Procesamiento de una estructura Tipos de datos definidos por el usuario (typedef) Estructuras y apuntadores Paso de estructuras a una función Uniones Enumeraciones Definición de Estructuras Una estructura es una colección de una o mas variables, de tipos posiblemente diferentes, agrupadas bajo un solo nombre Las estructuras nos ayuda a organizar datos complejos ya que nos permite el manejo de una grupo de datos como si fueran una unidad Las estructuras son comúnmente conocidas como registros. Definición de estructura Cada uno de los datos que componen la estructura es denominado campo y se le identifica con un nombre único. Ejemplo: Empleado en una compañía tiene varios datos asociado a el tales como Nombre Nivel Salario Domicilio Ejemplo Por cada alumno de una universidad se requiere almacenar la siguiente información: Matricula (entero) Nombre (cadena de caracteres) Carrera (cadena de caracteres) Promedio (real) Domicilio (cadena de caracteres) Campos Alumno Matricula Nombre Carrera Promedio Domicilio Declaración de la Estructura La estructura se declara utilizando la palabra reservada struct seguida de la lista de campos entre llaves Ejemplo: struct alumno{ int matricula; char nombre[30]; char carrera[30]; float promedio; char domicilio[30]; }; Acceso a campos Para acceder a cada uno de los campos que componen la estructura debemos utilizar el operador punto El acceso se realiza de la siguiente manera nombre_variable.campo Ejemplo: struct alumno A; gets(A.nombre); Inicialización de estructuras Las estructuras pueden ser inicializadas de la siguiente manera struct alumno A = {120,”Maria”,”Contabilidad”,8.9, “Niño Artillero 120”}; Alumno Matricula Nombre Carrera Promedio Domicilio 120 Maria Contabilidad 8.9 Niño Artillero 120 Ejemplo struct fecha{ int day; int month; int year; }; struct fecha today; today.day = 13; today.month = 4; today.year = 2010; fecha day month year Ejemplo struct alumno{ int matricula; char nombre[30]; struct fecha birth; } struct alumno alumno matricula nombre fecha A={120,”Hugo”,4,12,1970}; printf("%d/%d/%d\n", A.birth.day, A.birth.month, A.birth.year); día mes año Ejercicio Declare una estructura que contenga los siguientes datos de una cuenta bancaria de cuenta tipo de cuenta nombre del titular Saldo inicialice los datos para que contenga 0589465 Ahorros Numero Martin Jiménez 1085.25 Incremente el saldo en 2000.00 pesos Typedef La palabra reservada typedef nos permite definir alias o sinónimos para tipos de datos existentes. Al crear estos alias podemos utilizar nombres mas cortos para los tipos de datos que estamos definiendo. Ejemplo: typedef struct{ int day; int month; int year; } date; date hoy; Ejercicio Utilizando typedef define la siguiente estructura de los empleados de una empresa Nombre de empleado Departamento en la empresa Sueldo Domicilio Calle Numero Código Postal Localidad Primero deberás definir la estructura del domicilio con los siguientes datos Domicilio Calle Numero Código Postal Localidad Arreglo de Estructuras Un arreglo de estructuras se define de la siguiente manera typedef struct{ char name[30]; int matricula; float promedio }alumno; alumno lista[50]; Para acceder a los campos de cada registro usamos el operador punto de la siguiente forma for(i = 0; i < size; i++) { printf("Nombre del alumno:"); gets(lista[i].nombre); printf("Matricula: "); scanf("%d",&lista[i].matricula); printf("Promedio: "); scanf("%f",&lista[i].promedio); fflush(stdin); } Ejemplo Realice un programa que lea 10 registros de alumnos. Cada registro deberá contener los siguientes datos Nombre del alumno Matricula Promedio El programa deberá llenar los 10 registros y mostrar los datos Después deberá ser capaz de buscar un alumno por número de matricula y desplegar sus datos Lectura void lectura(alumno lista[], int n) { int i; for(i = 0; i < n; i++) { printf("Registro No. %d\n",i); printf("Nombre del alumno: "); gets(lista[i].nombre); printf("Matricula: ");scanf("%d",&lista[i].matricula); printf("Promedio: fflush(stdin); } } ");scanf("%f",&lista[i].promedio); Impresión void imprime(alumno lista[], int n) { for(int i = 0; i < size; i++) { printf("Nombre del alumno: %s\n",lista[i].nombre); printf("Matricula:%d\n",lista[i].matricula); printf("Promedio:%2.2f\n",lista[i].promedio); } } busqueda int busqueda(alumno lista[], int n, int mat) { for(int i = 0; i < n; i++) if(lista[i].matricula == mat) return i; return -1; } #include <stdio.h> #include <stdlib.h> #define size 10 Programa Principal typedef struct{ char nombre[30]; int matricula; float promedio; } alumno; void lectura(alumno lista[], int n); void imprime(alumno lista[], int n); int busqueda(alumno lista[], int n, int mat); int main() { int i,mat; alumno lista[size]; printf("Proporciona los siguientes datos\n"); lectura(lista,size); printf("Los datos leidos fueron\n"); imprime(lista,size); Programa Principal printf("Proporciona una matricula para ser buscada "); scanf("%d",&mat); i = busqueda(lista,size,mat); if (i != -1) { printf("Registro No. %d\n",i); printf("Nombre del alumno: %s\n",lista[i].nombre); printf("Matricula: %d\n",lista[i].matricula); printf("Promedio: %2.2f\n",lista[i].promedio); } else printf("La matricula no esta dada de alta\n"); system("pause"); return 0; } Ejemplo 2 Modifique la función de escritura para evitar matriculas duplicadas Lectura void lectura(alumno lista[], int n) { int mat,i=0; while(i < n) { printf("Registro No. %d\n",i); printf("Matricula: ");scanf("%d",&mat); if (busqueda(lista,i,mat)== -1) { lista[i].matricula = mat; printf("Nombre del alumno: "); gets(lista[i].nombre); printf("Promedio: ");scanf("%f",&lista[i].promedio); fflush(stdin); i++; } else printf("Este dato ya se encuentra registrado\n"); } } Ejercicio Escribe una programa que utilice una estructura para representar a los números complejos Un número complejo tiene parte real e imaginaria a = x + iy Declare una estructura que permita el manejo de ambos números. Estos números son reales. Realice una función que realice la suma de números imaginarios. La suma se realiza de la siguiente manera a + b = ( x + r) + i( y + s);