Que son las matrices

Si bien los arreglos eran similares a una tabla de una sola columna en Word, las matrices son toda una tabla pero con más de 1 columna. Por ejemplo, un tablero de ajedrez es una matriz de 8X8. Los arreglos solo tienen filas 1 una sola columna, las matrices además de filas, tienen columnas. Veamos un ejemplo:

Fig. 1 Representación de una matriz

1 8 4 6
3 4 7 8
0 7 5 3

La fig. 1 es una matriz de 3X4, 3 filas y 4 columnas.

Para acceder a los datos de una matriz lo hacemos de forma similar a los arreglos. Por ejemplo, la instrucción:

K = matriz[0,1];

Nos devolvería en la variable K el valor 3, pues estamos accediendo a la fila 0 en la columna 1. Una buena practica de programación es pensar en una matriz como un plano en un eje de coordenadas cartesianas, y matriz[x,y] nos devolverá el valor correspondiente a x en las filas y a y en las columnas. Esto tiende a confundir pues matriz[1,0] no devolvería un 3, devolvería un 8. Podemos crear matrices tan grandes como lo admita la memoria, y dentro de ellas solo podemos guardar valores de un mismo tipo. Funciona de igual forma a los arrays, de modo las matrices son una forma especial de array pero con mas de una columna. La forma de declarar una matriz es similar a un arreglo, pongamos un ejemplo:

Ejemplo 1 Gramática de declaración de una matriz.
Tipo [,] Nombre = new Tipo [ancho, largo];

Ejemplo 2 Declaración de una matriz de enteros de 8 filas y 8 columnas.
Int [,] my_matrix = new Int[8,8];

En el ejemplo 2 tenemos la declaración de una matriz llamada my_matrix de 8 filas por 8 columnas de enteros.

Si quisiéramos hacer un juego de ajedrez, la matriz seria el tipo de dato que utilizaríamos para controlar el estado del tablero.

Matrices en la practica, primer problema

Analicemos ahora este problema. Se necesita organizar una lista de estudiantes de una escuela por sus notas. Debe imprimirse la lista organizada de los nombres y las notas correspondientes. Para abreviar el problema y centrarnos en lo que nos interesa realmente, no vamos a programar la parte de entrar los datos por teclado. Asume que existe una matriz llamada estudiantes_notas[,]  de dos columnas y 5 filas con los nombres y las notas de los estudiantes.

La primera columna contendrá los nombres y la segunda columna las notas. Pero aquí tenemos un problema, por definición, las matrices contienen solo un tipo de datos; o sea que si queremos guardar notas como enteros, solo podemos guardar enteros. En cambio si queremos guardar nombres,como string, solo podemos guardar string. ¿Cómo podríamos guardar ambos tipos de datos? Sencillamente no se puede, pero hay técnicas que simulan ese comportamiento.

Ya sabemos que para poder hacer operaciones matemáticas sobre datos, estos datos deberían ser de algún tipo numérico; o sea no podemos sumar 2 strings pues estaríamos concatenando y no sumando. Por ejemplo el string “1” lo sumamos con el string “2” y nos daría como resultado un string “12”. Si quisiéramos sumar sus valores respectivos aún siendo string, tendríamos que hacer un casting o conversión de datos. Existe un método que luce asi int.convertir(), y su funcion es convertir un string a un entero. 

Ejemplo 1:

Int K = 0;
String n1 = “1”;
String n2 = “2”;
K = int.convertir(n1) + int.convertir(n2);

En este ejemplo obtenemos en la variable entera K, la suma de los valores correspondientes a n1 y n2 como enteros. Y esta es la solución. Declaramos la matriz de string para poder guardar nombres y notas, y las notas las guardamos como string. A la hora de ordenar la lista “castearemos” o convertiremos cada valor de nota a entero, para asi poder aplicar operaciones numericas de comparación.

El «metodo burbuja» es para organizar listas sencillas

El método que utilizaremos para organizar la lista de estudiantes se llama Método Burbuja o Bubble Sort. Es el método de organización mas común y también el mas simple. Existen otros métodos mas eficientes como el Radix Sort, pero estos métodos se usan en listas mas grandes ya que matematicamente estan mejor disennados para mayores volumenes de datos.

