Está en la página 1de 9

Los arreglos bidimensionales, tambin conocidos como tablas o matrices (por su parecido al concepto matemtico), son muy comunes

en la vida diaria; los siguientes ejemplos son algunas representaciones: un tablero de ajedrez; un itinerario de trenes; una hoja de clculo. C# ofrece una extensin natural de arreglos unidimensionales a bidimensionales. Por ejemplo, la siguiente declaracin: int[,] ventas = new int[4, 7]; declara un arreglo bidimensional, o matriz, de enteros. Esta matriz contiene las cifras de ventas de computadoras en cuatro almacenes durante cada uno de los siete das de una semana (figura de abajo). La matriz se llama ventas. En trminos de tabla, podemos considerar que consta de cuatro filas y siete columnas. Cada fila representa una semana en un almacn especfico; cada columna representa un da en cada almacn. Los ndices de las filas van de 0 a 3. Los ndices de las columnas van de 0 a 6. La columna 0 es el lunes, la columna 1 es el martes, etc.

Cul columna representa el sbado? Cuntas computadoras se vendieron el jueves en el almacn 3? En cul nmero de fila y de columna hallamos esa cifra? Tal como hacemos con otras variables y objetos, para declarar una matriz utilizamos la palabra clave new, ya sea en la parte superior de la clase o de un mtodo. El programador asigna un nombre a la matriz, como en los siguientes dos ejemplos: int[,] ventas = new int[4, 7]; double[,] temps = new double[10, 24]; Al declarar una matriz hay que indicar su longitud en trminos de filas y columnas. La matriz llamada ventas consta de cuatro filas, una para cada almacn; adems, tiene siete columnas, una para cada da de la semana. As, la matriz contiene cifras de ventas para cada uno de los cuatro almacenes durante cada da de la semana. Por su parte, la matriz temps contiene informacin sobre la temperatura de 10 hornos, para cada hora durante un periodo de 24 horas.

Al igual que con cualquier otra variable, en el caso de las matrices es comn (y conveniente) elegir nombres que describan con claridad para qu se van a utilizar. Dicho nombre identificar la matriz completa, incluyendo toda la coleccin de datos que la conforma. Declare una matriz para representar un tablero de ajedrez de 8 x 8. Cada casilla de la matriz debe contener una cadena de caracteres. Para hacer referencia a un elemento individual en una matriz bidimensional, el programa debe especificar los valores de dos ndices enteros (tambin conocidos como subndices). Por lo tanto, ventas[3, 2] se refiere al elemento que ocupa la posicin determinada por la fila 3 y la columna 2 en la matriz; en nuestro ejemplo, esta referencia corresponde al almacn nmero 3 y al da nmero 2 (mircoles). De manera similar, tableroAjedrez[2, 7] podra contener la cadena de texto pen. Podemos utilizar el siguiente cdigo para dar un valor a uno de los elementos de la matriz: ventas[2, 3] = Convert.ToInt32(textBox1.Text); tableroAjedrez[3, 4] = textBox1.Text; Adems, es posible desplegar en cuadros de texto los valores de los elementos de la matriz de manera similar, y tambin podemos modificarlos con instrucciones de asignacin, como en el siguiente ejemplo: ventas[3, 2] = 99; tableroAjedrez[2, 7] = "caballo"; // coloca la cadena de texto caballo en la casilla especificada Para referirnos a los elementos individuales de una matriz, en todos los fragmentos de cdigo anteriores hemos especificado los valores de los ndices que los representan. Ahora bien, a menudo es necesario hacer referencia a un elemento de la matriz mediante la especificacin de variables para cada uno de los dos ndices. sta es la forma en que podemos aprovechar el poder de las matrices. Suponga que queremos sumar todos los nmeros de una matriz que contiene datos sobre las ventas de computadoras en cuatro almacenes, durante un periodo de siete das: int[,] ventas= new int[4, 7]; La manera complicada de lograr nuestro propsito sera escribir lo siguiente: suma = ventas[0, 0] + ventas[0, 1] + ventas[0, 2] + ventas[0, 3] + ventas[0, 4] + ventas[0, 5] + ventas[0, 6] + ventas[1, 0] + ventas[1, 1] + ventas[1, 2] + ventas[1, 3] + ventas[1, 4] + ventas[1, 5] + ventas[1, 6] + etctera; Este cdigo es largo, difcil de entender y propenso a errores, pero es correcto. Sin embargo, no aprovecha la regularidad de las matrices. La alternativa sera utilizar un ciclo for en donde se emplean variables para guardar los valores de los ndices. Al principio todos los ndices se hacen igual a 0, y despus su valor se incrementa en cada repeticin del ciclo: int[,] ventas = new int[4, 7]; int suma; suma = 0; for ( int almacn = 0; almacn <= 3; almacn++ ) {

for ( int nmeroDa = 0; nmeroDa <= 6; nmeroDa++ ) { suma = suma + ventas[almacn, nmeroDa]; } } Este cdigo es mucho ms corto y ordenado que si hubiramos escrito todas las sumas con gran detalle. Escriba instrucciones para colocar el texto vaco en cada uno de los cuadros del tablero de ajedrez.

Cuando creamos una matriz de la siguiente forma: double[,] info = new double[20, 40]; estamos dndole un tamao fijo que no se puede modificar, a menos que volvamos a crear la matriz completa mediante new. Por otro lado, tenemos oportunidad de averiguar la longitud de una matriz mediante el mtodo GetLength. El argumento para este mtodo especifica qu dimensin deseamos. Por ejemplo, para la matriz anterior podemos usar: int tamaoFila; tamaoFila = info.GetLength(0); lo cual nos da un valor de 20 y: int tamaoColumna; tamaoColumna = info.GetLength(1); nos da un valor de 40. Cul es el valor de tableroAjedrez.GetLength(0)?

Suponga que necesitamos escribir un mtodo cuya funcin sea calcular la suma de los elementos que conforman una matriz de enteros. Queremos que el mtodo sea de propsito general, para poder manejar matrices de cualquier tamao. Por lo tanto, debemos pasar el nombre de la matriz como parmetro del mtodo; adems, el resultado que se debe devolver al usuario del mtodo es un nmero: la suma de los valores. El siguiente es un ejemplo de una invocacin al mtodo: int[,] ventas = new int[24, 12]; int total; total = Suma(ventas); Y el cdigo del mtodo es: private int Suma(int[,] matriz) { int total = 0;

for ( int fila = 0; fila < matriz.GetLength(0); fila++ ) { for ( int col = 0; col < matriz.GetLength(1); col++ ) { total = total + matriz[fila, col]; } } return total; } El uso de constantes puede evitar confusiones, en especial si dos matrices distintas tienen la misma longitud. Por ejemplo, en el programa para analizar la cantidad de ventas de computadoras en varios almacenes durante cierto nmero de das, utilizamos un arreglo bidimensional para almacenar las cifras. Cada columna representa un da; las filas albergan los datos de cada almacn. Ahora suponga que, por coincidencia, hay siete tiendas (es decir, el mismo nmero que la cantidad de das). La matriz sera: int[, ] ventas = new int[7, 7]; El problema es que cada vez que veamos el dgito 7 en el programa, no sabremos si se refiere a la cantidad de almacenes o al nmero de das. Desde luego, en este caso eso no importa, ya que hay tantos almacenes como nmero de das; pero suponga que necesitamos modificar el programa de manera que trabaje con ocho almacenes. En ese caso sera muy conveniente poder usar el editor para cambiar cada ocurrencia del nmero 7 por el nmero 8. No obstante, eso constituye una opcin muy peligrosa, ya que las longitudes son iguales. Una excelente forma de mejorar el programa consistira en declarar como constantes los valores mximos de los ndices, como se muestra a continuacin: const int das = 7; const int almacenes = 7; Y despus podramos declarar la matriz as: int[, ] ventas = new int[almacenes, das]; Ahora si cambia el nmero de almacenes podemos realizar con confianza la modificacin correspondiente en el programa, ya que slo tenemos que modificar un nmero en la declaracin de las constantes. Tambin podemos escribir ciclos for que hagan uso de las constantes: for ( int ndice = 0; ndice < almacenes; ndice++ ) { // cuerpo del ciclo } Como sabemos, inicializar significa asignar un valor inicial a una variable. Si escribimos: int[, ] tabla = new int[10, 10];

estamos preparando espacio en la memoria para la matriz, que contiene ceros. Adems, el compilador asigna valores iniciales a las matrices que no se inicializan de manera explcita. Si la matriz consiste en nmeros le asigna ceros; si consiste en cadenas de caracteres le asigna el valor "", y si consiste en objetos, asigna el valor null a todos sus elementos. Una forma de inicializar una matriz de manera explcita es utilizar ciclos anidados, como en el siguiente ejemplo: for ( int fila = 0; fila <= 9; fila++ ) { for ( int col = 0; col <= 9; col++ ) { tabla[fila, col] = 99; } } Otra alternativa para inicializar una matriz es declararla como se muestra a continuacin: int[,] tabla = {{1, 0, 1}, {0, 1, 0}}; Observe el uso de las llaves y las comas. El cdigo anterior crea una matriz con dos filas y tres columnas, y le asigna sus valores iniciales. Cuando utilizamos esta forma de inicializacin, la longitud de la matriz no debe aparecer en los corchetes. La inicializacin se lleva a cabo una vez, al momento de crear la matriz. Si el programa modifica el valor de uno de sus elementos, no ser posible restaurarlo a su valor original, por lo menos hasta que vuelva a ejecutarse el programa. En caso de que el programa necesite restablecer peridicamente la matriz de vuelta a sus valores iniciales, deberemos utilizar ciclos for, como vimos antes.

Escriba la declaracin de una matriz de cadenas de texto con longitud de 3 x 3, de manera que se llene con las palabras uno, dos, tres, etc. El siguiente programa mantiene un arreglo bidimensional (o matriz) de enteros. Los valores representan la precipitacin pluvial en un periodo de siete das, en cada una de tres ubicaciones. La interfaz se muestra en la figura de abajo. La matriz se despliega en un cuadro de texto multilnea, mostrando diversos valores iniciales. El usuario puede modificar un valor de la matriz, para lo cual debe especificar los ndices del elemento en cuestin, y el nuevo valor de los datos.

Primero declaramos la matriz: int[,] datosLluvia = {{10, 7, 3, 28, 5, 6, 3},{12, 3, 5, 7, 12, 5, 8},{ 8, 5, 2, 1, 1, 4, 7}}; Para desplegar todos los datos: private void Mostrar() { textBox1.Clear(); for (int ubicacin = 0; ubicacin <= 2; ubicacin++) { for (int nmeroDa = 0; nmeroDa <= 6; nmeroDa++) { textBox1.AppendText(Convert.ToString(datosLluvia[ubicacin, nmeroDa])+ "\t"); } textBox1.AppendText("\r\n"); } } El ciclo for interior recorre los distintos das, mientras que el ciclo for exterior recorre las distintas ubicaciones. Para cambiar un elemento de la matriz hay que obtener el nmero del da, el nmero de la ubicacin y el nuevo valor de datos, para lo cual se emplean los cuadros de texto respectivos: private void CambiarValor() { int valorDatos; int nmeroDa; int ubicacin; nmeroDa = Convert.ToInt32(daTextBox.Text); ubicacin = Convert.ToInt32(ubicacinTextBox.Text); valorDatos = Convert.ToInt32(valorTextBox.Text); datosLluvia[ubicacin, nmeroDa] = valorDatos; Mostrar(); CalcularTotal();

} Para calcular el total de precipitacin pluvial en todas las ubicaciones: private void CalcularTotal() { int total = 0; for (int ubicacin = 0; ubicacin <= 2; ubicacin++) { for (int nmeroDa = 0; nmeroDa <= 6; nmeroDa++) { total = total + datosLluvia[ubicacin, nmeroDa]; } } label1.Text = "el total de precipitacin pluvial es " + Convert.ToString(total); } Al ejecutar este programa tenga cuidado de introducir los nmeros de fila en el rango de 0 a 2, y los nmeros de columna en el rango de 0 a 6. En este cdigo podemos ver de nuevo, que es muy comn encontrar instrucciones for anidadas con arreglos bidimensionales, ya que aprovechan al mximo la uniformidad de stas. Los arreglos bidimensionales, o matrices, son una coleccin de datos con un solo nombre (por ejemplo, datosLluvia). La matriz se puede comparar con una tabla de dos dimensiones: filas y columnas. Suponga que queremos representar los datos de precipitacin pluvial para cada uno de los siete das de la semana en tres lugares. En ese caso declaramos la siguiente matriz: int[, ] datosLluvia = new int[7, 3]; Para acceder a sus elementos especificamos dos ndices, que deben ser nmeros enteros; por ejemplo, datosLluvia[4, 2]. El primer ndice describe el nmero de fila, y el segundo el nmero de columna. Al crear la matriz se especifica la longitud de sus dos dimensiones: 7 y 3, en este ejemplo. Nuestra matriz tiene siete filas y tres columnas. Dado que los ndices siempre empiezan en 0, en este caso los ndices de las filas van de 0 a 6, y los ndices de las columnas de 0 a 2. Los elementos de la matriz pueden ser de cualquier tipo: int, double, string o cualquier otro objeto, pero dentro de una misma matriz todos deben ser del mismo tipo (int, en nuestro ejemplo). La excepcin es cuando se declara una matriz que consiste en objetos tipo Object. En este caso la matriz puede dar cabida a cualquier mezcla de objetos. Es comn utilizar ciclos for anidados junto con los arreglos bidimensionales. C# puede trabajar con matrices de hasta 60 dimensiones, pero en la prctica es muy raro utilizar ms de 3 dimensiones. Un error comn en C# consiste en confundir la longitud de una matriz con el rango de ndices vlidos. Por ejemplo, la matriz: int[, ] tabla = new int[11, 6];

consta de 11 filas y 6 columnas. El rango vlido de los ndices para las filas es de 0 a 10; el rango vlido de ndices para las columnas es de 0 a 5. La referencia a tabla[11, 6] har que el programa se detenga y aparezca un mensaje de error, dado que los valores de fila y columna estn fuera de rango. Los arreglos bidimensionales o matrices, son colecciones de datos organizadas en forma de tabla, con filas y columnas. El programador debe asignar el nombre al momento de crear la matriz. Las matrices se declaran (al igual que otras variables) de la siguiente forma: int[,] animales = new int[25, 30]; en donde 25 es el nmero de filas y 30 el nmero de columnas. Para hacer referencia a un elemento individual de una matriz utilizamos ndices enteros, como en el siguiente ejemplo: animales[12, 3] = 45;

Manejador de datos. Escriba un programa que utilice una matriz de longitud 4 x 7, de nmeros enteros, similar a la que usamos en Precipitacin pluvial (con los resultados que se muestran en la figura de abajo).

Ample el programa para que contenga los siguientes mtodos: Al oprimir un botn etiquetado como sumas, sumar los valores de cada una de las siete columnas y todos los valores de cada una de las cuatro filas; los resultados debern desplegarse en pantalla. Al oprimir un botn etiquetado como mayor, encontrar el valor ms grande de cada fila, de cada columna, y de toda la matriz. Al oprimir un botn etiquetado como escalar, multiplicar cada uno de los valores que conforman la matriz por un nmero introducido por el usuario en un cuadro de texto (esto podra utilizarse para hacer conversiones de centmetros a pulgadas). Ample el programa de precipitacin pluvial de manera que proporcione un botn para calcular el promedio diario de precipitacin pluvial para cada ubicacin. Por ejemplo, la precipitacin pluvial promedio diaria en la ubicacin dos podra ser 23. Mejore todava ms el programa para que tenga un botn que calcule la media y la desviacin estndar de la precipitacin pluvial diaria en cualquier ubicacin. Por ejemplo, la media de la precipitacin pluvial de cualquier ubicacin podra ser de 19, con una desviacin estndar de 6.4.

Gato. El juego conocido como gato o tres en lnea se practica en una cuadrcula de 3 x 3, que en un principio est vaca. Participan dos jugadores, por turnos. Uno de ellos coloca una cruz en un cuadro vaco, y el otro coloca un crculo en otro. Gana la persona que obtenga una lnea de tres crculos o tres cruces. Por ejemplo, una victoria para el participante que usa crculos podra ser: o x o x o x o La partida puede terminar en empate si ninguno de los jugadores logra hacer una lnea de tres. Escriba un programa para jugar gato. Debe haber slo un botn para iniciar un nuevo juego. El programa mostrar los crculos y las cruces de manera grfica, cada uno en su propio cuadro de imagen. Para especificar un movimiento, el jugador humano debe hacer clic con el ratn en el cuadro de imagen en donde se vaya a colocar la cruz. El otro jugador ser la computadora, que decidir al azar en dnde colocar los crculos.