jueves, 11 de marzo de 2010

Matrices

En las matrices de C#, los índices empiezan en cero. Las matrices de C# funcionan de forma similar a como lo hacen en la mayoría de los lenguajes populares; existen, sin embargo, algunas diferencias que se deben conocer.
Cuando se declara una matriz, los corchetes ([]) deben ir después del tipo, no después del identificador. Colocar los corchetes después del identificador no es sintácticamente válido en C#.


int[] table; // no int table[];
Otro detalle es que el tamaño de la matriz no forma parte de su tipo. Esto permite declarar una matriz y asignarle cualquier matriz de objetos int, independientemente de la longitud de la matriz.


int[] numeros; // declare numeros de tipo array int de cualquier tamaño
numeros = new int[10]; // numeros es un array de 10 elementos
numeros = new int[20]; // ahora es un array de 20 elementos

Declarar matrices
C# admite matrices de una dimensión, matrices multidimensionales (matrices rectangulares) y matrices de matrices (matrices escalonadas). El siguiente ejemplo muestra cómo declarar diferentes tipos de matrices:

Matrices unidimensionales:

int[] numeros;


Matrices multidimensionales:

string[,] nombres;


Matrices de matrices (escalonadas):

byte[][] notas;


La declaración de matrices (como se muestra arriba) no crea realmente las matrices. En C#, las matrices son objetos cuyas instancias deben crearse. Los siguientes ejemplos muestran cómo crear matrices:

Matrices unidimensionales:

int[] numeros = new int[5];


Matrices multidimensionales:

string[,] nombres = new string[5,4];


Matrices de matrices (escalonadas):

byte[][] notas = new byte[5][];
for (int x = 0; x < notas.Length; x++)
{
notas[x] = new byte[4];
}



También se pueden utilizar matrices más grandes. Por ejemplo, se puede utilizar una matriz rectangular de tres dimensiones:


int[,,] buttons = new int[4,5,3];


Incluso, se pueden combinar matrices rectangulares y escalonadas. Por ejemplo, el siguiente código declara una matriz unidimensional que contiene matrices tridimensionales de matrices bidimensionales de tipo int:

int[][,,][,] numeros;


Ejemplo
El siguiente es un programa completo en C# que declara y crea instancias de las matrices comentadas anteriormente.


// arrays.cs
using System;
class DeclararArraySimples
{
public static void Main()
{
// array de una dimension
int[] numeros = new int[5];

// Array Multidimensional
string[,] nombres = new string[5,4];

// Array-de-arrays (matriz escalonada)
byte[][] notas = new byte[5][];

// Crear la matriz escalonada
for (int i = 0; i < notas.Length; i++)
{
notas[i] = new byte[i+3];
}

// Imprimir la longitud por cada fila
for (int i = 0; i < notas.Length; i++)
{
Console.WriteLine("Longitud de la fila {0} es {1}", i, notas[i].Length);
}
}
}

Resultado

Longitud de la fila 0 es 3
Longitud de la fila 1 es 4
Longitud de la fila 2 es 5
Longitud de la fila 3 es 6
Longitud de la fila 4 es 7


Inicializar matrices
C# proporciona métodos simples y sencillos para inicializar matrices en el momento de la declaración encerrando los valores iniciales entre llaves ({}). Los siguientes ejemplos muestran diferentes modos de inicializar diferentes tipos de matrices.
Nota Si no inicializa una matriz en el momento de la declaración, sus miembros se inicializan automáticamente con el valor inicial predeterminado para el tipo de matriz. Además, si declara la matriz como campo de un tipo, se establecerá con el valor predeterminado null cuando cree la instancia del tipo.
Matrices unidimensionales

int[] numeros = new int[5] {1, 2, 3, 4, 5};
string[] nombres = new string[3] {"John", "Fer", "Juan"};
El tamaño de la matriz se puede omitir, como se indica a continuación:


int[] numeros = new int[] {1, 2, 3, 4, 5};
string[] nombres = new string[] {"John", "Fer", "Juan"};

También se puede omitir el operador new si se utiliza un inicializador como el siguiente:

int[] numeros = {1, 2, 3, 4, 5};
string[] nombres = {"John", "Fer", "Juan"};
Matrices multidimensionales

int[,] numeros = new int[3, 2] { {1, 2}, {3, 4}, {5, 6} };
string[,] hermanos = new string[2, 2] { {"John","Willy"}, {"Fer","Juan"} };

El tamaño de la matriz se puede omitir, como se indica a continuación:

int[,] numeros = new int[,] { {1, 2}, {3, 4}, {5, 6} };
string[,] hermanos = new string[,] { {"John","Willy"}, {"Fer","Juan"} };

También se puede omitir el operador new si se utiliza un inicializador como el siguiente:

int[,] numeros = { {1, 2}, {3, 4}, {5, 6} };
string[,] hermanos = { {"John","Willy"}, {"Fer","Juan"} };
Matriz escalonada (matriz de matrices)
Las matrices escalonadas se pueden inicializar como en el siguiente ejemplo:

int[][] numeros = new int[2][] { new int[] {2,3,4}, new int[] {5,6,7,8,9} };

El tamaño de la primera matriz se puede omitir, como se indica a continuación:


int[][] numeros = new int[][] { new int[] {2,3,4}, new int[] {5,6,7,8,9} };
O tambien


int[][] numeros = { new int[] {2,3,4}, new int[] {5,6,7,8,9} };

Observe que no existe sintaxis de inicialización para los elementos de una matriz escalonada.
Acceso a miembros de matrices
El acceso a los miembros de una matriz es sencillo. Por ejemplo, el siguiente código crea una matriz denominada numeros y, a continuación, asigna un 5 al quinto elemento de la matriz:


int[] numeros = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
numeros[4] = 5;
El siguiente código declara una matriz multidimensional y asigna el valor 5 al miembro ubicado en [1, 1]:


int[,] numeros = { {1, 2}, {3, 4}, {5, 6}, {7, 8}, {9, 10} };
numeros[1, 1] = 5;
La siguiente es una declaración de una matriz escalonada de una sola dimensión que contiene dos elementos. El primer elemento es una matriz de dos enteros, mientras que el segundo es una matriz de tres enteros:


int[][] numeros = new int[][] { new int[] {1, 2}, new int[] {3, 4, 5} };

La siguiente instrucción asigna 58 al primer elemento de la primera matriz y 667 al segundo elemento de la segunda matriz:


numeros[0][0] = 58;
numeros[1][1] = 667;

Las matrices son objetos
En C#, las matrices son realmente objetos. System.Array es el tipo base abstracto de todos los tipos de matrices. Las propiedades y otros miembros de la clase System.Array se pueden utilizar cuando sea necesario. Un ejemplo de esto sería utilizar la propiedad Length para obtener la longitud de una matriz. El siguiente código asigna la longitud de la matriz numeros, que es 5, a una variable denominada LogitudDeNumeros:


int[] numeros = {1, 2, 3, 4, 5};
int LongitudDeNumeros = numeros.Length;

La clase System.Array proporciona muchos otros métodos y propiedades útiles, como métodos para ordenar, buscar y copiar matrices.
Usar foreach con matrices
C# dispone de la instrucción foreach. Esta instrucción proporciona un modo simple y limpio de iterar en los elementos de una matriz. Por ejemplo, el siguiente código crea una matriz denominada numeros y la recorre mediante la instrucción foreach:


int[] numeros = {4, 5, 6, 1, 2, 3, -2, -1, 0};
foreach (int i in numeros)
{
System.Console.WriteLine(i);
}

Con matrices multidimensionales, se puede utilizar el mismo método para recorrer los elementos, por ejemplo:


int[,] numeros = new int[3, 2] {{9, 99}, {3, 33}, {5, 55}};
foreach(int i in numeros)
{
Console.Write("{0} ", i);
}

El resultado de este ejemplo es:
9 99 3 33 5 55

11 comentarios:

  1. Podriamos decir que en C♯ las matrices se implementan como objetos; entonce para crear una matriz bidimensional que tipo de formanto se utilizaria

    ResponderEliminar
  2. Saludos colega.... Todo -absolutamente todo- se implementa como un objeto en .NET

    Puedes verificar en el post el tag de Matrices multidimensionales.

    La sintaxis para declarar un arreglo de dos dimensiones es bien fácil: tipo[#filas, #columnas] nombre del objeto + implentación o inicialización. Una de orden 2,2 PE:
    string[,] hermanos = new string[2, 2] { {"John","Willy"}, {"Fer","Juan"} };

    http://msdn.microsoft.com/es-es/library/9b9dty7d(VS.80).aspx

    ResponderEliminar
  3. un saludo a JN# mire si esta repuesta esta bien que le voy a responder a
    @jaime Para crear una matriz bidimensional se utiliza el siguiente formato: tipo[,] nombre_matriz = new tipo[filas,columnas]

    ResponderEliminar
  4. Correcto, así como lo menciono en las descripciones y ejemplos y así como el usuario Anonimo lo describió y así como usted lo acaba de decir.

    ResponderEliminar
  5. Por otro lado, no utilicen la palabra formato cuando se van a referir a una sintaxis. Sintaxis es una cosa y Formato es otra. Formato es la forma visual de una expresión(numérica o cadena de caracteres, mas o menos como lo que esta en al final del tema Tablas de Referencias de Tipos (http://3.bp.blogspot.com/_8xH9DRTPzK0/S3Q86gIm0XI/AAAAAAAAABc/QlRLv3B5mNs/s1600-h/T4.bmp). Sintaxis es la forma de declaración de cualquier objeto como los que estan en éste capitulo, ejemplo: tipo[,] nombre_matriz = new tipo[filas,columnas]. Te daras cuenta de que esto es lo mismo que usted escribiste; eso es una sintaxis.

    ResponderEliminar
  6. Prof. como se crea un (Set Up) de un programa hecho en visual basic

    ResponderEliminar
  7. como hago este programa en c sharp, no se que hacer pliss ayudeme

    3.-CONSTRUIR UN CUADRO QUE CONTENGA LAS COMISIONES GANADAS POR TRES VENDEDORES, DE LOS 5 TIPOS DE LINEA BLANCA DE CONOCIDA MUEBLERIA, ADEMAS LISTAS DE COMISIONES TOTALES Y PROMEDIOS GANADAS POR LOS VENDEDORES, ASI COMO LISTAS DE COMISIONES TOTALES Y PROMEDIOS POR TIPO DE LINEA BLANCA

    ResponderEliminar
  8. Eso no se entiende bien, a caso hay que inventarse los datos o qué?

    ResponderEliminar
  9. k complicada es la programacion

    ResponderEliminar
  10. Como podria hacer esto:?
    Matriz 80 x 80 (tengo los numeros)
    Unicamente la puedo recorrer hacia abajo o a la derecha, y debo encontrar haciendo este recorrido la suma menor posible, empezando en la pocision 0 y finalizando en la 79
    Gracias

    ResponderEliminar

Preguntas;Comentarios;Aportes;Criticas Positivas;Recomendaciones.