INGENIERÍA INFORMÁTICA Lenguajes de Programación E.P.S. PRÁCTICAS de Lenguaje C Curso 2002-2003 Tema: Estructuras o Registros Lenguajes de programación Estruc turas 1. Estructuras (o Registros) En C (y en la mayoría de los lenguajes), una estructura es un nuevo tipo de variable formado por una colección de variables más sencillas y que se referencia usando un único nombre. De está forma se consigue mantener agrupada la información relacionada. Las variables que componen esta estructura se denominan campos o miembros de la estructura 1.1 Declaración Las estructuras se declaran como se muestra a continuación: struct nombre_estructura{ tipo_1 variable1 ; tipo_2 variable2 ; · · · tipo_N variableN ; }; Obsérvese que la declaración acaba con un punto y coma. La declaración de una estructura forma una plantilla que se utiliza para crear variables de tipo “struct nombre_estructura”. En general cada campo de la estructura está relacionado con los demás. Por ejemplo: la información relativa a un CD de música estaría normalmente representada por una estructura. En código siguiente muestra como declarar una estructura con los campos adecuados sruct CD{ char nom_grup[20]; char nom_disc[50]; char discografica[20]; }; La palabra struct indica al compilador que se está declarando una estructura. Este código NO crea la variable, tan sólo define la forma que tendrán los datos. Si deseamos declarar una variable de tipo struct CD necesitan escribir: struct CD Disc_1; Ahora, acabamos de crear una variable de tipo struct CD denominada Disc_1. También es posible declarar una (o más) variables de tipo struct CD en el momento de la declaración de la estructura: struct CD{ char nombre_grupo[20]; char nombre_disco[50]; char discografica[20]; } Disc_1, Disc_2, ··· , Disc_M; Practicas Pàg. 2 Lenguajes de programación Estruc turas Ejercicio 1:Añadir a la estructura struct CD un campo en el que figure el año en que se publicó el disco. 1.2 Acceso a los miembros de una estructura A los miembros individuales de una estructura se accede mediante el operador punto . La sintaxis es: nombre_de_la_variable_estructura.nombre_del_camp De esta forma, cualquier campo puede ser tratado como una variable normal y corriente. Así podemos asignar el valor “Vomito” al campo nombre_grupo CD de la variable Disc_2 usando la sentencia: Disc_2.nombre_grupo = ”Vomito”; Y si deseamos mostrar el contenido de la variable por pantalla usaremos: printf(“%s”, Disc_2.nombre_grupo); Ejercicio 2: Escribir un programa en el que (i) definamos una estructura de tipo CD (la que usamos en el ejercicio 1) y una variable tipo struc CD. (ii) Se pregunte al usuario por el valor de cada campo, (iii) Se rellene la estructura con estos valores y (iv) se muestren estos valores por pantalla. (No te olvides de adjuntar todos los programas que escribáis o modifiquéis con la memoria de la práctica ) 1.3 Arrays de estructuras. Sigamos trabajando con la estructura CD. Por ahora, para almacenar la información relativa a cada CD necesitamos declarar una variable tipo struct CD. Así, por ejemplo, para definir cinco CDs escribimos: struct CD Disc_1, Disc_2, Disc_3, Disc_4, Disc_5 ; En este caso en el que estamos trabajando con 5 CDs la solución es aceptable pero, que pasa si tenemos 256 CDs? Tenemos que declarar 256 variables? Afortunadamente no es necesario puesto que es posible declarar arrays de estructuras. Para ello se usa el código struct CD Disc[256]; Con esta última línea hemos definido un vector que contiene 256 variables de tipo struct CD como se muestra en la siguiente figura Practicas Pàg. 3 Lenguajes de programación Estruc turas Disc Disc[0] Disc[1] Disc[2] Disc[255] nombre_grupo nombre_disco Discografica Agno Disc[3] Disc[3] Disc[3] 2. Enumeraciones Una enumeración es un conjunto de constantes enteras a las cuales hemos asignado un nombre. Y que especifican todos los valores válidos que una variable puede adquirir. El siguiente ejemplo aclarará la idea Ejemplo 1 : Supongamos que deseamos definir una variable que almacene el día de la semana. Usando la palabra reservada enum declaramos: enum Semana{lunes,martes,miercoles,jueves,viernes,sabado,domingo}dias; Lo que acabamos de hacer es declarar una variable llamada dias de tipo struct semana. Concretamente hemos asignado: el valor el valor el valor el valor el valor el valor el valor 0 1 2 3 4 5 6 al nombre al nombre al nombre al nombre al nombre al nombre al nombre lunes martes miércoles jueves viernes sábado domingo ( Recordad que en C siempre se empieza a contar a partir de 0) De esta forma a partir de ahora a la variable días podremos asignarle indistintamente los valores: lunes, martes, miercoles, jueves, viernes, sábado, domingo ó 0, 1, 2, 3, 4, 5, 6. Esta forma de programar mejora la calidad del código y facilita su comprensión. Practicas Pàg. 4 Lenguajes de programación Estruc turas Ejemplo 2 : Edita y ejecuta el siguiente código #include <stdio.h> void main(void) { enum Semana{lunes, martes,miércoles,jueves,viernes,sabado,domingo} dias; int dia; for(dia=lunes;dia<=domingo;dia++) if (dia<=viernes) printf("A currar!!!!\n"); else printf("FIESTA!!!!!!!\n"); } Ejercicio 3 : Escribe un programa similar al anterior utilizando los doce meses del año en lugar de los días de la semana. Modificar el bucle anterior de forma que imprima “vacaciones” para los meses de Julio, Agosto y Septiembre y “A currar” para el resto de los meses. 3. typedef C permite definir explícitamente nombres nuevos para cualquier tipo de datos usando la palabra reservada typedef. Realmente no se crean nuevos tipos de datos sino que damos un alias a un tipo ya existente. La sintaxis es: typedef tipo_existente nuevo_nombre; Ejemplo 3 : typedef int TipoEntero; typedef float TipoReal; typedef char TipoCaracter; En estas lineas decimos que declarar una variable como int o TipoEntero es lo mismo. (Lo mismo ocurre con float o TipoReal y char o TipoCaracter) Las declaraciones hechas en el ejemplo 3 no son particularmente útiles pero hay un caso en el que typedef es especialmente útil: cuando se utiliza en conjunción con estructuras y enumeraciones. Por ejemplo: Ejemplo 4 : En lugar de definir una variable de tipo struct complex usando el código: struct complex{ float part_real; float part_imaginaria; }; Practicas Pàg. 5 Lenguajes de programación Estruc turas struct complex NumComplex; Podemos usar typedef y escribir typedef struct{ float part_real; float part_imaginaria; } complex; complex NumComplex; De esta forma no tenemos que usar la palabra struct cada vez que queramos definir una variable de tipo complex. El uso de typedef hace el código más legible y cómodo de escribir (typedef también se aplica a enumeraciones RECORDAD typedef NO crea variables nuevas, tan solo crea alias de tipos ya existentes. Ejercicio 4 : Escribir un programa que: (i) declare un array (de no más de 10 elementos) tipo CD (usando typedef), (ii) rellene esta estructura con datos suministrato desde el teclado por el usuario, (iii) Una vez los datos esten suministrados el programa entrará en un bucle while que: (a) solicitará un nombre de grupo al usuario y en el caso de que exista algún/os CDs grabados por este grupo muestre el resto de los datos de ese/esos CD/CDs por pantalla, (b) Si el usuario introduce la palabra clave FIN el programa debe terminar. Para hacer comparaciones de cadenas la función strcmp()es muy util. No os olvideis de agregar la libreria string.h. Practicas Pàg. 6 Lenguajes de programación Estruc turas Agradecimientos: Esta práctica está basada en las prácticas de Ingeniería informática realizadas por el Dept. Informàtica, Escola Tècnica Superior d'Enginyeria, Universitat Autònoma de Barcelona Practicas Pàg. 7