02 mayo 2007

Operaciones frecuentes con arrays

Hay una serie de operaciones que son muy frecuentes cuando uno tiene una serie de datos almacenados en un array. En ocasiones se trata de "operaciones reales", y otras veces son ejercicios casi "puramente académicos", destinados a ayudar a afianzar conocimientos a la gente que comienza a programar.

En cualquier caso, es una duda habitual de programadores que comienzan, por lo que vamos a ver las operaciones que más se repiten. En los casos supondré que tenemos un array que no está totalmente lleno de datos, y que los datos existentes están al comienzo del array.

Definir un array: reservamos espacio y "anotamos" que todavía no hay ningún dato.

#define MAXDATOS 100

float datos[MAXDATOS];
int cantidadDatos = 0;


Añadir un dato al final: si queda espacio, lo guardamos en la última posición y aumentamos el contador.

if (cantidadDatos < MAXDATOS) {
datos[cantidadDatos] = valor;
cantidadDatos++;
}


Ver si existe un cierto valor: si el array no está ordenado, habrá que recorrerlo de principio a fin hasta encontrar el valor o ver si el array termina.

encontrado = 0;
for (i=0; i < cantidadDatos; i++)
if (datos[i] == valorBuscado) {
encontrado = 1;
break;
}



Hallar el valor máximo (en una lista no ordenada): podemos comenzar asumiendo que el máximo es el primer valor de la lista y entonces comparar con todos los demás para ver si alguno es mayor que él (estamos dando por sentado que hay al menos un dato en la lista).
maximo = datos[0];
for (i=1; i < cantidadDatos; i++)
if (datos[i] > maximo)
maximo = datos[i];


Hallar el valor mínimo: similar al anterior.


Eliminar una posición de la lista: habrá que mover "hacia atrás" todos los datos que existían a continuación del que eliminamos, y entonces "anotar" que hay un dato menos (ni siquiera haría falta "vaciar" el último dato).

for (i=posicionABorrar; i < cantidadDatos-1; i++)
datos[i] = datos[i+1];
cantidadDatos--;


Insertar un valor en una posición: habrá que mover "hacia adelante" todos los datos a partir de esa posición (deberemos empezar desde el final), y finalmente guardar el dato.

if (cantidadDatos < MAXDATOS) {
for (i=cantidadDatos; i >= posicionInsertar;i--)
datos[i+1] = datos[i];
datos[posicionInsertar] = nuevoValor;
cantidadDatos++;
}



Ordenar los datos: hay muchas formas de ordenar. Normalmente las más sencillas son también las menos eficientes, pero como no buscamos eficiencia, sino entender una forma simple de ordenar, podríamos utilizar el método de "la burbuja": en la primera pasada se compara el primer número con el segundo, y se intercambian si están en orden incorrecto; luego se compara el segundo con el tercero, el tercero con el cuarto, y así sucesivamente. De esta forma, al final de la primera pasada ya tenemos el último número colocado al final. Luego repetimos con los n-1 restantes, para obtener otro número, y así hasta terminar. Se trata de dos bucles "for":


for (i=0; i < cantidadDatos-1; i++)
for (j=i+1; j < cantidadDatos; j++)
if (datos[i] > datos[j]) {
temporal = datos[i];
datos[i] = datos[j];
datos[j] = temporal;
}

2 comentarios:

Seltika dijo...

Te agradesco mucho, esta info me es muy util.

Nuevamente te agradesco que te ayas tomado el tiempo de redactar esta lista ; -)

Anónimo dijo...

Felicidades por tu pagina, es muy buena.

Particularmente te felicito por el curso de videojuegos por comenzar desde lo mas basico, ideal para los que empezamos.

Esta el curso de juegos completo asi o tienes pensado ampliarlo?

Te animarias a escribir un articulo sobre pathfinder?

Gracias y felicidades de nuevo.