Algoritmos Fundamentales Estructura de Datos Estructuras Estructura Colección de uno o más tipos de elementos, los cuales pueden ser de tipos de datos diferentes. Declaración. usada. Debe ser declarada antes de ser struct <nombre de la estructura> { <tipo de dato miembro1> miembro1>; <tipo de dato miembro2> miembro2>; ...... <tipo de dato miembron> <nombre <nombre <nombre Estructuras Definición (variables tipo struct) Al igual que otras variables, las estructuras deben ser definidas luego de ser declaradas para poder ser usadas. Hay dos formas de definir. 1. Listándolas inmediatamente después de las llaves de declaración. struct info_libros { char titulo[60]; char autor[30]; char editorial[30]; int anyo; } libro1,libro2,libro3; Estructuras 2. Listándo el tipo de la estructura creada seguida por las variables correspondientes, en cualquier parte del programa, antes de ser usadas. struct info_libros { char titulo[60]; char autor[30]; char editorial[30]; int anyo; }; struct info_libros libro1,libro2,libro3; Estructuras Declaración con typedef. A través de ésta instrucción podemos definir un tipo de dato equivalente a uno ya existente. Es valido para cualquier tipo de datos, no sólo para el tipo de datos estructura. Sintaxis: typedef tipo nuevo-tipo; donde: tipo: se refiere al tipo de datos ya existente. nuevo-tipo: nuevo dato creado a partir del tipo ya existente. En el caso typedef struct <nombre de la estructura> de estructura { <tipo de dato miembro1> <nombre miembro1>; <tipo de dato miembro2> <nombre miembro2>; ...... <tipo de dato miembro > <nombre Estructuras 2. Ej con typedef: typedef struct { char titulo[60]; char autor[30]; char editorial[30]; int anyo; } info_libros; Se mueve el nombre de la estructura después de las llaves, ahora es un tipo de datos. En este caso Llamado info_libros. info_libros libro1,libro2,libro3; Eliminamos la palabra struct al inicio. Estructuras Inicialización Podemos asignar valores iniciales a una estructura al definirlas o dentro del programa(asignar valores). 1. Asignación: libro3=libro1; libro4=libro1; libro3=libro3=libro4=libro1; Estructuras 2. Inicialización: struct info_libros { char titulo[60]; char autor[30]; char editorial[30]; int anyo; } libro1={“Programacion en C”,”Luis Joyanes”, ”McGraw Hill”,2000}; ó libro1={ “Programacion en C”, ”Luis Joyanes”, ”McGraw Hill”, 2000 }; Estructuras Asignación de Valores. Acceso a una estructura a través del Operador punto(.), este operados nos da acceso directo al miembro correspondiente. SINTAXIS: Para datos numéricos ó caracter: <nombre estructura>.<nombre miembro>=dato; Para cadena de datos : Ej. strcpy(libro1.autor,“Papo Lucas”); Estructuras Ejemplo: struct info_libros libro5; printf(“\n Digite titulo:”); gets(libro5.titulo); printf(“\n Digite Autor:”); gets(libro5.autor); printf(“\n Digite Editorial:”); gets(libro5.editorial); printf(“\n Digite año:”); scanf(“%d”,&libro5.anyo); Estructuras Acceso a través del operador puntero () Primero debe definirse una variable tipo puntero para apuntar a la estructura. Luego podemos apuntar directamente al miembro dado. SINTAXIS: <puntero a estructura> miembro>=dato; <nombre Estructuras struct estudiantes { char nombre[41]; int num_estudiante; int anyo_de_matricula; float nota; }; struct estudiantes *ptr_est; struct estudiantes mejor; Nota: Antes de acceder, debemos haber reservado memoria, a través p.e. de la función malloc(). ptr_est = &mejor; strcpy(ptr_estnombre,”Pepe Trueno”); ptr_estnum_estudiante = 4322; ptr_estnota =8.5; Estructuras Arreglos de Estructuras Permiten almacenar diversos valores de diferentes tipos de datos. Son prácticos para almacenar archivos de empleados, inventarios y otros datos que se adapten al formato de estructura. Declaración Arreglos de Estructuras struct info_libros libros[100]; Acceso e inicialización strcpy(libros[0].titulo,”C++ a su alcance”); strcpy(libros[0].autor,”Luis Joyanes”); strcpy(libros[0].editorial,”Mc GrawHill”); libros[0].anyo = 1999; Estructuras Declaración e inicialización struct info_libro libro[3] = {“Programación en C”,”Luis Joyanes”, ”McGraw Hill”,1999, “Estructura de Datos”,”Luis Joyanes”, ”McGraw Hill”,1999, “C++ a su Alcance”,”Luis Joyanes”, ”McGraw Hill”,2000 }; Estructuras Paso de Estructura a una Función En una función se pueden pasar como parámetros los miembros de una estructura, ya sea de forma individual o la estructura completa. Así también un miembro de una estructura puede ser devuelto en un instrucción return, en ese caso el miembro se trata de forma individual. Estructuras El siguiente programa hace el uso pase de parámetros de tipo estructura en una función. Se hacen los pase por valor y referencia. Se tienen dos funciones una para la entrada de datos y Se pasan los parámetros por referencia o dirección en memoria(tipo *). La segunda función se usa para la salida de datos y la Estructura se pasa como parámetro por valor. Estructuras #include <stdio.h> #include <stdlib.h> /*definir la estructura */ struct info_persona { char nombre[20]; char calle[20]; char ciudad[20]; char provincia[20]; char codigopostal[6]; }; Estructuras /* prototipo de funciones: definicion de las funciones */ void entrada( struct info_persona *pp); void salida( struct info_persona p); main() { struct info_persona reg_dat; entrada(&reg_dat); // pase por referencia salida(reg_dat); // pase por valor printf("\n Pulsar cualquier techa para continuar \n"); getchar(); } Estructuras void entrada( struct info_persona *pp) { puts("\n Entrada de Datos de la persona \n"); printf("\n Nombre: "); gets(pp->nombre); printf("\n Calle: "); gets(pp->calle); printf("\n Ciudad: "); gets(pp->ciudad); printf("\n Provincia: "); gets(pp->provincia); printf("\n Codigo Postal: "); gets(pp->codigopostal); } Estructuras void salida( struct info_persona p) { puts("\n\n Informacion digitada de la persona \n"); puts(p.nombre); puts(p.calle); puts(p.ciudad); puts(p.provincia); puts(p.codigopostal); } Estructuras Anidadas Estructura Anidadas Es cuando una estructura contiene a una o mas estructuras como miembro de ella. Ej. struct info_dir { char direccion[30]; char ciudad[20]; char provincia[20]; int cod_postal; }; Estructuras Anidadas Ej. struct info_dir { char direccion[30]; char ciudad[20]; char provincia[20]; int cod_postal; }; struct empleado { char nombre_emp[30]; struct info_dir direccion_emp; double salario; }; struct clientes { char nombre_cli[30]; struct info_dir direccion_cli; double saldo; }; Estructuras Anidadas Se desea una estructura PersonaEmpleado que contenga como miembros los datos de una persona que a su vez tenga los datos de la fecha de nacimiento. #include <stdio.h> #include <stdlib.h> /* definir las estructuras */ struct fecha { unsigned int dia,mes,anyo; }; struct persona { char nombre[20]; unsigned int edad; int altura; int peso; struct fecha fec; Estructuras Anidadas struct persona_empleado { struct persona unapersona; unsigned int salario; unsigned int horas_semana; }; /* prototipo de funciones: definicion de las funciones */ void entrada(struct persona_empleado *pp); void salida(struct persona_empleado up); main() { struct persona_empleado pp; // definir una variable pp entrada(&pp); // entrada de los datos salida(pp); // Salida de los datos printf("\n\n\n Pulsar cualquier tecla para continuar \n"); getchar(); } Estructuras Anidadas void entrada( struct persona_empleado *pp) { fflush(stdin); puts("\n Entrada de Datos de la persona \n"); printf("\n Nombre: "); printf("\n Edad: "); printf("\n Altura: "); printf("\n Peso: "); gets(pp->unapersona.nombre); scanf("%d",&pp->unapersona.edad); scanf("%d",&pp->unapersona.altura); scanf("%d",&pp->unapersona.peso); printf("\n\n Fecha de Nacimiento(dia,mes,anyo) separado por espacio "); scanf("%d %d %d",&pp->unapersona.fec.dia,&pp->unapersona.fec.mes, &pp->unapersona.fec.anyo); printf("\n\n Salario: "); scanf("%d",&pp->salario); printf("\n Numero de Horas: "); scanf("%d",&pp->horas_semana); } Estructuras Anidadas void salida( struct persona_empleado up) { puts("\n\n Datos de un Empleado \n"); printf("\n Nombre: %s ",up.unapersona.nombre); printf("\n Edad: %d ",up.unapersona.edad); printf("\n Fecha de Nacimiento: %d-%d-%d ",up.unapersona.fec.dia, up.unapersona.fec.mes, up.unapersona.fec.anyo); printf("\n Altura: %d ",up.unapersona.altura); printf("\n Peso: %d ",up.unapersona.peso); printf("\n Horas de la Sem: %d ",up.horas_semana); }