LABORATORIO 12: ESTRUCTURAS
La agrupación de varios elementos de diferentes tipos de datos
almacenados bajo una misma variable se llama ESTRUCTURA o REGISTRO.
Hasta el momento los tipos de datos que se han utilizado son los tipos de datos
simples (entero, real, carácter,...) y conjuntos de estos (arreglos). Sin embargo
en muchos casos es necesario o conveniente utilizar tipos de datos que no son
simples, es decir tipos de datos que están compuestos por combinaciones de tipos
de datos simples. Estos tipos de datos se denominan registros (algoritmia) o
estructuras en C/C++.
Un registro es un dato estructurado, donde cada uno de sus componentes se denomina campo. Los Campos de un registro pueden ser todos de diferentes tipos por lo tanto, tambien podran ser registros o Arreglos. Cada campo se identifica por un nombre único ( el identificador de campo ).
Cada uno de los campos esta definido por un tipo de dato que puede ser diferente, para cada campo, y utilizando los tipos de datos básicos o tipos de datos definidos por el programador.
Ejemplo: Definir un registro en lenguaje C que permita almacenar los datos básicos de los clientes de un banco (número, apellido, nombre, saldo)
struct datosCliente{
/*datosCliente será el nombre del registro*/
int numCuenta;
/*Número de cuenta del cliente*/
char Apellido[15];
/*Apellido del cliente*/
char Nombre[10];
/*Nombre del cliente*/
float balance;
/*Saldo (balance) de la cuenta del cliente*/
};
/*Fijese que en la primera linea de la declaración
de la estructura se marca el inicio de un bloque utilizando {,
al final de la declaración de la estructura se debe marcar el fin del bloque
con }
y ;.*/
Generalmente al definir un registro es conveniente realizar una definición de tipo, ya que con frecuencia este tipo de dato compuesto se utilizará en funciones y en otros ámbitos. Para definir un registro como tipo de dato, simplemente se agrega la palabra clave typedef, así:
typedef struct datosCliente{
/*datosCliente será el nombre del registro*/
int numCuenta;
/*Número de cuenta del cliente*/
char Apellido[15];
/*Apellido del cliente*/
char Nombre[10];
/*Nombre del cliente*/
float balance;
/*Saldo (balance) de la cuenta del cliente*/
};
12.3 Acceso a los campos de un registro
Como se mencionó, un registro está compuesto por campos, donde los campos son variables que corresponden a algún tipo de dato simple o definido por el usuario o aún arreglos de tipos de datos definidos por el usuario, es decir los registros poseen una considerable versatilidad para solucionar problemas que involucran el manejo de información. Sin embargo, esta versatilidad implica el tener que utilizar métodos de acceso a variables (campos), un poco diferente a lo utilizado hasta ahora.
Como un registro es un dato estructurado no puede accesarse directamente como un todo, sino que debe especificarse que elemento ( campo ) del registro interesa. Para ello, en la mayoria de los lenguajes Se sigue la siguiente sintaxis:
Variable_registro.nombre_campo1/*Referencia al campo1 de una variable registro.*/
En general, se debe considerar un registro como una jerarquía de acceso a la información que contiene, de tal forma que siempre se deberá acceder a un campo teniendo en cuenta que primero se debe acceder al registro que lo contiene, separando cada nivel por el operador de acceso punto (.). Por ejemplo: Sí un registro1 contiene un campo que es a su vez del tipo registro2, el campo 1 de este último registro deberá ser accedido así:
variable_registro1.variable_registro2.campo1_registro2
Ejemplo de acceso al número de cuenta de un registro de tipo datosCliente:
struct datosCliente registro_ejemplo;
/*registro_ejemplo es la variable registro de tipo
datosCliente para este ejemplo.*/
/*Cuando se define un registro es recomendable utilizar la palabra clave struct
antes del tipo de registro.*/
/*La declaración de una variable de tipo registro es similar a la declaración
de una variable de tipo entero o de cualquier otro tipo básico. Es decir,
se coloca el tipo del registro, que se definió previamente (en este caso:
datosCliente)
y luego el nombre de la variable (registro_ejemplo).*/
registro_ejemplo.numCuenta=12456;
/*Se asigna el número de cuenta 12456, a registro_ejemplo.*/
scanf("%d", ®istro_ejemplo.numCuenta);
/*Para leer de teclado y asignar un número de cuenta
al registro de ejemplo.*/
La diferencia entre la utilización de registros y la utilización de variables de tipo simple, la constituye la necesidad de referirse al nombre de la variable registro para poder acceder a un campo.
El código de ejemplo, contiene diferentes funciones e instrucciones que muestran claramente la utilización de registros, en su uso más común para solución de problemas: registros de vectores.
Código fuente del ejemplo (sin funciones)
Código fuente del ejemplo (con programación modular)
El ejemplo con funciones incluye funciones para volcar el contenido del arreglo de registros a un archivo de texto denominado datos.txt que se creará en el directorio desde donde se ejecute el ejemplo. Igualmente, se muestra una función para realizar el procedimiento contrario, es decir, leer el archivo creado y mostrarlo por pantalla.
Actividades:
1. A partir del código fuente del ejemplo anterior implemente funciones que realicen lo siguiente: listar los clientes cuyo apellido empieza por una letra indicada por el usuario, actualizar los saldos de las cuentas de un cliente específico, incrementar el saldo de todas las cuentas en 1.01%, ordenar el listado de clientes por cualquiera de sus campos, agregar un menú que permita al usuario realizar cualquiera de las operaciones mencionadas (adicionar las operaciones implementadas en el ejemplo).
2. Basado en el ejercicio, plantee una pequeña aplicación que
realice un manejo similar considerando que un banco puede tener varias sucursales.