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 !ue se compone de varios datos de tipos elementales diferentes
"or ejemplo, podemos tener una aplicacin !ue trabaje con los clientes de nuestro
banco #a informacin relativa a un cliente se podr$a componerse de:
Identificador %n n&mero entero
Nombre %n vector de caracteres
Saldo %n n&mero real
' naturalmente, !uerremos trabajar con muchos clientes (!uiz un vector de clientes)
En el lenguaje de programacin (, el mecanismo !ue permite trabajar con este tipo de
estructuras de datos es la construccin struct (estructuras) En las pr)imas secciones
veremos cmo trabajar con esta construccin
3 Las estructuras en C
*eamos primero un ejemplo de un programa !ue declara + usa estructura para
representar a un cliente
,
#include <stdio.h>
void main ()
{
struct
{
int id; //identificador del cliente
char nom[20]; // nombre
float saldo;
cliente;
!rintf ("#scribe el identificador $ el nombre del cliente%n");
scanf ("&d &s"' (cliente.id' cliente.nom);
cliente.saldo )0.0;
if (cliente.id > *00)
!rintf (" #l cliente es &s%n"'cliente.nom);

El programa declara una variable llamada cliente !ue es una estructura !ue 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 + un real
llamado saldo para almacenar el saldo del cliente
El acceso a cada uno de esos campos es mu+ fcil -implemente se escribe el nombre de
la variable, un punto + el nombre del campo al !ue !ueremos acceder
1. Construye un proyecto que contenga el programa anterior, y veriica que unciona
correctamente. !espu"s #a$ la prueba siguiente%
"on un punto de parada en la sentencia if Ejecuta el
programa hasta ese punto de parada
(oloca la variable cliente en la ventana del .atch Esta
ventana tendr el aspecto mostrado a la derecha
El signo / dentro de un cuadrado indica !ue cliente es una
variable compuesta + !ue, por tanto, contiene diversos campos
con informacin
Haz clic en ese signo / -e abrir la estructura + la ventana de
.atch tendr el aspecto de la derecha
#a ventana te est mostrando los tres campos de la estructura, +
el contenido de cada uno de esos campos 0$jate !ue el campo
nom es tambi1n una estructura compuesta (en este caso un
vector) "odr$amos abrirla para ver su contenido (haciendo clic
en el signo /) pero no vale la pena por!ue +a estamos viendo
!ue contiene la palabra +uis
& 'ectores (e estructuras
2ormalmente trabajaremos con vectores de estructuras 0$jate en el ejemplo siguiente,
en el !ue trabajamos con un vector de clientes
El programa lee del terminal la informacin de varios clientes, !ue guarda en un vector
de clientes, + luego recorre el vector para detectar los clientes !ue tienen un saldo
superior a ,333 + escribe en la pantalla sus nombres
4
0$jate en la construccin t$!edef !ue aparece antes del programa principal (on esta
construccin estamos (einien(o un nuevo tipo de dato !ue se llamar ,cliente'
!ue es una estructura !ue contiene tres campos (identificador, nombre + saldo) En
realidad todav$a no hemos (eclara(o ning&n cliente -implemente estamos diciendo
!ue a partir de este momento usaremos la palabra ,cliente para (eclarar variables
!ue contendrn clientes En el ejemplo se separa la definicin de la estructura de la
declaracin de los variables 5e este modo el programa !ueda ms claro
0$jate como hemos definido el tipo de estructura ,lista En esta estructura tendremos
la lista de clientes #a estructura contiene un campo para guardar el n&mero de clientes
de la lista, + otro campo !ue es en realidad un vector de clientes 6bserva cmo hemos
usado la palabra ,cliente para indicar !ue cada elemento del vector es en realidad
una estructura !ue contiene la informacin de un cliente En el vector caben hasta ,33
clientes (el valor de la constante -./) pero puede haber menos En el campo numero
tendremos siempre el n&mero de clientes !ue realmente ha+ en el vector
%na vista grafica de la estructura del tipo ,lista podr$a ser:
7
#include <stdio.h>
#define -./ *00
t$!edef struct
{
int id; //identificador del cliente
char nom[20]; // nombre
float saldo;
,cliente;
t$!edef struct
{
int numero;
,cliente cliente[-./];
,lista;
void main ()
{
,lista mis0clientes;
int i;
!rintf ("#scribe el numero de clientes%n");
scanf ("&d"' (mis0clientes.numero);
for (i)0; i<mis0clientes.numero; i11)
{
!rintf ("#scribe idenfificador' nombre $ saldo%n");
scanf ("&d"'(mis0clientes.cliente[i].id);
scanf ("&s"'mis0clientes.cliente[i].nom);
scanf ("&f"'(mis0clientes.cliente[i].saldo);
;
for (i)0; i<mis0clientes.numero; i11)
if (mis0clientes.cliente[i].saldo > *00.0)
!rintf (" #l cliente es &s%n"'mis0clientes.cliente[i].nom);

mis0clientes
id id 888 888888 888888 8888 888 888 888 888 8888 888 888 888
888 888 888 888 888 88 88 88 888 888 888 888 888 888 888
888 888 888 888 888 888 888 888 888 888 888 888 888 888 8
id
nom nom nom
saldo saldo saldo
cliente93: cliente9,: cliente9;A<8,:
0$jate ahora en el programa principal, donde declaramos por fin una variable de tipo
,lista 5espu1s leemos el n&mero de clientes + entramos en un bucle para leer los
datos de todos esos clientes 0inalmente, tenemos el bucle !ue recorre la lista para
realizar la tarea
0$jate finalmente cmo accedemos a los campos de las estructuras "or ejemplo:
mis0clientes.cliente[i].saldo
=al + como se ha e)plicado antes, primero se pone el nombre de la variable, + despu1s
un punto seguido el nombre del campo al !ue !ueremos acceder En este ejemplo, como
el campo es un vector, tendremos !ue poner el $ndice correspondiente a la posicin del
vector a la !ue !ueremos acceder (omo resulta !ue cada posicin del vector es a su vez
una estructura, tenemos !ue poner un punto seguido del nombre del campo de esa
estructura al !ue !ueremos acceder
2. Construye un proyecto que contenga la aplicacin (e ejemplo y veriica que unciona
correctamente. !espu"s #as otra ejecucin siguien(o las instrucciones siguientes.
"on un punto de parada al inicio del segundo bucle for +
ejecuta hasta ese punto de parada (introduce el valor 7 como
valor de numero de clientes)
(oloca la variable mis0clientes en la ventana del .atch
(lica sobre el signo / para abrir la variable *eras una imagen
como la !ue tienes a la derecha =e indica !ue tienes 7 clientes,
!ue estn en el vector cliente
Haz clic en el signo / del campo cliente *eras una imagen
como la de la derecha Estas viendo el vector de clientes
Haz clic en el signo / del cliente !ue ha+ en la posicin 3 #a
imagen ser como la de la derecha, + estars viendo los datos
del primer cliente
) *n ejemplo m+s complejo
numero
>
'a sabes prcticamente toda la teor$a !ue ha+ !ue saber para manejar estructuras +
vectores de estructuras #o &nico !ue !ueda es algo ms de prctica trabajando con
estructuras complejas !ue contienen estructuras, !ue a su vez tienen dentro otras
estructuras, etc "ara ello, veamos un ejemplo
0$jate 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;
-upn !ue en el programa principal se han hecho las siguientes declaraciones:
void main ()
{
Tcalle mi_calle;
Tpiso p;
*eamos ahora algunos ejemplos de accesos a estas estructuras de datos
, Escribir en pantalla el precio del piso 4 de la planta , del edificio >
printf (%f\n,mi_calle.edificio[4].planta[1].piso[2].precio);
4 (opiar en p los datos del piso , de la planta 3 del edificio 4
p? mi_calle.edificio[2].planta[0].piso[1];
,-jate que es posible copiar (e golpe to(a una estructura, en ve$ (e copiar campo a
campo.
@
7 Escribir en pantalla los metros cuadrados totales del edificio 7
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 !ue se llamar talumno,
con la siguiente informacin:
Adentificador de alumno: un entero
-e)o: un carcter (B*C para varn + BHC para hembra)
2otas: un vector de ,3 reales !ue contiene las notas del alumno
en las ,3 asignaturas
"asa: un booleano (cierto o falso) !ue nos dice si el alumno
puede pasar o no de curso
Escribe la declaracin de una variable llamada alumno de tipo Talumno, + el cdigo
necesario para poner el campo pasa de esa variable a true si el alumno ha aprobado
ms de D asignaturas o a false en caso contrario
Ejercicio 2: Escribe la declaracin en ( de un vector de @3 elementos de tipo
talumno Escribe despu1s el cdigo necesario para subir, a todas las chicas, 3,@
puntos en la calificacin de todas las asignaturas
Ejercicio 3: -upn !ue un colegio tiene como m)imo ,33 alumnos + cada alumno hace
siempre ,3 asignaturas Escribe la declaracin de la estructura de datos !ue se llamar
Tcolegio, necesaria para guardar toda la informacin de un colegio En concreto, la
estructura debe tener:
%n entero !ue ser el identificador de colegio
%n entero indicando el n&mero de alumnos
%n vector de elementos de tipo talumno, con la informacin de cada
alumno
D
5eclara una variable de tipo Tcolegio + escribe el cdigo necesario para actualizar el
campo pasa de todos los alumnos del colegio (recuerda !ue el campo pasa debe ser
true si el alumno ha aprobado ms de D asignaturas + false en caso contrario)
E

También podría gustarte