Algoritmos 6: Registros

REGISTROS (Records/Structs) un tipo de dato definido por el PROGRAMADOR que trae grandes ventajas a nuestro código, mejorando significativamente nuestros ALGORITMOS.

Introducción a los registros en programación

Los registros son estructuras que hace referencia a un grupo de elementos, pueden ser de distinto tipo, a diferencia de los arrays que manejan un solo tipo de dato.

Esta estructura es útil cuando tenemos que manejar datos relacionados, porque lo podemos hacer bajo una misma unidad, algo que permite crear un código más legible, más fácil de manejar y es un primer paso a la abstracción, un tema importante que nos lleva a la programación orientada a objetos.

Tipo de Dato Definido por el Programador

Un registro es un tipo de dato definido por el programador (no existe, se crea), formado por uno o varios elementos.

Estos elementos pueden ser datos básicos… como entero, decimal, carácter,  palabra… ó pueden ser datos estructurados como… vector, matriz, otros registros inclusive, a cada uno de estos elementos se lo llama campo.

Un registro se define de la forma: 

REGISTRO nombre_registro

INICIO

        tipo_de_dato campo1

        tipo_de_dato campo2

        tipo_de_dato campo3

        …

FIN

nombre_registro mivariable

  • nombre_registro el nombre del registro o identificador.
  • campo por campo, el tipo de dato del campo y el nombre del campo.
  • Y finalmente se crea la variable que va a tener ese tipo de dato.

Ejemplo: Cálculo del sueldo de empleados

Supongamos que tenemos que hacer un algoritmo para calcular el sueldo de los empleados de una empresa.

Debemos conocer el legajo, el nombre y el monto. Toda esta información  representa a un empleado, es un claro ejemplo de Registro.

Definimos el registro RegEmpleado, que va a contener los campos ENTERO legajo, PALABRA nombre, y DECIMAL monto.

introducción a la programación

Y para poder usarlo creamos una variable de tipo RegEmpleado, que podemos llamar empleado1, y va a guardar los datos de un determinado empleado.

introducción a la programación

La ventaja de usar un registro en  lugar de distintas variables simples, es la de poder acceder mediante un único identificador a la colección completa de datos.

Con una única variable accedemos a toda la información del empleado… del alumno… de la persona.

Acceso a los campos

Para acceder a los campos de un registro usamos el nombre o  identificador  de  la  variable de tipo registro y el operador punto (.) seguido del nombre del campo al que queremos acceder:

identificador.campo

y lo tratamos como una variable. Por ejemplo para el caso del registro empleado podemos hacer:

introducción a la programación

Leo empleado1.nombre  para cargar el nombre.

empleado1.monto = empleado1.monto * 2 para operar con el monto como una variable de tipo decimal

imprimo empleado1.legajo para mostrar datos

ARREGLO DE REGISTROS

También podemos usar arreglos de registros, por ejemplo, para manejar un listado de empleados.

Cada posición del arreglo corresponde a un registro:

introducción a la programación
introducción a la programación
introducción a la programación

Definimos el arreglo de registros como una variable de tipo RegEmpleado empleados[10], que corresponde a un arreglo de 10 empleados, y operamos como con cualquier vector.

Si queremos acceder al empleado de la posición 5, para imprimir sus datos, podemos hacerlo de la siguiente manera: 

introducción a la programación

Ejemplo: Listado de alumnos con promedio mayor

introducción a la programación

Tenemos un curso que tiene 30 alumnos, y cada alumno tiene varios datos que lo definen:

  • legajo
  • nombre
  • 5 notas

Así que podemos pensar en una estructura que contenga todos esos datos, y lo podamos manejar como una unidad.

introducción a la programación

Un registro RAlumno que va a contener los campos: ENTERO legajo, PALABRA nombre, un arreglo de DECIMAL notas[5] y una variable DECIMAL promedio para calcularlo una sola vez y dejarlo ahí.

Como son 30 alumnos podemos usar un arreglo de 30 elementos de tipo RAlumno, para manejar los datos de cada uno de los alumnos, por lo que en la función principal creamos el vector de RAlumno alumnos de 30 elementos:

introducción a la programación

Cargamos datos

El algoritmo tiene que cargar los datos del cada alumno, así que usamos una función que se ocupe de la carga de datos cargarAlumnos:

introducción a la programación

No retorna nada y recibe como parámetro por REFERENCIA el vector de alumnos. Necesitamos un ciclo para cargarlo y otro ciclo para cargar las 5 notas.

Una vez cargadas todas las notas podemos calcular el promedio, aprovechando el mismo ciclo anterior, y dentro del mismo ciclo de carga de notas ir acumulando el promedio.

