jueves, 25 de noviembre de 2010

VECTORES Y MATRICES

ANTES QUE NADA LES DEJO UN VIDEO BÁSICO DE ARREGLOS PARA ENTENDERLO






ARREGLOS


Un arreglo, en el argot informático "array", es una matriz de 1xn elementos. En java los Arrays deben inicializarse con un tamaño concreto, y debes controlar si en la posicion del array existe un elemento o está vacío para evitar nullpointers.


Si el array tiene n elementos que lo llenan completamente, las posiciones de los mismos van desde 0 (1º elemento) hasta n-1 (último elemento).


Se pueden declarar arreglos de clases, no solamente de tipos primitivos:

Punto [ ] polígono;
Persona [ ] familia;

Cuando creamos su contenido:

Familia = new Persona[5];


Sólo se crean las referencias a cinco futuros objetos del tipo Persona, pero no esta creando esos objetos. Es como haber declarado cinco variables de ese tipo, aunque todas agrupadas bajo la forma de un vector. En algún momento esos lugares del arreglo, se poblarán con referencias a objetos del tipo Persona, pero en este momento, sólo se declaro el arreglo, y no se crearon sus valores.


Luego tendremos que crear los objetos de uno, por ejemplo:

Familia[0] = new Persona("Adan");

Observamos que el primer elemento del arreglo se referencia con el índice 0, entre corchetes [ ].


Una de las características que acercan a los arreglos a las clases, es que tiene un atributo, length, que devuelve la cantidad de sus elementos. Es típico usar:

for (int k=0; k
En Java se controlan los valores correctos de los índices. Si en el arreglo familia definido arriba, se accede a un elemento no definido, como familia [20], se produce una excepción IndexOutOfBoundsException. Como siempre, Java nos protege de los habituales errores de programación. Esta excepción permite detectar accesos inválidos en ejecución, que en otro caso, podrían provocar acceso a memoria no asignada, o peor aún, a memoria asignada a otros objetos de nuestro proceso.


Un arreglo es un valor como cualquier otro, en Java, y puede enviarse como argumento a un método. En ese caso, el método no recibe un duplicado del arreglo, sino simplemente una referencia.
Un caso que apareció desde los primeros ejemplos, se encuentra en el método main() de varias clases con punto de entrada:

public static void main(String [] args)

En estos casos, args recibe un arreglo de objetos String, que son los parámetros recibidos por el programa.


MATRICES EN JAVA



Se podría decir que es la unión de dos vectores por eso se le conoce como bidimensional, o arreglo de arreglo, aquí uno ejemplo bajado de internet.



Existen los arreglos de múltiples dimensiones, por ejemplo, podemos declarar:

double [ ][ ] matriz;

En estos casos, creamos primero un vector de filas, por ejemplo:

matriz = new double[10][ ];

¿Qué significa esta notación? Estamos creando un vector de 10 elementos, cada uno de los cuales será a su vez un arreglo de reales. Esos diez elementos todavía no están inicializados.

Podemos luego crear:

matriz[0] = new double[10];
matriz[1] = new double[7];
...

Notamos que no necesariamente es una matriz rectangular. Más bien, es un vector de vectores. La primer "fila" contendrá 10 elementos reales, mientras que la segunda apenas 7.

No podemos cambiar el tamaño de un vector, una vez creado. Pero podemos tranquilamente asignar un nuevo valor de vector a una variable de ese tipo:

puntos = new Punto[10];
...
puntos = new Punto[20]; // Nuevo vector






El anterior objeto referenciado por puntos, en caso de no estar referenciando en ninguna otra parte del sistema, será liberado por el proceso de recolección de basura, como cualquier otro objeto inalcanzable por nuestro programa.
Aplicándolo a un ejemplo. Seguimos con los ejemplos simples de consola, escrito en un archivo Argumentos.java:


// Clase Argumentos

public class Argumentos {

// Método de entrada

public static void main(String [] args) {
int k; // variable índice

for (k=0; k System.out.println("Argumento " + k
+ ": " + args[k];
}
}


Compilamos el programa y lo ejecutamos.

Al principio, no sucede nada, no produce salida. Claro, el programa toma los argumentos que le pasamos, y los recibe como parámetros en el main. Esta forma de tomar los parámetros de la línea de comando, es lo normal en Java. El método main() que venimos usando desde hace un tiempo en los ejemplos, siempre tiene un arreglo de String como parámetro.

En ese argumento, Java coloca las palabras que se le pasaron al programa en la línea de comando, cuando se le invocó. Si ejecutamos:

produce como salida:

Argumento 0: alfa
Argumento 1: beta
Argumento 2: gamma

Vemos que en la declaración del argumento, no viene el tamaño del arreglo: se desconoce ese dato hasta la ejecución. Por eso, en el ciclo for usamos la expresión

k < args.length para conseguir la cantidad de elementos recibidos.

Aqui un ejercicio básico para ingresar el dato de la matriz y luego imprimirlo


import java.io.*;
public class matrices {

public static void main(String[] args)throws IOException {
//introducimos el numero de filas y columnas de la matriz
BufferedReader lee=new BufferedReader (new InputStreamReader (System.in));
int nfilas,ncols;
//numero de columnas
System.out.println("introduzca el numero de columnas de la matriz");
ncols=Integer.parseInt(lee.readLine());
//numero de filas
System.out.println("introduzca el numero de filas de la matriz");
nfilas=Integer.parseInt(lee.readLine());
float[][]m=new float[nfilas][ncols];
int i=0;
int j=0;
System.out.println("digite los valores de la matriz");//con for anidados

for(i=0;i {
for (j=0;j {
System.out.println("m[" +i+"]["+j+"]=");

m[i][j]=Integer.parseInt(lee.readLine());
}
}

//suma de las filas
for(i=0;i {
float sumafila=0;
for (j=0;j {
sumafila+=m[i][j];
}
System.out.println("suma de la fila"+nfilas+"="+sumafila);
}
}}




Método que muestra los elementos de una matriz multidimensional
public static void mostrarmatriz(double matriz[][]){
int i,j;int filas=matriz.length;int columnas=matriz[0].length;//recorrido de las filas de una matrizfor(i=0;i //recorrido de los elementos de una filafor(j=0;j }}

1 comentario: