lunes, 30 de marzo de 2015

Matrices en C#

Las matrices simplemente son bytes de memoria  contiguos que almacenan datos a los que se accede usando un indice que esta en la matriz. En esta sección se analizan las matrices unidimensionales, multidimensionales y escalonadas.
Declaración de matrices unidimensionales
Suponga que esta escribiendo una aplicación de C# para que los profesores introduzcan las calificaciones de los exámenes para da uno de los estudiantes de su clase y quiere declarar variables que almacenen la puntuación del examen de cada alumno.
Como la calificación  del examen esta entre 0 y 100 puede usar tipos de byte. Si su programa admite 25 estudiantes en una clase, su primer pensamiento puede ser declarar 25 variables por separado: 
byte ExamenParaEstudiante1;
byte ExamenParaEstudiante2;
byte ExamenParaEstudiante3;
byte ExamenParaEstudiante4;
// ... mas ...
byte ExamenParaEstudainte25;
Esto requirirá mucho tiempo y su código sera difícil de leer y mantener con todas esas variables. Lo que necesita es un modo de decir: "Quiero tener una colección de 25 variables". Es decir, lo que queremos es una matriz.
Una matriz es colección de variables, cada una de las cuales tiene el mismo tipo de variable. Las matrices tiene un tamaño que especifica cuantos elementos puede contener.
La declaración de una matriz es algo así: 
byte [] ExamenParaEstudiantes;
La declaración byte especifica que todos los elementos de la matriz son valores de tipo byte. Mediante los corchetes se indica al compilador de C# que quiere crear una variable de matriz, en vez de una sola variable, y el identificador ExamenParaEstudiantes es el nombre de la matriz.

El elemento que falta en esta declaración es el tamaño de la matriz. ¿Cuanto elementos puede contener esta matriz? El tamaño de la matriz se especifica mediante el operador de C# new. Este operador indica al compilador de C# que quiere reservar suficiente memoria para una nueva variable, en este caso, una matriz de 25 variables byte:
byte [] ExamenParaEstudiantes;
ExamenParaEstudiantes = new byte[25];
La palabra clave byte indica al compilador que quiere crear una nueva matriz de variables byte, y [25] indica que quiere reservar suficiente espacio para 25 variables byte. Cada variable de la matriz se denomina elemento de la matriz, y la matriz que acaba de crear contiene 25 elementos.
Debe acordarse de especificar el tipo de matriz cuando use la palabra clave new, aunque ya haya especificado el tipo de la matriz cuando la declaro. Si olvida hacerlo, obtendrá un mensaje de error del compilador.El código: 
byte [] ExamenParaEstudiantes;
ExamenParaEStudiantes = new [25];
Hace que el compilador de C# emita el error:

error CS1031: Se esperaba un tipo dato

Este error aparece porque el código no tiene un tipo de variable entre la nueva palabra clave y el tamaño de la matriz.
También debe recordar usar el mismo tipo de uso cuando declaro la matriz. Si usa un tipo diferente, obtendrá otro mensaje de error, como muestra el siguiente código:
 byte [] ExamenParaEstudiantes;
ExamenParaEStudiantes = new  long [25];
Este código hace que el compilador de C# emita el error:

error CS0029: No se puede convertir implicitamente el tipo 'long[]' a 'byte[]'

El error se produce porque el tipo de la instrucción (byte) no concuerda con el tipo usado en la nueva instrucción (long).
Las matrices como esta se llaman matrices unidimensionales. Las matrices unidimensionales tiene un factor que determina el tamaño de la matriz es el numero de estudiantes de la clase.
El valor inicial de los elementos de la matriz queda determinado por los valores por defecto del tipo de matriz. Cada elemento de la matriz se inicializan con un valor por defecto. Como la matriz contiene elementos de tipo byte, cada elemento de la matriz tiene un valor por defecto de 0.

Declaración de matrices multidimensionales
Puede pensar en una matriz unidimensional como en una linea. Se extiende en una dirección. Puede imaginarse una matriz multidimensional con dos dimensiones como un trozo de papel de gráfica. Sus dimensiones no solo se extiende hacia fuera, sino también hacia abajo. Esta sección estudia los tipos mas comunes de matriz.

