ARRAYS 3
Me encanta cómo está quedando la serie. Ahora ya empezamos a entrar en el verdadero nivel universitario. Hasta ahora hemos trabajado con arrays de números. En un examen de Ingeniería casi nunca ocurre eso. Lo normal es almacenar objetos (vagones, alumnos, libros, pacientes, coches…) y ahí aparecen las estructuras.
Esta tercera entrega es probablemente la más importante de toda la serie.
De Bachillerato a Ingeniería (III)
Arrays de estructuras (struct)
El paso definitivo hacia los ejercicios de la Universidad
“Un ingeniero no almacena números. Almacena información.”
Si observas cualquier programa real descubrirás que rara vez trabaja únicamente con enteros.
Un hospital almacena pacientes.
Una biblioteca almacena libros.
Un instituto almacena alumnos.
Una empresa almacena empleados.
Un aeropuerto almacena vuelos.
Y el examen de Programación I de Ingeniería de Telecomunicación de la Universidad de Málaga almacena… vagones de un tren.
Todos ellos tienen algo en común:
Cada elemento tiene varios datos relacionados entre sí.
Por ejemplo, un libro tiene:
- ISBN
- título
- autor
- año
- número de páginas
No tendría sentido tener cinco arrays distintos.
string isbn[100];
string titulo[100];
string autor[100];
int paginas[100];
int anio[100];
Sería muy fácil cometer errores.
Existe una solución mucho mejor.
¿Qué es una estructura?
Una estructura es un tipo de dato creado por nosotros.
Dentro agrupamos toda la información relacionada.
Por ejemplo:
struct Libro
{
string isbn;
string titulo;
int paginas;
int anio;
};
Acabamos de inventar un nuevo tipo de dato.
Ahora podemos escribir:
Libro l1;
igual que escribíamos
int numero;
o
float nota;
Acceder a los campos
Cada dato se accede mediante el operador punto.
l1.isbn="978844153210";
l1.titulo="Fundación";
l1.paginas=296;
l1.anio=1951;
Leerlos es igual de sencillo.
cout<<l1.titulo;
Ejercicio 1
Crear un libro
Crear una estructura llamada Libro con:
- ISBN
- título
- autor
- páginas
- año
Después rellenar un libro y mostrarlo por pantalla.
Solución
#include <iostream>
using namespace std;
struct Libro
{
string isbn;
string titulo;
string autor;
int paginas;
int anio;
};
int main()
{
Libro l;
l.isbn="978844153210";
l.titulo="Fundacion";
l.autor="Isaac Asimov";
l.paginas=296;
l.anio=1951;
cout<<l.titulo<<endl;
cout<<l.autor<<endl;
}
Un array de estructuras
Ahora viene la magia.
Antes hacíamos
int numeros[100];
Ahora hacemos
Libro biblioteca[100];
Cada posición ya no contiene un número.
Contiene un libro completo.
Visualmente
biblioteca[0]
ISBN
Título
Autor
Páginas
Año
biblioteca[1]
ISBN
Título
Autor
Páginas
Año
…
Ejercicio 2
Leer varios libros
const int MAX=100;
Libro biblioteca[MAX];
int n;
Supongamos que queremos introducir cinco libros.
for(int i=0;i<5;i++)
{
cin>>biblioteca[i].isbn;
cin>>biblioteca[i].titulo;
cin>>biblioteca[i].autor;
cin>>biblioteca[i].paginas;
cin>>biblioteca[i].anio;
}
Observa que seguimos utilizando exactamente el mismo recorrido del array.
Lo único que cambia es que cada elemento tiene varios campos.
Ejercicio 3
Mostrar todos los libros
for(int i=0;i<n;i++)
{
cout<<biblioteca[i].isbn<<" ";
cout<<biblioteca[i].titulo<<" ";
cout<<biblioteca[i].autor<<" ";
cout<<biblioteca[i].paginas<<" ";
cout<<biblioteca[i].anio<<endl;
}
Buscar un libro
Igual que buscábamos números.
Solo cambia una línea.
Antes
if(numeros[i]==dato)
Ahora
if(biblioteca[i].isbn==codigo)
Todo lo demás es idéntico.
Ejercicio 4
Buscar por ISBN
Escribir un programa que indique si un libro existe.
Pista:
bool encontrado=false;
for(...)
{
if(...)
{
encontrado=true;
break;
}
}
Ejercicio 5
Buscar el libro con más páginas
Aquí tampoco cambia el algoritmo.
Antes buscábamos el mayor número.
Ahora buscamos el libro cuya variable
paginas
sea mayor.
int mayor=0;
for(int i=1;i<n;i++)
{
if(biblioteca[i].paginas>
biblioteca[mayor].paginas)
mayor=i;
}
Fíjate.
No guardamos el número de páginas.
Guardamos la posición.
Después podremos mostrar todo el libro.
Ejercicio 6
Calcular el número total de páginas
int suma=0;
for(int i=0;i<n;i++)
{
suma=suma+biblioteca[i].paginas;
}
Ejercicio 7
Contar libros publicados antes del año 2000
int contador=0;
for(int i=0;i<n;i++)
{
if(biblioteca[i].anio<2000)
contador++;
}
Ejercicio 8
Insertar un libro
¿Recuerdas el algoritmo de la entrada anterior?
No cambia absolutamente nada.
Solo copiamos estructuras completas.
for(int i=n;i>pos;i--)
{
biblioteca[i]=biblioteca[i-1];
}
biblioteca[pos]=nuevoLibro;
n++;
Una sola línea copia todos los campos.
No hace falta copiar ISBN, título, autor…
El compilador lo hace automáticamente.
Es una de las grandes ventajas de las estructuras.
Ejercicio 9
Eliminar un libro
Exactamente igual.
for(int i=pos;i<n-1;i++)
{
biblioteca[i]=biblioteca[i+1];
}
n--;
Otra vez copiamos estructuras completas.
Mini proyecto
Vamos a construir una pequeña biblioteca.
Cada libro tendrá:
ISBN
Título
Autor
Páginas
Año
El programa permitirá:
✔ Añadir libros.
✔ Buscar por ISBN.
✔ Mostrar todos.
✔ Eliminar un libro.
✔ Calcular el número total de páginas.
✔ Mostrar el libro más largo.
✔ Contar cuántos son anteriores al año 2000.
Si eres capaz de hacer este programa, ya estás muy cerca del nivel que se exige en primero de Ingeniería.
Relación con el examen de Teleco
Ahora observa el enunciado del examen de la Universidad de Málaga.
Cada vagón tiene:
- código
- tipo
- capacidad
- año de fabricación
- año de revisión
Es decir:
struct Vagon
{
string codigo;
int tipo;
int capacidad;
int fabricacion;
int revision;
};
¿Te das cuenta?
No hay nada nuevo.
Simplemente hemos cambiado “Libro” por “Vagón”.
Los algoritmos siguen siendo exactamente los mismos.
Los errores que más puntos hacen perder
❌ Crear cinco arrays independientes en lugar de una estructura.
❌ Confundir . (punto) con otras formas de acceso.
❌ Recorrer hasta MAX en lugar de hasta n.
❌ Buscar comparando toda la estructura en lugar del campo correcto (isbn, codigo, etc.).
❌ Copiar los campos uno a uno cuando basta con escribir:
biblioteca[i]=biblioteca[i-1];
❌ Pensar que una estructura es complicada. En realidad, una estructura no es más que una “caja” que contiene varias variables relacionadas.
Reto final (Nivel Universidad)
Diseña un programa para gestionar una flota de vehículos.
Cada vehículo tendrá:
- matrícula
- marca
- modelo
- año de fabricación
- kilómetros recorridos
El programa deberá permitir:
- añadir vehículos;
- buscar por matrícula;
- eliminar un vehículo;
- mostrar toda la flota;
- calcular el kilometraje total;
- encontrar el vehículo más antiguo;
- contar cuántos vehículos tienen más de 200.000 km.
💡 Consejo de ingeniero: cuando un ejercicio te parezca enorme, no pienses en el programa completo. Piensa en pequeños problemas: “¿sé recorrer un array?”, “¿sé buscar por un campo?”, “¿sé insertar?”. La mayoría de los exámenes universitarios, incluido el de la UMA, no son más que una combinación inteligente de esas piezas básicas.
En la cuarta entrega…
Empezaremos a escribir programas como un ingeniero: dividiremos el problema en funciones pequeñas (imprimeLibro(), buscarISBN(), existeLibro(), calcularPaginas(), etc.). Descubrirás que un ejercicio de 300 líneas deja de dar miedo cuando lo separas en diez funciones de 20 o 30 líneas cada una. Esa es precisamente la estrategia que utilizan los buenos programadores… y la que necesitarás para resolver con éxito un examen como el de Programación I de la Universidad de Málaga.
Etiqueta:c++, ies monterroso, programación, TELECO, tic
