Story Transcript
“DECLARACIÓN DE TIPOS PROPIOS EN C”
Declaración de Tipos Propios en C
TEMA 6: DECLARACIÓN DE TIPOS PROPIOS EN C 6.1 ESTRUCTURA Los arrays son estructuras de datos que contienen un número determinado de elementos y todos los elementos han de ser del mismo tipo de datos; es una estructura homogénea. Esta característica supone una gran limitación cuando se requieren grupos de elementos con tipos diferentes de datos cada uno. Por ejemplo, si se dispone de una lista de temperaturas, es muy útil un array, sin embargo, si se necesita una lista de información de clientes que contengan elementos tales como: el nombre, edad, dirección, número de cédula, etc., los array no son adecuados. La solución a este problema es utilizar un tipo de dato registro, en C llamado “estructura”. Una estructura es una colección de uno o más tipos de elementos denominados miembros, cada uno de los cuales puede ser de un tipo de dato diferente. Una estructura puede contener cualquier número de miembros, cada uno tiene un nombre único, denominado nombre del miembro. Ejemplo: Supongamos que se desea almacenar los datos de una colección de discos compactos (CD) de música. Estos datos pueden ser:
Título. Artista. Número de canciones. Precio. Fecha de Compra.
La estructura CD contiene cinco miembros. Tras decidir los miembros, se debe decidir cuáles son los tipos de datos para utilizar por los miembros. Esta información se representa en la siguiente tabla: Nombre Miembro Título Artista Número de Canciones Precio Fecha de Compra
Tipo de Dato Array de Caracteres de tamaño 30. Array de Caracteres de tamaño 25. Entero. Coma Flotante. Array de Caracteres de tamaño 8
6.1.1 DECLARACIÓN DE UNA ESTRUCTURA Una estructura es un tipo de datos definido por el usuario, que se debe declarar antes de que se pueda utilizar. El formato de la declaración es: struct { Programación Estructurada
2
Dpto. Computación UNAN-León
Declaración de Tipos Propios en C
…………….. }; Por ejemplo: La declaración de la estructura CD es: struct colección_CD { char titulo [30]; char artista [25]; int num_canciones; float precio_cd; char fecha_compra [8]; }; struct venta { char vendedor [30]; unsigned int codigo; int cant_articulos; float precio_unit; }; 6.1.2 DEFINICIÓN DE VARIABLES DE ESTRUCTURAS A una estructura se accede utilizando la variable o variables que se deben definir después de la declaración de la estructura. Las variables de estructuras se pueden definir de dos formas: 1. Listándolas inmediatamente después de la llave de cierre de la declaración de la estructura. 2. Listando el tipo de la estructura creada por las variables correspondientes en cualquier lugar del programa antes de utilizarlas. La definición y declaración de la estructura “coleccion_CD” se puede hacer por cualquiera de los dos métodos: 1. struct coleccion_CD { char titulo [30]; char artista [25]; int num_canciones; float precio_cd; char fecha_compra [8]; } cd1, cd2, cd3; 2. struct coleccion_CD cd1, cd2, cd3;
Programación Estructurada
3
Dpto. Computación UNAN-León
Declaración de Tipos Propios en C
Otros ejemplos de definición / declaración: Considerar un programa que gestione libros y procese los siguientes datos: título del libro, nombre del autor, editorial y año de publicación. Una estructura info_libro podría ser: struct info_libro { char titulo_lib [50]; char autor [30]; char editorial [30]; int anyo; }; La definición de la estructura se puede hacer así: 1. struct info_libro { char titulo_lib [50]; char autor [30]; char editorial [30]; int anyo; } libro1, libro2, libro3; 2. struct info_libro libro1, libro2, libro3; 6.1.3 USO DE ESTRUCTURAS EN ASIGNACIONES Como una estructura es un tipo de dato similar a un int o un char, se puede asignar una estructura a otra. Por ejemplo, se puede hacer que libro3, libro4, libro5 tengan los mismos valores en sus miembros que libro1. Por consiguiente, sería necesario realizar las siguientes sentencias: libro3 = libro1; libro4 = libro1; libro5 = libro1; De modo alternativo se podría escribir: libro4 = libro5 = libro6 = libro1; 6.1.4 INICIALIZACIÓN DE UNA DECLARACIÓN DE ESTRUCTURAS: Una estructura se puede inicializar de dos formas: ♦ Dentro de la sección de código de su programa. ♦ Como parte de la definición de la estructura, especificando los valores iniciales, entre llaves, después de la definición de variables estructura.
Programación Estructurada
4
Dpto. Computación UNAN-León
Declaración de Tipos Propios en C
El formato general en este caso es: struct { valor miembro1, valor miembro2, ………………… valor miembron } = variable_estructura {datos de inicialización}; Ejemplo: struct info_libro { char titulo_lib [50]; char autor [30]; char editorial [30]; int anyo; } libro1 = {“Programación en C”,”Luis Joyanes Aguilar”, “McGraw-Hill”,2001}; 6.1.5 ACCESO A ESTRCUTURAS Se puede acceder a los miembros de una estructura de dos formas:
Utilizando el operador punto (.). Utilizando el operador puntero ->.
Lectura y recuperación de información de una estructura: Se puede almacenar información en una estructura mediante inicialización, asignación directa o lectura del teclado. ♦ Acceso a una estructura de datos mediante el operador punto: La asignación de datos a los miembros de una variable estructura se puede hacer mediante el operador punto. La sintaxis C es la siguiente: . = datos; Ejemplos: strcpy(libro1.titulo_lib,”C-C++”); strcpy(libro1.autor,”Francisco Javier Ceballos”); strcpy(libro1.editorial,”RA-MA”); libro1.anyo= 2002;
Programación Estructurada
5
Dpto. Computación UNAN-León
Declaración de Tipos Propios en C
El operador punto proporciona el camino directo al miembro correspondiente. Los datos que se almacenan en un miembro dado deben ser del mismo tipo que el tipo declarado para ese miembro. /*Este programa lee del teclado los datos de una variable estructura “corredor” y los visualiza*/ #include #include struct corredor { char nombre[30]; char sexo[10]; char clubnom[25]; char categoria[12]; int edad; }; void main() { struct corredor c1; printf("Nombre Corredor: "); scanf("%s",&c1.nombre); printf("Edad: "); scanf("%d",&c1.edad); printf("Sexo Corredor: "); scanf("%s",&c1.sexo); printf("Nombre del Club: "); scanf("%s",&c1.clubnom); if(c1.edad sirve para acceder a los elementos de la estructura a partir de un puntero. Para utilizar este operador se debe definir primero una variable puntero para apuntar a la estructura. A continuación, utilice el operador puntero para apuntar a un miembro dado. La asignación de datos a estructuras utilizando el operador -> tiene el siguiente formato: -> = datos; 6.1.6 ESTRUCTURAS ANIDADAS Una estructura puede contener otras estructuras llamadas estructuras anidadas, las cuales ahorran tiempo en la escritura de programas que utilizan estructuras similares. Se han de definir los miembros comunes sólo una vez en su propia estructura y a continuación utilizar esa estructura como miembro de otra estructura. struct empleado { char nombre_emp[30]; char direccion[25]; char ciudad[20]; char provincia[20]; long int cod_postal; double salario; }; struct clientes { char nombre_cli[30]; char direccion[25]; char ciudad[20]; char provincia[20]; long int cod_postal; double saldo; }; Estas estructuras contienen datos diferentes aunque hay datos que están solapados. Así se podría crear una estructura info_dir, que contenga los miembros comunes.
Programación Estructurada
7
Dpto. Computación UNAN-León
Declaración de Tipos Propios en C
struct info_dir { char direccion[25]; char ciudad[20]; char provincia[20]; long int cod_postal; }; Esta estructura se pude utilizar como miembro de las otras estructuras, es decir, anidarse. struct empleados { char nombre_emp[30]; struct info_dir domicilio_emp; double salario; }; struct clientes { char nombre_cli[30]; struct info_dir domicilio_emp; double saldo; }; empleados:
clientes:
nombre_emp
nombre_cliente
direccion info_dir
direccion
ciudad
info_dir
ciudad
provincia
provincia
cod_postal
cod_postal
salario
saldo
Estructuras Anidadas /* Este programa registra una estructura personaempleado que contiene como miembros los datos de una persona empleado que a su vez tenga los datos de la fecha de nacimiento. En un programa se muestra el uso de la estructura, se define una función para dar entrada a los datos de la estructura persona. A la función de entrada se transmite por dirección (&p) la variable estructura, por lo que el argumento correspondiente tiene que ser un puntero (*p) y el acceso a los campos se hace con el selector -> */ #include #include
Programación Estructurada
8
Dpto. Computación UNAN-León
Declaración de Tipos Propios en C
struct fecha { unsigned int dia, mes, anyo; }; struct persona { char nombre[30]; unsigned int edad; int altura; int peso; struct fecha fnac; }; struct persona_empleado { struct persona per1; unsigned int salario; unsigned int horas_semana; }; /*PROTOTIPOS DE FUNCIONES*/ void EntradaDatos(struct persona_empleado *per); void MostrarDatos(struct persona_empleado per); void main() { struct persona_empleado p1; //Llamada a EntradaDatos() transmitiendo la dirección EntradaDatos(&p1); //Llamada a MostrarDatos() MostrarDatos(p1); } void EntradaDatos(struct persona_empleado *p) { printf("\n***LECTURA DE DATOS***\n"); printf("Introduzca el nombre: "); scanf("%s",&p->per1.nombre); printf("Introduzca la edad: "); scanf("%d",&p->per1.edad); printf("Altura: "); scanf("%d",&p->per1.altura); printf("Peso: "); scanf("%d",&p->per1.peso); printf("Fecha de Nacimiento:DD MM AAAA: "); scanf("%d %d %d",&p->per1.fnac.dia,&p->per1.fnac.mes,&p->per1.fnac.anyo); printf("Salario: "); scanf("%d",&p->salario);
Programación Estructurada
9
Dpto. Computación UNAN-León
Declaración de Tipos Propios en C
printf("Numero de Horas Por Semana: "); scanf("%d",&p->horas_semana); } void MostrarDatos(struct persona_empleado p) { printf("\n***DATOS DEL EMPLEADO***\n"); printf("Nombre:%s\n",p.per1.nombre); printf("Edad:%d\n",p.per1.edad); printf("Altura:%d\n",p.per1.altura); printf("Peso:%d\n",p.per1.peso); printf("Fecha Nacimiento: %d\n",p.per1.fnac.dia,p.per1.fnac.mes,p.per1.fnac.anyo); printf("Numero de Horas:%d\n",p.horas_semana); printf("Salario Mensual:%d\n",p.salario); }
%d-%d-
6.1.7 ARRAYS DE ESTRUCTURAS Se puede crear un array de estructuras tal como se crea un array de otros tipos. Los arrays de estructuras son idóneos para almacenar un archivo completo de empleados, un archivo de inventario o cualquier otro conjunto de datos que se adapte a un formato de estructura. Mientras que los arrays proporcionan un medio práctico de almacenar diversos valores del mismo tipo, los arrays de estructuras le permiten almacenar juntos diversos valores de diferentes tipos, agrupados como estructuras. “Para acceder a los miembros de cada uno de los elementos estructura se utiliza una notación de array”. Ejemplo: struct info_libro libros[100]; /*Asigna un array de elementos denominados libros*/ Para inicializar el primer elemento de “libros”, por ejemplo, su código debe hacer referencia a los miembros de libros[0] de la forma siguiente: strcpy(libros[0].titulo,”C-C++”); strcpy(libros[0].autor,”Francisco Ceballos”); strcpy(libros[0].titulo,”McGraw-Hill”); libros[0].anyo=1999; También puede inicializarse un array de estructuras en el punto de la declaración encerrando la lista de inicializadotes entre llaves {}. Por ejemplo: struct info_libro libros[2] = {“C++ a su alcence”,”Luis Joyanes”, “McGraw-Hill”,1999, “C”,”Francisco Ceballos”, “RA-MA”,2001, “Programación en C”,”Angel Hermoso”, “McGrawHill”,2000};
Programación Estructurada
10
Dpto. Computación UNAN-León
Declaración de Tipos Propios en C
Ejemplo: /*Una librería desea catalogar su inventario de libros. El siguiente programa crea un array de 100 estructuras, donde cada estructura contiene diversos tipos de variables, incluyendo arrays*/ #include #include #include struct inventario { char titulo[25]; char fecha_pub[20]; char autor[30]; int num; int pedido; }; void main() { struct inventario libro[30]; int total=0; char resp; do { printf("Total de libros %d\n", (total+1)); printf("Cual es el titulo del libro: "); gets(libro[total].titulo); printf("Cual es la fecha de publicacion: "); gets(libro[total].fecha_pub); printf("Autor del Libro: "); gets(libro[total].autor); printf("Cuantos libros existen: "); scanf("%d",&libro[total].num); printf("Cuantos ejemplares existen pedidos: "); scanf("%d",&libro[total].pedido); fflush(stdin); printf("\n\nHay mas libros:(S/N)"); scanf("%c",&resp); fflush(stdin); resp=toupper(resp);
Programación Estructurada
11
Dpto. Computación UNAN-León
Declaración de Tipos Propios en C
if(resp=='S') { total++; continue; } }while(resp=='S'); } Ejemplo de Salida:
Ejemplo: /*Este programa declara un array de estructuras Estudiante para conocer cuál es el estudiante que obtuvo la mayor nota*/ #include struct Estudiante { char nombre[30]; int nota; }; void main() { struct Estudiante est[20]; int i=1,j=1,pos,may; for(i=0;i