Está en la página 1de 7

Estructuras

1 Objetivos

Al finalizar esta actividad, sers capaz de: 1. Escribir la declaracin de una estructura de datos convenientemente especificada 2. Escribir el cdigo necesario para acceder a un elemento o conjunto de elementos de una estructura de datos 2 Motivacin

Hasta ahora hemos trabajado con datos elementales (enteros, reales, caracteres) o con vectores (agregaciones de datos del mismo tipo). En ocasiones es necesario trabajar con informacin que se compone de varios datos de tipos elementales diferentes. Por ejemplo, podemos tener una aplicacin que trabaje con los clientes de nuestro banco. La informacin relativa a un cliente se podra componerse de: Identificador Un nmero entero Nombre Saldo Un vector de caracteres Un nmero real

Y naturalmente, querremos trabajar con muchos clientes (quiz un vector de clientes). En el lenguaje de programacin C, el mecanismo que permite trabajar con este tipo de estructuras de datos es la construccin struct (estructuras). En las prximas secciones veremos cmo trabajar con esta construccin. 3 Las estructuras en C

Veamos primero un ejemplo de un programa que declara y usa estructura para representar a un cliente.
#include <stdio.h> void main () { struct { int id; char nom[20]; float saldo; } cliente;

//identificador del cliente // nombre

printf ("Escribe el identificador y el nombre del cliente\n"); scanf ("%d %s", &cliente.id, cliente.nom); cliente.saldo =0.0; if (cliente.id > 100) printf (" El cliente es %s\n",cliente.nom);

El programa declara una variable llamada cliente que es una estructura que contiene tres campos: un campo de tipo entero llamado id para almacenar el identificador del cliente, un vector de caracteres llamado nom para almacenar el nombre y un real llamado saldo para almacenar el saldo del cliente. El acceso a cada uno de esos campos es muy fcil. Simplemente se escribe el nombre de la variable, un punto y el nombre del campo al que queremos acceder.
1. Construye un proyecto que contenga el programa anterior, y verifica que funciona correctamente. Despus haz la prueba siguiente:

Pon un punto de parada en la sentencia if. Ejecuta el programa hasta ese punto de parada. Coloca la variable cliente en la ventana del watch. Esta ventana tendr el aspecto mostrado a la derecha.

El signo + dentro de un cuadrado indica que cliente es una variable compuesta y que, por tanto, contiene diversos campos con informacin. Haz clic en ese signo +. Se abrir la estructura y la ventana de watch tendr el aspecto de la derecha. La ventana te est mostrando los tres campos de la estructura, y el contenido de cada uno de esos campos. Fjate que el campo nom es tambin una estructura compuesta (en este caso un vector). Podramos abrirla para ver su contenido (haciendo clic en el signo +) pero no vale la pena porque ya estamos viendo que contiene la palabra Luis.

Vectores de estructuras

Normalmente trabajaremos con vectores de estructuras. Fjate en el ejemplo siguiente, en el que trabajamos con un vector de clientes. El programa lee del terminal la informacin de varios clientes, que guarda en un vector de clientes, y luego recorre el vector para detectar los clientes que tienen un saldo superior a 100.0 y escribe en la pantalla sus nombres.

#include <stdio.h> #define MAX 100 typedef struct { int id; char nom[20]; float saldo; } Tcliente;

//identificador del cliente // nombre

typedef struct { int numero; Tcliente cliente[MAX]; }Tlista; void main () { Tlista mis_clientes; int i; printf ("Escribe el numero de clientes\n"); scanf ("%d", &mis_clientes.numero); for (i=0; i<mis_clientes.numero; i++) { printf ("Escribe idenfificador, nombre y saldo\n"); scanf ("%d",&mis_clientes.cliente[i].id); scanf ("%s",mis_clientes.cliente[i].nom); scanf ("%f",&mis_clientes.cliente[i].saldo); }; for (i=0; i<mis_clientes.numero; i++) if (mis_clientes.cliente[i].saldo > 100.0) printf (" El cliente es %s\n",mis_clientes.cliente[i].nom); }

Fjate en la construccin typedef que aparece antes del programa principal. Con esta construccin estamos definiendo un nuevo tipo de dato que se llamar Tcliente, que es una estructura que contiene tres campos (identificador, nombre y saldo). En realidad todava no hemos declarado ningn cliente. Simplemente estamos diciendo que a partir de este momento usaremos la palabra Tcliente para declarar variables que contendrn clientes. En el ejemplo se separa la definicin de la estructura de la declaracin de los variables. De este modo el programa queda ms claro. Fjate como hemos definido el tipo de estructura Tlista. En esta estructura tendremos la lista de clientes. La estructura contiene un campo para guardar el nmero de clientes de la lista, y otro campo que es en realidad un vector de clientes. Observa cmo hemos usado la palabra Tcliente para indicar que cada elemento del vector es en realidad una estructura que contiene la informacin de un cliente. En el vector caben hasta 100 clientes (el valor de la constante MAX) pero puede haber menos. En el campo numero tendremos siempre el nmero de clientes que realmente hay en el vector.

Una vista grafica de la estructura del tipo Tlista podra ser: mis_clientes
numero id nom saldo cliente[0] id nom saldo cliente[1] --- ------ ------ ---- --- --- --- --- ---- --- --- ----- --- --- --- --- -- -- -- --- --- --- --- --- --- ----- --- --- --- --- --- --- --- --- --- --- --- --- --- id nom saldo cliente[MAX-1]