El método burbuja consiste en comparar cada elemento de una lista con cada elemento de la lista. Si quisiéramos organizar la lista de mayor a menor dentro del ciclo, comparamos el elemento 1 con el 2; y si el elemento 1 es menor que el 2 entonces intercambiamos sus posiciones auxiliándonos de la variable temporal, y así sucesivamente con el elemento 3, 4 .. n. Para organizar la lista de menor a mayor, hacemos lo mismo pero en lugar de utilizar la operación es menor ( < ), utilizamos la operación es mayor (>).

Pongamos el ejemplo:

Ejemplo 2:

string temp_nota ;
string temp_nombre;
Desde(int i = 0;i<=4;i++) {
  Desde(int j = i+1;j<=4;j++) {
     Si (int.convertir(e_notas[1,j]) > int.convertir(e_notas[1,i])){
       temp_nota = e_notas [1, j];
       e_notas [1, j] = e_notas [1, i];
       e_notas [1, i] = temp_nota;
       temp_nombre = e_notas [0, j];
       e_notas [0, j] = e_notas [0, i];
       e_notas [0, i] = temp_nombre;
     }
  }
}
Desde(int i = 0;i<=4;i++) {
  Imprimir (e_notas[0, i] . " " . e_notas[1, i] );
}

Explicacion del algoritmo anterior

Declaramos 2 variables temporales para poder intercambiar los valores de las notas y los nombres sin perderlos en el intercambio (swap). También vemos la utilización de 2 ciclos Desde, uno anidado dentro del otro. Los indexadores i y j se usan para acceder a las posiciones de la matriz. La función de estos dos ciclos es tener acceso a dos posiciones a la vez de la misma matriz con el objetivo de poder comparar.

Para cada iteración de i  tenemos 5 iteraciones de j, por tanto usando a i  y a j podemos comparar cada elemento indexado por j  con i. También cabe aclarar que j se inicializa en  i+1, y esto es muy conveniente pues solo nos interesa comparar el valor que hay en la posición i con los valores de las posiciones que le preceden. Los valores de las posiciones que le anteceden a i, ya estarían organizados de mayor a menor.

Seguido vemos dentro del ciclo anidado el bloque de código que intercambia los valores de las posiciones respectivas. Y aquí resalta el uso de las variables temporales, que se llaman así porque su valor cambia en cada iteración. La unica funcion de estas variables es hacer un backup de la información que se intercambiará para lograr la organización de la matriz.

Swap (intercambio) de variables

Teóricamente, si tenemos dos posiciones de memoria a y b y queremos copiar lo que hay en b  para a, y lo que hay en a para b, y hacemos a = b, y después b = a, el resultado sería que en a  y b, quedaría el valor de b, y el valor de a  se perdería. Para evitar esto, usamos la temporal t,  y haríamos :

Ejemplo 3

t = a;
a = b;
b = t;

Así hacemos un backup de a  en t, y no perdemos su valor.

Analogia de los recipientes

Si no has comprendido como y por que es necesario el swap, te propongo la siguiente analogia. Imagina que en tu cocina tienes un vaso de agua(variable a) y uno de ron (variable b). Necesitas mover el ron (contenido de la variable b) para el vaso de agua, y el agua(contenido de la variable a) para el vaso de ron. Como lo haces? Es obligatorio disponer de otro recipiente (variable temporal) para verter ahi un liquido. De esta forma liberas espacio en un recipiente sin perder el contenido que tenia.

Swap multiple

Lo mismo hacemos con la matriz pero usamos dos temporales pues nos interesa intercambiar 2 valores en la misma posición, una nota y un nombre.

Seguido viene el ciclo para imprimir el resultado, con el que resolvemos el problema. Ya tenemos una lista organizada de mayor a menor. Si quisiéramos organizarla de menor a mayor, solo habría que cambiar el signo “>”  por el signo ”<”.

matrices

Conclusiones del curso

Hasta aqui una serie de conceptos extremadamente basicos, pero muy utiles a la vez. El siguiente curso sera de Programacion Orientada a Objetos y vas a necesitar todo lo que aprendiste en este de Introduccion a la Programacion. Ya entraremos en codigo fuente real utilizando varios lenguajes de programacion y te vas a dar cuenta del porque usamos en este curso introductorio el concepto de Pseudocodigo. Basicamente con traducir las intrucciones que aprendiste como «Desde», «Mientras», «Si», «Sino» al lenguaje en cuestion, te sorprenderas al saber que ya sabes programar al menos lo basico.

El verdadero mundo de la programacion comienza ahora, si te ha gustado el articulo y quieres continuar, puedes seguir con el proximo curso de Programacion Orientada a Objetos. Acabas de subir el primer escalon, te animas?