Este ciclo se repite para los 30, alumnos así que desde el programa principal lo invocamos, y al salir queda cargado el vector de alumnos.

Mayor promedio

Para imprimir los alumnos con el mayor promedio, puede ser uno o más de uno que tengan el mismo promedio, así que lo primero es averiguar cuál es el valor del mayor promedio. Creamos una función que retorne este valor:

introducción a la programación

Recibe como parámetro por referencia el vector, que no se modifica, pero lo pasamos así para no desperdiciar memoria. Recorremos el vector de alumnos y si alumnos[posicion].promedio es mayor a la variable mayor, le asignamos alumnos[posicion].promedio, asi esta variable va a ir almacenando el mayor promedio. Finalmente retornamos esta variable.

Buscamos mayores

Ya tenemos el valor del promedio mayor, ahora queda:  buscar los alumnos que tienen ese valor en el promedio e imprimirlos.

introducción a la programación

Mediante una función mostrarMayorPromedio que reciba el vector (por referencia) y el valor del mayor promedio (por valor) e imprima los datos de los alumnos que tengan ese promedio.

introducción a la programación

Recorremos el vector usando una variable posicion y si alumnos[posicion].promedio es igual a promedio, encontramos uno mayor, imprimimos.

Desde el programa principal invocamos a las 3 funciones, cumpliendo con los requisitos del algoritmo.

introducción a la programación

Esta es una forma de resolverlo, la práctica te va a llevar a pensar 2 o 3 soluciones diferentes para cada problema con el que te encuentres.


