Algunas operaciones con datos pertenecientes a un array son especialmente frecuentes: buscar si existe un cierto dato, añadir un dato al final de los existentes, insertar un dato entre dos que ya hay, borrar uno de los datos almacenados, etc. Por eso, vamos a ver las pautas básicas para realizar estas operaciones, y un fuente de ejemplo.
Para ver si un dato existe, habrá que recorrer todo el array, comparando el valor almacenado con el dato que se busca. Puede interesarnos simplemente saber si está o no (con lo que se podría interrumpir la búsqueda en cuanto aparezca una primera vez) o ver en qué posiciones se encuentra (para lo que habría que recorrer todo el array). Si el array estuviera ordenado, se podría buscar de una forma más rápida, pero la veremos más adelante.
Para encontrar el máximo o el mínimo de los datos, tomaremos el primero de los datos como valor provisional, y compararemos con cada uno de los demás, para ver si está por encima o debajo de ese máximo o mínimo provisional, y cambiarlo si fuera necesario.
Para poder añadir un dato al final de los ya existentes, necesitamos que el array no esté completamente lleno, y llevar un contador de cuántas posiciones hay ocupadas, de modo que seamos capaces de guardar el dato en la primera posición libre.
Para insertar un dato en una cierta posición, los que queden detrás deberán desplazarse "hacia la derecha" para dejarle hueco. Este movimiento debe empezar desde el final para que cada dato que se mueve no destruya el que estaba a continuación de él. También habrá que actualizar el contador, para indicar que queda una posición libre menos.
Si se quiere borrar el dato que hay en una cierta posición, los que estaban a continuación deberán desplazarse "hacia la izquierda" para que no queden huecos. Como en el caso anterior, habrá que actualizar el contador, pero ahora para indicar que queda una posición libre más.
Vamos a verlo con un ejemplo:
// Ejemplo_04_01_04a.cs
// Añadir y borrar en un array
// Introducción a C#, por Nacho Cabanes
using System;
public class Ejemplo_04_01_04a
{
public static void Main()
{
int[] datos = {10, 15, 12, 0, 0};
int capacidad = 5; // Capacidad maxima del array
int cantidad = 3; // Número real de datos guardados
int i; // Para recorrer los elementos
// Mostramos el array
for (i=0; i maximo)
maximo = datos[i];
Console.WriteLine("El máximo es {0} ", maximo);
// Añadimos un dato al final
Console.WriteLine("Añadiendo 6 al final");
if (cantidad < capacidad)
{
datos[cantidad] = 6;
cantidad++;
}
// Y volvemos a mostrar el array
for (i=0; iposicionInsertar; i--)
datos[i] = datos[i-1];
datos[posicionInsertar] = 30;
cantidad++;
}
// Y volvemos a mostrar el array
for (i=0; i
que tendría como resultado:
10 15 12
15 encontrado en la posición 2
El máximo es 15
Añadiendo 6 al final
10 15 12 6
Borrando el segundo dato
10 12 6
Insertando 30 en la posición 3
10 12 30 6
Este programa "no dice nada" cuando no se encuentra el dato que se está buscando. Se puede mejorar usando una variable "booleana" que nos sirva de testigo, de forma que al final nos avise si el dato no existía (no sirve emplear un "else", porque en cada pasada del bucle "for" no sabemos si el dato no existe, sólo sabemos que no está en la posición actual).
Ejercicios propuestos:
Ejercicio propuesto 4.1.4.1: Crea una variante del ejemplo anterior (04_01_04a) que pida al usuario el dato a buscar, avise si ese dato no aparece, y que diga cuántas veces se ha encontrado en caso contrario.
Ejercicio propuesto 4.1.4.2: Crea una variante del ejemplo anterior (04_01_04a) que añada un dato introducido por el usuario al final de los datos existentes.
Ejercicio propuesto 4.1.4.3: Crea una variante del ejemplo anterior (04_01_04a) que inserte un dato introducido por el usuario en la posición que elija el usuario. Debe avisar si la posición escogida es incorrecta (porque esté más allá del final de los datos).
Ejercicio propuesto 4.1.4.4: Crea una variante del ejemplo anterior (04_01_04a) que borre el dato que se encuentre en la posición que elija el usuario. Debe avisar si la posición escogida no es válida.
Ejercicio propuesto 4.1.4.5: Crea un programa que prepare espacio para un máximo de 10 nombres. Deberá mostrar al usuario un menú que le permita realizar las siguientes operaciones:
- Añadir un dato al final de los ya existentes.
- Insertar un dato en una cierta posición (como ya se ha comentado, los que quedén detrás deberán desplazarse "a la derecha" para dejarle hueco; por ejemplo, si el array contiene "hola", "adios" y se pide insertar "bien" en la segunda posición, el array pasará a contener "hola", "bien", "adios".
- Borrar el dato que hay en una cierta posición (como se ha visto, lo que estaban detrás deberán desplazarse "a la izquierda" para que no haya huecos; por ejemplo, si el array contiene "hola", "bien", "adios" y se pide borrar el dato de la segunda posición, el array pasará a contener "hola", "adios"
- Mostrar los datos que contiene el array.
- Salir del programa.
En ocasiones, manejaremos valores que realmente no van a variar. Es el caso del tamaño máximo de un array. En esos casos, por legibilidad y por facilidad de mantenimiento del programa, puede ser preferible no usar el valor numérico, sino una variable. Dado que el valor de ésta no debería cambiar, podemos usar la palabra "const" para indicar que debe ser constante, y el compilador no permitirá que la modifiquemos por error. Además, por convenio, para que sea fácil distinguir una constante de una variable, se suele escribir su nombre totalmente en mayúsculas:
const int MAXIMO = 5;
Así, una nueva versión del fuente del apartado 4.1.3 (b), usando una constante para la capacidad del array podría ser:
// Ejemplo_04_01_05a.cs
// Quinto ejemplo de tablas: constantes
// Introducción a C#, por Nacho Cabanes
using System;
public class Ejemplo_04_01_05a
{
public static void Main()
{
const int MAXIMO = 5; // Cantidad de datos
int[] numeros = new int[MAXIMO];
int suma;
for (int i=0; i
Ejercicios propuestos:
Ejercicio propuesto 4.1.5.1: Crea un programa que contenga un array con los nombres de los meses del año. El usuario podrá elegir entre verlos en orden natural (de Enero a Diciembre) o en orden inverso (de Diciembre a Enero). Usa constantes para el valor máximo del array en ambos recorridos.