ARRAYS 2
De Bachillerato a Ingeniería (II)
Domina los arrays en C++
Insertar, eliminar y desplazar elementos como en la Universidad
“Si sabes modificar un array, ya tienes medio examen de Programación I aprobado.”
En la primera parte de esta serie aprendimos a recorrer un array, calcular sumas, medias, buscar elementos y obtener máximos y mínimos.
Sin embargo, los exámenes universitarios rara vez se quedan ahí.
En Ingeniería es muy habitual que te pidan:
- insertar un elemento;
- eliminar otro;
- mantener un determinado orden;
- comprobar si un dato ya existe;
- desplazar elementos del array.
De hecho, el examen de Programación I de Ingeniería de Telecomunicación de la Universidad de Málaga utiliza precisamente estas técnicas para gestionar los vagones de un tren.
La buena noticia es que todos esos ejercicios utilizan siempre los mismos algoritmos. Si los aprendes una vez, podrás aplicarlos a muchísimos problemas diferentes.
Antes de empezar
A partir de ahora nuestros arrays tendrán dos conceptos muy importantes.
const int MAX=100;
int numeros[MAX];
int n;
Aquí ocurre algo muy importante.
MAX indica la capacidad máxima.
n indica cuántos elementos hay realmente.
Por ejemplo:
Capacidad máxima: 100
Elementos reales: 8
Visualmente:
0 1 2 3 4 5 6 7 . . . . .
12 45 18 20 90 13 55 41
Los demás huecos están vacíos.
Nunca debemos recorrer hasta MAX.
Siempre hasta n.
Correcto:
for(int i=0;i<n;i++)
Incorrecto:
for(int i=0;i<MAX;i++)
Este es uno de los errores más frecuentes en primero de carrera.
Ejercicio 1
Añadir un elemento al final
Tenemos:
12 45 18 20
n=4
Queremos añadir:
50
Resultado:
12 45 18 20 50
n=5
La solución es muy sencilla.
numeros[n]=50;
n++;
No hace falta mover ningún elemento.
Ejercicio 2
Insertar al principio
Ahora sí hay que mover datos.
Antes
12 45 18 20
Queremos insertar
99
Resultado
99 12 45 18 20
¿Cómo hacerlo?
Nunca debemos empezar desplazando desde el principio.
Si hacemos esto:
12→45
45→18
18→20
Perderemos información.
Siempre se empieza desde el final.
Visualmente:
12 45 18 20
↓
12 45 18 20 20
↓
12 45 18 18 20
↓
12 45 45 18 20
↓
12 12 45 18 20
↓
99 12 45 18 20
Código
for(int i=n;i>0;i--)
{
numeros[i]=numeros[i-1];
}
numeros[0]=99;
n++;
Este algoritmo aparece continuamente en Ingeniería.
Ejercicio 3
Insertar en una posición
Queremos insertar un número en la posición 3.
Antes
10 20 30 40 50
Insertamos
99
Resultado
10 20 30 99 40 50
El algoritmo es exactamente el mismo.
Solo cambia hasta dónde desplazamos.
for(int i=n;i>posicion;i--)
{
numeros[i]=numeros[i-1];
}
numeros[posicion]=99;
n++;
Ejercicio 4
Eliminar un elemento
Ahora ocurre justo lo contrario.
Antes
10 20 30 40 50
Eliminamos el 30.
Resultado
10 20 40 50
Ahora desplazamos hacia la izquierda.
for(int i=posicion;i<n-1;i++)
{
numeros[i]=numeros[i+1];
}
n--;
Muchos estudiantes intentan poner un cero.
No hace falta.
Simplemente disminuimos n.
Ejercicio 5
Buscar un elemento
Vamos a reutilizar un algoritmo de la entrada anterior.
int posicion=-1;
for(int i=0;i<n;i++)
{
if(numeros[i]==buscar)
{
posicion=i;
break;
}
}
¿Por qué inicializamos a -1?
Porque ninguna posición válida puede ser negativa.
Si al terminar sigue valiendo -1, significa que el elemento no existe.
Ejercicio 6
Eliminar por valor
Ya sabemos buscar.
Ahora combinamos dos algoritmos.
Primero buscamos.
Después eliminamos.
int posicion=-1;
for(int i=0;i<n;i++)
{
if(numeros[i]==valor)
{
posicion=i;
break;
}
}
if(posicion!=-1)
{
for(int i=posicion;i<n-1;i++)
numeros[i]=numeros[i+1];
n--;
}
Observa que los ejercicios universitarios casi siempre consisten en unir algoritmos sencillos.
Ejercicio 7
Comprobar duplicados
Antes de insertar un dato debemos asegurarnos de que no existe.
bool existe=false;
for(int i=0;i<n;i++)
{
if(numeros[i]==nuevo)
{
existe=true;
break;
}
}
if(!existe)
{
numeros[n]=nuevo;
n++;
}
Este algoritmo aparece continuamente en bases de datos, listas de usuarios y también en el examen de la UMA.
Ejercicio 8
Mantener un array ordenado
Supongamos que tenemos:
10 20 30 50 60
Queremos insertar:
40
No basta con añadirlo al final.
Debe quedar:
10 20 30 40 50 60
Primero buscamos la posición adecuada.
int pos=0;
while(pos<n && numeros[pos]<nuevo)
pos++;
Después utilizamos exactamente el algoritmo de inserción.
for(int i=n;i>pos;i--)
numeros[i]=numeros[i-1];
numeros[pos]=nuevo;
n++;
Fíjate en un detalle importante: no hemos inventado un algoritmo nuevo, solo hemos combinado dos que ya conocíamos.
Ejercicio 9
Ordenar un array (Método de la burbuja)
Aunque existen algoritmos mucho más rápidos, en primero de carrera suele enseñarse el método de la burbuja porque es fácil de entender.
Si un número es mayor que el siguiente, se intercambian.
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-1-i;j++)
{
if(numeros[j]>numeros[j+1])
{
int aux=numeros[j];
numeros[j]=numeros[j+1];
numeros[j+1]=aux;
}
}
}
No es el algoritmo más eficiente, pero sí uno de los mejores para aprender.
Reto final
Crea un programa para gestionar una lista de jugadores.
Cada jugador estará representado únicamente por su dorsal.
El programa deberá permitir:
- añadir un jugador;
- eliminar un jugador;
- comprobar si ya existe;
- insertar un dorsal manteniendo el orden;
- mostrar todos los dorsales;
- indicar cuántos jugadores hay.
Condiciones:
- máximo 30 jugadores;
- no puede haber dorsales repetidos;
- el array debe permanecer siempre ordenado.
💡 Pista: no necesitas aprender un algoritmo nuevo para resolver este reto. Basta con combinar correctamente los que has aprendido en esta entrada.
Errores típicos que suspenden exámenes
❌ Recorrer hasta MAX en lugar de hasta n.
❌ Olvidar hacer n++ al insertar.
❌ Olvidar hacer n-- al eliminar.
❌ Desplazar desde el principio al insertar (se pierde información).
❌ Desplazar desde el final al eliminar (el resultado es incorrecto).
❌ No comprobar si el array está lleno antes de insertar.
❌ No comprobar si el elemento ya existe cuando el enunciado lo prohíbe.
En la próxima entrega…
Hasta ahora hemos trabajado con arrays de números. Pero el examen de la Universidad de Málaga no almacena enteros, sino vagones, cada uno con un código, un tipo, una capacidad y varios años asociados.
En la siguiente entrada aprenderemos a utilizar estructuras (struct) y arrays de estructuras, el paso definitivo para empezar a resolver ejercicios reales de Ingeniería.
Etiqueta:c++, ies monterroso, PROGRAMACIÓN, tic