Pero antes, como la única manera de aprender es practicando, aca te dejo unos ejercicios para que practiques y puedas poner en práctica lo que viste:



  //Defino el tipo registro de Libro
  REGISTRO Libro
    PALABRA titulo
    PALABRA autor
    ENTERO año
    PALABRA color
  FIN_REGISTRO

  VARIABLES  
    Libro libros[3]  // Arreglo para almacenar los datos de 3 libros
    ENTERO i
  
  INICIO
    // Cargo los datos de los libros
    PARA i = 0 A 2
    INICIO
      IMPRIMIR "Ingrese los datos del libro " + (i + 1) + ":"
      IMPRIMIR "Título:"
      LEER libros[i].titulo
      IMPRIMIR "Autor:"
      LEER libros[i].autor
      IMPRIMIR "Año de publicación:"
      LEER libros[i].año
      IMPRIMIR "Color del libro:"
      LEER libros[i].color
    FIN_PARA
  
    // Muestro los datos de los libros
    IMPRIMIR "Datos de los libros registrados:"
    PARA i = 0 A 2
    INICIO
      IMPRIMIR "Libro " + (i + 1) + ":"
      IMPRIMIR "Título: " + libros[i].titulo
      IMPRIMIR "Autor: " + libros[i].autor
      IMPRIMIR "Año de publicación: " + libros[i].año
      IMPRIMIR "Color: " + libros[i].color
    FIN_PARA
  
  FIN
        

  // Defino el tipo registro de Producto
  REGISTRO Producto
    ENTERO codigo
    PALABRA descripcion
    DECIMAL precio
  FIN_REGISTRO
  
  VARIABLES  
    Producto producto  // Variable para almacenar los datos de un producto
  
  INICIO
    // Cargo los datos del producto
    IMPRIMIR "Ingrese los datos del producto:"
    IMPRIMIR "Código:"
    LEER producto.codigo
    IMPRIMIR "Descripción:"
    LEER producto.descripcion
    IMPRIMIR "Precio:"
    LEER producto.precio
  
    // Muestro los datos del producto ingresado
    IMPRIMIR "Datos del producto ingresado:"
    IMPRIMIR "Código: " + producto.codigo
    IMPRIMIR "Descripción: " + producto.descripcion
    IMPRIMIR "Precio: " + producto.precio
  FIN
          
        

  // Defino el tipo registro de Habitación
  REGISTRO Habitacion
    ENTERO numero
    ENTERO piso
    PALABRA tipo  // Ejemplo: "Simple", "Doble", "Suite"
    DECIMAL precioPorDia
    PALABRA estado  // Ejemplo: "Disponible", "Ocupada"
  FIN_REGISTRO
  
  VARIABLES  
    Habitacion hotel[50]  // Arreglo para almacenar las 50 habitaciones
    ENTERO i, dias, habitacionSeleccionada
    DECIMAL total
  
  INICIO
    // Inicializo las habitaciones
    PARA i = 0 A 49
    INICIO
      hotel[i].numero = i + 1
      hotel[i].piso = (i / 10) + 1
      hotel[i].tipo = "Simple"  // Para simplificar, todas serán "Simple"
      hotel[i].precioPorDia = 100.0 + (i * 2)  // Precio variable para ejemplificar
      hotel[i].estado = "Disponible"
    FIN_PARA
  
    // Buscar habitaciones disponibles y listar sus datos
    IMPRIMIR "Habitaciones disponibles:"
    PARA i = 0 A 49
    INICIO
      SI (hotel[i].estado == "Disponible") ENTONCES
        IMPRIMIR "Número: " + hotel[i].numero + ", Piso: " + hotel[i].piso + ", Tipo: " + hotel[i].tipo + ", Precio por día: " + hotel[i].precioPorDia
      FIN_SI
    FIN_PARA
  
    // Imprimir el estado de todas las habitaciones
    IMPRIMIR "Estado de todas las habitaciones:"
    PARA i = 0 A 49
    INICIO
      IMPRIMIR "Número: " + hotel[i].numero + ", Estado: " + hotel[i].estado
    FIN_PARA
  
    // Liquidar una habitación
    IMPRIMIR "Ingrese el número de habitación a liquidar:"
    LEER habitacionSeleccionada
    habitacionSeleccionada = habitacionSeleccionada - 1  // Ajustar al índice del arreglo
  
    SI (hotel[habitacionSeleccionada].estado == "Ocupada") ENTONCES
      IMPRIMIR "Ingrese la cantidad de días que estuvo ocupada:"
      LEER dias
      total = dias * hotel[habitacionSeleccionada].precioPorDia
      IMPRIMIR "El monto total a liquidar para la habitación " + (habitacionSeleccionada + 1) + " es: " + total
      hotel[habitacionSeleccionada].estado = "Disponible"  // Cambiar el estado a Disponible
    SINO
      IMPRIMIR "La habitación seleccionada no está ocupada."
    FIN_SI
  FIN
          
        

  // Defino el tipo registro de Sucursal
  REGISTRO Sucursal
    ENTERO codigoSucursal
    PALABRA nombreSucursal
  FIN_REGISTRO
  
  // Defino el tipo registro de Area
  REGISTRO Area
    ENTERO codigoArea
    PALABRA nombreArea
  FIN_REGISTRO
  
  // Defino el tipo registro de Empleado
  REGISTRO Empleado
    PALABRA nombre
    PALABRA apellido
    DECIMAL sueldoBasico
    Sucursal sucursal  // Relación con el registro Sucursal
    Area area          // Relación con el registro Area
  FIN_REGISTRO
  
  VARIABLES  
    Empleado empleados[50]  // Arreglo para almacenar los datos de 50 empleados
    ENTERO i
  
  INICIO
    // Cargar los datos de los empleados
    PARA i = 0 A 49
    INICIO
      IMPRIMIR "Ingrese los datos del empleado " + (i + 1) + ":"
      IMPRIMIR "Nombre:"
      LEER empleados[i].nombre
      IMPRIMIR "Apellido:"
      LEER empleados[i].apellido
      IMPRIMIR "Sueldo básico:"
      LEER empleados[i].sueldoBasico
  
      // Cargar sucursal
      IMPRIMIR "Código de la sucursal:"
      LEER empleados[i].sucursal.codigoSucursal
      IMPRIMIR "Nombre de la sucursal:"
      LEER empleados[i].sucursal.nombreSucursal
  
      // Cargar área
      IMPRIMIR "Código del área:"
      LEER empleados[i].area.codigoArea
      IMPRIMIR "Nombre del área:"
      LEER empleados[i].area.nombreArea
    FIN_PARA
  
    // Mostrar los datos de los empleados
    IMPRIMIR "Datos de los empleados registrados:"
    PARA i = 0 A 49
    INICIO
      IMPRIMIR "Empleado " + (i + 1) + ":"
      IMPRIMIR "Nombre: " + empleados[i].nombre
      IMPRIMIR "Apellido: " + empleados[i].apellido
      IMPRIMIR "Sueldo Básico: " + empleados[i].sueldoBasico
      IMPRIMIR "Sucursal: Código: " + empleados[i].sucursal.codigoSucursal + ", Nombre: " + empleados[i].sucursal.nombreSucursal
      IMPRIMIR "Área: Código: " + empleados[i].area.codigoArea + ", Nombre: " + empleados[i].area.nombreArea
    FIN_PARA
  
  FIN
          
        

En el siguiente artículo veremos recursividad, un tema importante para tratar problemas de naturaleza recursiva.

Recursos utilizados