Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Una estructura (struct) permite agrupar variables de varios tipos bajo un mismo nombre. A estos componentes individuales de la estructura se le denomina miembros. De esta forma es posible crear elementos de datos complejos, basndose en los tipos bsicos que suministra el lenguaje de programacin.
Por ejemplo, se puede utilizar una estructura para almacenar diferentes tipos de informacin sobre una persona, tal como nombre, estado civil, edad y fecha de nacimiento. Cada uno de estos elementos se denominan nombre del miembro.
Una declaracin de estructura define un tipo, y por lo tanto ser posible definir variables de este nuevo tipo. Cada una de estas variables estar compuesto a su vez por las variables que se definieron en la estructura.
Ejemplo
Supngase que se desea disear una estructura que guarde los datos correspondientes a un alumno. Esta estructura, a la que se llamar alumno, deber guardar el nombre, la direccin, el nmero de matrcula, el telfono, y las notas en las 10 asignaturas. Cada uno de estos datos se denomina miembro de la estructura.
La estructuras sera
struct alumno { char nombre[31]; char direccion[21]; unsigned long no_matricula; unsigned long telefono; float notas[10]; };
El cdigo anterior crea el tipo de dato alumno, pero an no hay ninguna variable definida con este nuevo tipo.
Definicin de variables
Las variables de estructuras se pueden definir de dos formas: 1. Listado el tipo de la estructura creada seguido por las variables correspondientes en cualquier lugar del programa antes de utilizarlas Ejemplo: Para declarar dos variables de tipo alumno en C se debe utilizar la sentencia incluyendo las palabras struct y el nombre de la estructura.
Definicin de variables
2. Tambin podran haberse definido las variables inmediatamente despus de la llave de cierre de la declaracin de la estructura.
Ejemplo: alumno1 y alumno2 al mismo tiempo que se defina la estructura de tipo alumno: struct alumno { char nombre[31]; char direccion[21]; unsigned long no_matricula; unsigned long telefono; float notas[10]; } alumno1, alumno2;
Por ejemplo, una forma de declarar e inicializar a la vez la estructura alumno_nuevo podra ser la siguiente:
struct alumno { Donde, como no se proporciona valor para las char nombre[31]; notas, stas se inicializan a cero. char direccion[21]; unsigned long no_matricula; unsigned long telefono; float notas[10]; } alumno_nuevo = {"Mike Smith", "San Martn 87, 2 A", 62419, 421794};
struct nombre_estructura.nombre_miembro = datos; Por ejemplo, para dar valor al telfono del alumno alumno1 el valor 903456, se escribir:
Para guardar la direccin de este mismo alumno, se escribir:
alumno1.telefono = 903456;
Por asignacin:
<nombre variable> = nombre _variable _estructura>. <nombre _miembro>;
o bien
<nombre variable> = <puntero _de _structura> -> <nombre _miembro>;
Para salida:
printf(" ",<nombre _variable _estructura>.<nombre _miembro;
o bien
printf(" ",<puntero _de_estructura> -> <nombre_miembro;
Ejemplo
struct complejo z struct complejo *pz; pz = &z; x = z.pr; y = z.pi; printf("\nNmero complejo (%.lf,%.lf), mdulo: %.2f", pz ->pr ,pz->pi, pz->modulo);
Arreglos de estructura
Se puede crear un arreglo de estructura tal como se crea un arreglo de otro tipo. Los arreglos de estructura son idneos para almacenar una archivo completo de empleados, un archivo de inventarios, o cualquier otro conjunto de datos que se adapte aun formato de estructura. Muchos programadores de C utilizan arreglos de estructuras como un mtodo para almacenar datos en un archivo de disco. Se pueden introducir y calcular sus datos de disco en arreglos de estructuras y a continuacin almacenar esas estructuras en memoria. Los arreglos de estructuras proporcionan tambin un medio de guardar datos que se leen del disco. La declaracin de un arreglo de estructuras info_libro se puede hacer de un modo similar a cualquier arreglo, es decir: struct info_libro libros [100];
Ejemplo
Para acceder a los miembros de cada uno de los elementos estructura se utiliza una notacin de arreglo. Para inicializar el primer elemento de libros, por ejemplo, su cdigo debe hacer referencia a los miembros de libros [0] de la forma siguiente: strcpy(libros[0].titulo, "C++ a su alcance"); strcpy(libros[0] .autor, "Luis Joyanes"); strcpy (libros[0] . editorial, "McGraw-Hill"); libros[0].ao = 1999; Tambin puede inicializarse un arreglo de estructuras en el punto de la declaracin encerrando la lista de inicializadores entre llaves, { }. Por ejemplo: struct info_libro libros [3] = { "C++ a su alcance", "Luis Joyanes", McGraw-Hill, 1999, Estructura de datos, Luis Joyanes, McGraw-Hill, 1999, Problemas en Pascal, ngel Hermoso, McGraw-Hill, 1997};
Punteros a estructuras
Tambin se pueden usar punteros con estructuras. Primero hay que definir la estructura de igual forma que hacamos antes. La diferencia est en que al declarar la variable de tipo estructura debemos ponerle el operador * para indicarle que es un puntero. Antes de acceder a los miembros de una estructura con una variable puntero y el operador puntero (->), es preciso crear espacio de almacenamiento en memoria; por ejemplo con la funcin malloc().
De no ser as, debemos darle una direccin vlida donde apuntar. No podemos por ejemplo crear un puntero estructura y meter los datos directamente mediante ese puntero, no sabemos dnde apunta el puntero y los datos se almacenaran en un lugar cualquiera. No debemos olvidar el operador & que significa 'dame la direccin donde est almacenado...'. Y si se trabaja con punteros se debe usar el operador '->'. Este operador viene a significar algo as como: "dame acceso al miembro... del puntero ...".
Ejemplo 1
Declaracin de la estructura estrutura_amigo
#include <stdio.h> struct estructura_amigo { char nombre[30]; char apellido[40]; char telefono[10]; int edad; }; struct estructura_amigo amigo = { "Juanjo", "Lopez", "592-0483", 30 }; struct estructura_amigo *p_amigo; int main() {
Definicin de la variable amigo como tipo estrutura_amigo e inicializada Definicin de la variable puntero p_amigo de tipo estructura_ amigo
Se le da una direccin hacia donde apuntar a la variable puntero p_amigo Se acceden a los miembros de la variable amigo a travs de la variable puntero p_amigo
p_amigo = &amigo; printf( "%s tiene ", p_amigo->apellido ); printf( "%i aos ", p_amigo->edad ); printf( "y su telfono es el %s.\n" , p_amigo->telefono ); }
Ejemplo 2
Utilizar los punteros para introducir datos en las estructuras.
#include <stdio.h> struct estructura_amigo { char nombre[30]; char apellido[40]; int edad; }; struct estructura_amigo amigo, *p_amigo; int main() { p_amigo = &amigo; /* Introducimos los datos mediante punteros */ printf("Nombre: ");fflush(stdout); gets(p_amigo->nombre); printf("Apellido: ");fflush(stdout); gets(p_amigo->apellido); printf("Edad: ");fflush(stdout); scanf( "%i", &p_amigo->edad ); /* Mostramos los datos */ printf( "El amigo %s ", p_amigo->nombre ); printf( "%s tiene ", p_amigo->apellido ); printf( "%i aos.\n", p_amigo->edad ); }
C permite pasar estructuras a funciones, bien por valor o bien por referencia utilizando el operador &. Si la estructura es grande, el tiempo necesario para copiar un parmetro struct, en el paso por valor, puede ser prohibitivo o muy deficiente. En tales casos, se debe considerar el mtodo de pasar la direccin de la estructura.
Ejemplo
Solicitados datos de entrada de una estructura que represente a una persona y mostrarlos por pantalla, una funcin entrada y otra de salida.
void entrad_pna(struct info_persona* pp) { puts(\n Entrada de los datos de una persona\n); printf (Nombre : ); gets (pp- >nombre) ; printf(Calle: ); gets(pp->calle); printf (Ciudad: ); gets (pp->ciudad); printf (Provincia: ); gets (pp->provincia) ; printf(Codigo postal: ); gets(pp->codigopostal); } void ver_info(struct info_persona p) { puts("\n\tlnformacin relativa a la persona); puts(p.nombre); puts (p.calle) ; put s (p.ciudad) ; puts(p.provinciaJ; puts(p.codigopostal); }
#include <stdio,h> /* Define el tipo estructura info_persona */ struct info_persona {char nombre [20] ; char calle [30] ; char ciudad [25] ; char provincia [25] ; char codigopostal[61]; }; /* prototipos de funciones */ void entrad_pna(struct info_persona* pp); Void ver_info(struct info_persona p); Void main(void) { struct info_ persona reg_dat; /*Pasa por referencia la varibale*/ Entrad_pna(®_data); /*Pasa por valor*/ ver_info(reg_data); Printf(\nPulsa cualquier caracter para continuar\n); Getchar(); }
Uniones
Las uniones son similares a las estructuras en cuanto que agrupan a una serie de variables, pero la forma de almacenamiento es diferente y, por consiguiente, tiene efectos diferentes.
Una estructura (struct) permite almacenar variables relacionadas almacenadas en posiciones contiguas en memoria.
juntas
Las uniones se declaran con la palabra reservare unin, almacenan tambin miembros mltiples en un paquete; sin embargo, en lugar de situar sus miembros unos detrs de otros, en una unin, todos los miembros se solapan entre s en la misma posicin. El tamao ocupado por una unin se determina analizando el tamao de cada variable de la unin: el mayor tamao de variable ser el tamao de la unin.
Uniones
La sintaxis de una unin es la siguiente:
union nombre { tipo1 miembro1; tipo2 miembro2; };
Ejemplo:
union PruebaUnion { float Item1; int Item2; };
La cantidad de memoria reservada para una unin es igual a la anchura de la variable ms grande. En el tipo union, cada uno de los miembros dato comparten memoria con los otros miembros de la unin. La cantidad total de memoria utilizada por la unin es de 8 bytes, ya que el elemento double es el miembro dato mayor de la unin y ocupa 8 bytes.
Uniones
Una razn para utilizar una unin es que se ahorra memoria. En muchos programas se deben tener varias variables, pero no es necesario utilizar todas al mismo tiempo. Considrese la situacin en que se requieren tener diversas cadenas de caracteres de entrada. Se pueden crear varios arreglos de caracteres, tales como los siguientes: Estas tres variables ocupan 240 bytes de memoria. Sin embargo, si su programa no necesita utilizar las tres variables simultneamente, por qu no permitirle compartir la memoria utilizando una unin. Cuando se combinan en el tipo unin frases, estas variables ocupan un total de slo 80 bytes. Para referirse a los miembros de una unin, se utiliza el operador punto (.), o bien el operador (->) si se hace desde un puntero a unin. char linea_ordenes[80]; char mensaJe error[80]; char ayuda [80] ;
union frases { char linea ordenes [80] ; char mensaJe error[80]; char ayuda [80] ; } cadenas, *pc;