Uso de Matrices rectangulares
Continuamos con el ejemplo de las clasificaciones de los exámenes. La matriz unidimensional definida en la sección previa contenían un conjunto de calificaciones de 25 estudiantes. Cada estudiante dispone de un elemento en la matriz para almacenar una calificación. Pero, ¿que ocurre si quiere almacenar varias calificaciones para varios estudiantes? Ahora tiene una matriz con dos factores que afectan a su tamaño: el numero de estudiantes y de exámenes. Suponga que sus 25 estudiantes harán 10 exámenes a lo largo del curso. Eso significa que el profesor tiene que corregir 250 exámenes por curso. Puede declarar una matriz unidimensional para que contengan las 250 calificaciones.
byte [] ExamenParaEstudiantes;
ExamenParaEstudiantes = new byte[250];
Pero esto podría resultar confuso. ¿Como se usa esta matriz? ¿Aparecen primero las purificaciones de un solo estudiante o colocamos en primer lugar las calificaciones del primer estudiante?
Un modo mejor de declarar una matriz consiste en especificar cada dimensión por separado. Declarar una matriz consiste en especificar cada dimensión por separado. Declarar una matriz multidimensional es tan sencillo como colocar comas entre los corchetes. Coloque una coma menor que el numero de dimensiones necesarias para su matriz multidimensional, como en la siguiente declaración:
byte [,] ExamenParaEstudiantes;
Esta declaración define una matriz multidimensional de dos dimensiones. Usando el operador new para crear una nueva matriz de este tipo están sencillo como especificar las dimensiones individualmente, separadas por comas, en los corchetes, como se muestra en el siguiente código:
ExamenParaEstudiantes = new byte [10 , 25];
Este código indica al compilador de C# que quiere crear una matriz con una dimensión de 10 y otra dimensión de 25. Puede imaginar una matriz de dos dimensiones como una hoja de calculo de Microsoft Excel con 10 filas y 25 columnas.
Escribir el código para almacenar una calificación de 75 para el primer examen del alumno 25 seria algo así:
ExamenParaEstudiantes[0 , 24] = 75;
Leer la calificación del quinto examen del alumno 16 seria algo asi:
byte AlumnoDiecisies;
AlumnoDIecisies = ExamenParaAlumnos[4, 15];
Definición de matrices escalonadas
C# permite definir matrices escalonadas, en las que cada fila puede tener un numero diferente de columnas. Volvamos al ejemplo de las calificaciones de los estudiantes para explicarlo. Suponga también que el numero máximo de exámenes es 10, pero algunos estudiantes no tienen que hacer los últimos si obtuvieron buena nota en los anteriores. Puede crear una matriz rectangular  para lo que necesite almacenar, pero puede acabar con elementos que no se utilizan en su matriz rectangular. Si algunos estudiantes no hacen todos los exámenes, tendrá elementos en su matriz rectangular para lo que necesite almacenar, peor puede acabar con los elementos que no se utilizan en su matriz rectangular. Si algunos estudiantes no hacen todos los exámenes tendrá elementos en su matriz rectangular que no se usan. Estos elementos desaprovechados equivalen a memoria desperdiciada, lo que prendemos evitar.
Una estrategia mejor consiste en definir una matriz en la que cada elemento de la matriz sea, en si mismo, una matriz.
Las matrices escalonadas se definen utilizando dos grupos de corchetes inmediatamente después del nombre del tipo de matriz. Cuando hace una llamada new, se especifica un tamaño para la primera dimensión (la matriz student en nuestro ejemplo), pero no para la segunda. Tras definir la primera matriz, haga una nueva llamada a new para definir las otras matrices (las matrices score en nuestro ejemplo):
byte [] [] ArregloDeExamenes;
ArregloDeExamenes = new byte [25] [];
ArregloDeExamenes[0] = new byte[3];
ArregloDeExamenes[0] = new byte[5];
ArregloDeExamenes[0] = new byte[2];
ArregloDeExamenes[24] = new byte[10];
Una vez que ha construido la matriz escalonada, puede acceder a sus elementos de la misma forma en una matriz rectangular.

Fuente: Aqui 
Compartir en:    Facebook Twitter Google+

2 comentarios:

  1. Interesante, pero te falta hacer la explicación utilizando un poco de explicación gráfica también, ya que este tipo de matrices son un poco confusas. Se pueden hacer matrices de filas fijas y columnas variables o columnas fijas y filas variables.

    ResponderEliminar
  2. A propósito del título de la página, a mí tampoco me gusta mucho el C# que digamos, no me gustan mucho los lenguajes con sintáxis casi crípticas (C, Java, PHP, Python, Perl y otros), por eso prefiero Visual Basic, Pascal, Fortran.

    ResponderEliminar