REGISTROS (Records/Structs) un tipo de dato definido por el PROGRAMADOR que trae grandes ventajas a nuestro código, mejorando significativamente nuestros ALGORITMOS.
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.
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
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.

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

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.
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:

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
También podemos usar arreglos de registros, por ejemplo, para manejar un listado de empleados.
Cada posición del arreglo corresponde a un registro:



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:


Tenemos un curso que tiene 30 alumnos, y cada alumno tiene varios datos que lo definen:
Así que podemos pensar en una estructura que contenga todos esos datos, y lo podamos manejar como una unidad.

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:

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:

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.
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:

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.
Ya tenemos el valor del promedio mayor, ahora queda: buscar los alumnos que tienen ese valor en el promedio e imprimirlos.

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.

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.

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.