Fjate ahora en el programa principal, donde declaramos por fin una variable de tipo Tlista. Despus leemos el nmero de clientes y entramos en un bucle para leer los datos de todos esos clientes. Finalmente, tenemos el bucle que recorre la lista para realizar la tarea. Fjate finalmente cmo accedemos a los campos de las estructuras. Por ejemplo: mis_clientes.cliente[i].saldo Tal y como se ha explicado antes, primero se pone el nombre de la variable, y despus un punto seguido el nombre del campo al que queremos acceder. En este ejemplo, como el campo es un vector, tendremos que poner el ndice correspondiente a la posicin del vector a la que queremos acceder. Como resulta que cada posicin del vector es a su vez una estructura, tenemos que poner un punto seguido del nombre del campo de esa estructura al que queremos acceder.
2. Construye un proyecto que contenga la aplicacin de ejemplo y verifica que funciona correctamente. Despus has otra ejecucin siguiendo las instrucciones siguientes.

Pon un punto de parada al inicio del segundo bucle for y ejecuta hasta ese punto de parada (introduce el valor 3 como valor de numero de clientes) Coloca la variable mis_clientes en la ventana del watch. Clica sobre el signo + para abrir la variable. Veras una imagen como la que tienes a la derecha. Te indica que tienes 3 clientes, que estn en el vector cliente. Haz clic en el signo + del campo cliente. Veras una imagen como la de la derecha. Estas viendo el vector de clientes.

Haz clic en el signo + del cliente que hay en la posicin 0. La imagen ser como la de la derecha, y estars viendo los datos del primer cliente.

Un ejemplo ms complejo

Ya sabes prcticamente toda la teora que hay que saber para manejar estructuras y vectores de estructuras. Lo nico que queda es algo ms de prctica trabajando con estructuras complejas que contienen estructuras, que a su vez tienen dentro otras estructuras, etc. Para ello, veamos un ejemplo. Fjate en las siguientes definiciones de estructuras:
// Esta es la definicin de la estructura de un piso typedef struct { int m2; /* metros cuadrados del piso */ int num_h; /* numero de habitaciones */ float precio; /* precio en euros */ } Tpiso; // Una planta es un vector de pisos typedef struct { int num_pisos; /* numero de pisos de la planta */ Tpiso piso [MAXPI]; } Tplanta;

// Un edificio es un vector de plantas typedef struct { int num_plantas; /* numero de plantas del ediicio */ Tplanta planta [MAXPL]; } Tedificio; // Una calle es un vector de edificios typedef struct { int num_edificios; /* numero de edificios de la calle */ Tedificio edificio [MAXE]; } Tcalle;

Supn que en el programa principal se han hecho las siguientes declaraciones:


void main () { Tcalle mi_calle; Tpiso p;

Veamos ahora algunos ejemplos de accesos a estas estructuras de datos. 1 Escribir en pantalla el precio del piso 2 de la planta 1 del edificio 4
printf (%f\n,mi_calle.edificio[4].planta[1].piso[2].precio);

Copiar en p los datos del piso 1 de la planta 0 del edificio 2 p= mi_calle.edificio[2].planta[0].piso[1];

Fjate que es posible copiar de golpe toda una estructura, en vez de copiar campo a campo.

Escribir en pantalla los metros cuadrados totales del edificio 3.


m=0; for (i=0; i< mi_calle.edificio[3].num_plantas; i++) for (j=0; j< mi_calle.edificio[3].planta[i].num_pisos; j++) m = m + mi_calle.edificio[3].planta[i].piso[j].m2; printf (Los metros totales del edificio 3 son %d\n, m);

Escribir el precio del piso ms caro de la calle.


m = -1; for (i=0; i< mi_calle.num_edificios; i++) for (j=0; j< mi_calle.edificio[i].num_plantas; j++) for (k=0; k< mi_calle.edificio[i].planta[j].num_pisos; k++) if (m < mi_calle.edificio[i].planta[j].piso[k].precio) m =mi_calle.edificio[i].planta[j].piso[k].precio; printf (El precio del piso ms caro es %f\n, m);

Ejercicios

Ejercicio 1: Escribe la declaracin de un tipo de estructura que se llamar talumno, con la siguiente informacin: Identificador de alumno: un entero Sexo: un carcter (V para varn y H para hembra) Notas: Pasa: un vector de 10 reales que contiene las notas del alumno en las 10 asignaturas un booleano (cierto o falso) que nos dice si el alumno puede pasar o no de curso

Escribe la declaracin de una variable llamada alumno de tipo Talumno, y el cdigo necesario para poner el campo pasa de esa variable a true si el alumno ha aprobado ms de 6 asignaturas o a false en caso contrario. Ejercicio 2: Escribe la declaracin en C de un vector de 50 elementos de tipo talumno. Escribe despus el cdigo necesario para subir, a todas las chicas, 0,5 puntos en la calificacin de todas las asignaturas. Ejercicio 3: Supn que un colegio tiene como mximo 100 alumnos y cada alumno hace siempre 10 asignaturas. Escribe la declaracin de la estructura de datos que se llamar Tcolegio, necesaria para guardar toda la informacin de un colegio. En concreto, la estructura debe tener: Un entero que ser el identificador de colegio Un entero indicando el nmero de alumnos Un vector de elementos de tipo talumno, con la informacin de cada alumno.

Declara una variable de tipo Tcolegio y escribe el cdigo necesario para actualizar el campo pasa de todos los alumnos del colegio (recuerda que el campo pasa debe ser true si el alumno ha aprobado ms de 6 asignaturas y false en caso contrario) . 6