Está en la página 1de 33

Arreglos y matrices

Curso de Computacin

Objetivos
Manipular una coleccin de datos usando vectores Declarar y utilizar un vector de tipos de datos primitivos en la implementacin de un programa Inicializar vectores mediante lazos y en la declaracin Utilizar lazos para realzar operaciones con vectores. Ordenar un vector Leer datos desde un archivo y almacenarlos en un vector

Definicin de vector
Un vector es una coleccin del mismo tipo de datos. Declaracin de un vector: Tipo[] identificador;
lluvia[0] lluvia[1] lluvia[2] lluvia[3] lluvia[4] lluvia[5] lluvia[6] lluvia[7] lluvia[8] lluvia[9] lluvia[10] lluvia[11]

0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

O
Tipo identificador[]; Un vector es un objeto en java Un vector se construye con el operador new double lluvia[]; lluvia = new double[12]; O double lluvia[] = new double[12]; Se crea un vector de 12 componentes

Acceso a los elementos


Los elementos de un vector se acceden mediante un subndice.
lluvia[2] o lluvia[i+1]

El ndice de la primera posicin de un vector es siempre 0.

Ejemplo
Leer 12 valores de lluvia mensual y calcular el promedio
double lluvia[] = new double[12]; double mediaAnual, suma = 0.0; for( int i = 0; i < 12; i++) { lluvia[i] = entrada.getDouble( lluvia para el mes + (i+1)+:); suma += lluvia[i]; } mediaAnual = suma/12; System.out.println(Media anual = +mediaAnual);

Calcular diferencias
Calcula la diferencia entre la lluvia del mes y la media anual

double diferencia;
for( int i = 0; i < 12; i++) { System.out.println(formato.rightAlign (17,1,lluvia[i])); diferencia = Math.abs(lluvia[i]mediaAnual); System.out.println(formato.rightAlign (17,2,diferencia)); }

Tamao de un vector
El tamao de un vector se obtiene por medio de la constante pblica length. Los lazos anteriores pueden escribirse como: for( int i = 0; i < lluvia.length; i++) { }

Iniciacin de vectores
Otra forma de iniciar un vector al declararlo es como sigue:
String[] nombreMes = {enero,febrero,marzo,abril,mayo, junio,julio,agosto,septiembre,octub re,noviembre,diciembre};

Lluvia para meses pares e impares


Clculo de la media de lluvia en meses pares e impares
double lluvia[] = new double[12]; double sumaMesImpar = 0.0, mediaMesImpar, sumaMesPar = 0.0, mediaMesPar; for(int i=0; i<lluvia.length; i++){ lluvia[i]=(double) entrada.getFloat( "lluvia para el mes de " + nombreMes[i] + ": "); } for(int i = 0; i < lluvia.length; i+=2) sumaMesImpar += lluvia[i]; mediaMesImpar = sumaMesImpar/6; for(int i = 1; i < lluvia.length; i+=2) sumaMesPar += lluvia[i]; mediaMesPar = sumaMesPar/6;

Preguntas rpidas
1. Cules de las siguientes sentencias son vlidas? a. float numeros[13]; b. float numeros = {1.0f, 2.0f, 3.0f}; c. int numeros; numeros = new Vector[23]; d. int[] numeros = {1, 2, 3, 4}; 2. Escriba un programa que lea con un SimpleInput las componentes y calcule el producto punto de dos vectores de 2 dimensiones declarados como: float x[] = new double[2]; float y[] = new double[2];

Preguntas rpidas
3. Escriba un programa que lea los milmetros de lluvia de cada mes e imprime el nombre del mes con mayor nivel de lluvia y el nombre del mes con menor nivel de lluvia.

Criba de Eratstenes
Se van tachando los mltiplos de los primos que se van siendo encontrados hasta los mltiplos de sqrt(n) (sqrt(20)~4).
4 x 14 x 6 x 16 x 8 x 18 x 9 10 x

Mltiplos de 2
Mltiplos de 3

11 12 13 x

5 15

7 17

19 20 x

11 12 13 x

4 6 x 5 x 14 15 16 x x x

7 17

8 9 x x x 10 18 19 20 x x

Los nmeros no tachados son nmeros primos, i.e. : 2, 3, 5, 7, 11, 13, 17 y 19.

Programa en Java
//Implementa la criba de Eratstenes public class Criba{ public static void main(String []args){ boolean primo[] = new boolean[100]; int i,j; //iniciar arreglo for(i = 0; i<primo.length; i++) primo[i] = true; for (i = 2; i<Math.sqrt(100); i++){ //marca los mltiplos de i del 2o en adelante for (j = 2; i*j<(100); j++) primo[i*j]=false; } for(i = 0; i<primo.length; i++) if(primo[i]) System.out.print(i+" "); } }

Actividad
Escriba una aplicacin que calcule la desviacin estndar de N nmeros reales. La desviacin estndar se calcula con:

x x
i 1 i

N 1

Donde x es la media de los N valores.


desviacin estndar pequea

desviacin estndar grande

promedio

promedio

Algoritmo
Se utilizar un vector x de 100 elementos. 1. Leer los elementos del vector 2. Calcular el promedio 3. Calcular la desviacin estndar
4. Desplegar resultados
//Esqueleto de programa class Desviacion{ static public void main(String[] args){ //declaracin de variables //leer elementos del vector //calcular el promedio //calcular desviacin estndar //desplegar resultados } }

Primer refinamiento
Se requieren variables de tipo double para los valores (x), la suma (suma), el promedio (prom) y la desviacin estndar (des). Tambin variables de tipo int para el nmero de valores (n) y el control de los lazos (i).
class Desviacion{ static public void main(String[] args){ //declaracin de variables double x[] = new double[100], suma = 0, prom, des; int n,i; //leer elementos del vector //calcular el promedio //calcular desviacin estndar //desplegar resultados } }

Lectura de valores
Puede leerse primero el valor de n y despus en un lazo leer cada elemento de x, o bien, puede leerse con un centinela los valores de x, el centinela podra ser un valor <0. Optaremos por la segunda opcin.
import javabook.*; class Desviacion{ static public void main(String[] args){ //declaracin de variables double x[] = new double[100], suma, prom, des, v; int n,i; SimpleInput entrada = new SimpleInput(); //leer elementos del vector i = 0; do{ v = SimpleInput.getDouble(Tecle valor para x+i+:); if(v>0){x[i] = v; i++;} }while(v>0 && i<x.length); n = i; //calcular el promedio //calcular desviacin estndar //desplegar resultados } }

Calcular promedio
Calculamos mediante un lazo for.
import javabook.*; class Desviacion{ static public void main(String[] args){ //declaracin de variables double x[] = new double[100], suma, prom, des, v; int n,i; SimpleInput entrada = new SimpleInput(); //leer elementos del vector i = 0; do{ v = SimpleInput.getDouble(Tecle valor para x+i+:); if(v>0){x[i] = v; i++;} }while(v>0 && i<x.length); n = i; //calcular el promedio suma = 0; for(i = 0; i<n; i++) suma += x[i]; prom = suma/n; //calcular desviacin estndar //desplegar resultados } }

Calcular desviacin
Calculamos mediante un lazo for.
import javabook.*; class Desviacion{ static public void main(String[] args){ //declaracin de variables double x[] = new double[100], suma, prom, des; int n,i; SimpleInput entrada = new SimpleInput(); //leer elementos del vector i = 0; do{ v = SimpleInput.getDouble(Tecle valor para x+i+:); if(v>0){x[i] = v; i++;} }while(v>0 && i<x.length); n = i - 1; //calcular el promedio suma = 0; for(i = 0; i<n; i++) suma += x[i]; prom = suma/n; //calcular desviacin estndar suma =0; for(i = 0; i<n; i++) suma += (x[i]-prom)*(x[i]-prom); des = Math.sqrt(suma/(n-1)); //desplegar resultados } }

Despliegue
Desplegar con formato.
import javabook.*; class Desviacion{ static public void main(String[] args){ //declaracin de variables double x[] = new double[100], suma, prom, des; int n,i; SimpleInput entrada = new SimpleInput(); //leer elementos del vector i = 0; do{ v = SimpleInput.getDouble(Tecle valor para x+i+:); if(v>0){x[i] = v; i++;} }while(v>0 && i<x.length); n = i - 1; //calcular el promedio suma = 0; for(i = 0; i<n; i++) suma += x[i]; prom = suma/n; //calcular desviacin estndar suma =0; for(i = 0; i<n; i++) suma += (x[i]-prom)*(x[i]-prom); des = Math.sqrt(suma/(n-1)); //desplegar resultados System.out.println(total de valores ledos: +n); System.out.println(el promedio es: +Format.leftAlign(8,3,prom)); System.out.println(la desviacin es: +Format.leftAlign(8,3,des)); } }

Prueba del programa


Los siguientes datos fueron calculados con Excel
x 0 1 4.5 4.6 promedio= desviacin= 4.575 0.170782513

2
3

4.4
4.8

Actividad
Agregue cdigo al programa de ejemplo para calcular lo siguiente:

Desviacin media

1 N N

x x
i 1 i

Raz del valor cuadrtico medio Medio armnico

1 x
i 1 i

1 N

xi2
i 1

Intervalo = mx(x1, x2, x3,...,xN) mn(x1, x2, x3,...,xN) Medio geomtrico


N x1 x2 ... xN

Lectura de archivos en Java


La clase BufferedReader (lector con buffer) lee texto desde un flujo de caracteres. Debe construirse sobre un lector de flujos o de archivos.
BufferedReader in = new BufferedReader(new FileReader("foo.in")); El mtodo readLine() lee una lnea de texto. La lectura debe hacerse manejando los posibles errores que se puedan producir en un bloque try. try{ instrucciones si no hay error;

}
catch (Excepcin x){ instrucciones si hay error; }

Ejemplo
import java.io.*; public class Ejemplo1TextIO { public static void main(String args[]) { // Vamos a leer el archivo prueba.txt // input es el objeto para leer desde el archivo BufferedReader entrada = null; try { FileReader arch = new FileReader("prueba.txt"); // Abre el archivo. entrada = new BufferedReader(arch); // Ata 'input' a este archivo. } catch(FileNotFoundException x) { // El archivo puede no existir System.err.println("Archivo no encontrado: prueba.txt"); System.exit(2);// Termina el programa con cdigo 2 } // Ahora lee el archivo y despliega cada lnea try { String linea; while( (linea = entrada.readLine()) != null ) { System.out.println(linea); } } catch(IOException x) { x.printStackTrace();//Esto se ejecuta si hay error al leer } } }

Lectura de nmeros enteros


import java.io.*; public class Ejemplo2TextIO { public static void main(String args[]) { // Vamos a leer el archivo numeros.txt BufferedReader entrada = null; try { FileReader arch = new FileReader("numeros.txt"); // Abre el archivo. entrada = new BufferedReader(arch); // Ata 'input' a este archivo. } catch(FileNotFoundException x) { // El archivo puede no existir. System.err.println("Archivo no encontrado: numeros.txt"); System.exit(2);// Termina el programa con cdigo 2 } int n,suma = 0; // Ahora lee el archivo y despliega el total try { String linea; while( (linea = entrada.readLine()) != null ) { n = Integer.parseInt(linea); suma += n; } System.out.println("la suma es: "+suma); } catch(IOException x) { x.printStackTrace();//Esto se ejecuta si hay error al leer } } }

Lectura de nmeros reales


import java.io.*; public class Ejemplo3TextIO { public static void main(String args[]) { // Vamos a leer el archivo numeros.txt BufferedReader entrada = null; try { FileReader arch = new FileReader("numeros.txt"); // Abre el archivo. entrada = new BufferedReader(arch); // Ata 'input' a este archivo. } catch(FileNotFoundException x) { // El archivo puede no existir. System.err.println("Archivo no encontrado: numeros.txt"); System.exit(2);// Termina el programa con cdigo 2 } int n = 0; double d[] = new double[100]; // Ahora lee el archivo y despliega cada valor try { String linea; while( (linea = entrada.readLine()) != null ) { d[n++] = Double.parseDouble(linea); } for(int i = 0; i<n; i++) System.out.println("d["+i+"]="+d[i]); } catch(IOException x) { x.printStackTrace();//Esto se ejecuta si hay error al leer } } }

Actividad
Haga un programa que lea una lista de nombres y los muestre ordenados en la pantalla.

Algoritmo
1. Leer los nombres desde un archivo y almacenarlos en un vector. 2. Ordenar los nombres alfabticamente 3. Desplegar los nombres ordenados

Lectura de datos
import java.io.*; public class Ejemplo4TextIO { public static void main(String args[]) { // Vamos a leer el archivo nombres.txt BufferedReader entrada = null; try { FileReader arch = new FileReader("nombres.txt"); // Abre el archivo. entrada = new BufferedReader(arch); // Ata 'input' a este archivo. } catch(FileNotFoundException x) { // El archivo puede no existir. System.err.println("Archivo no encontrado: nombres.txt"); System.exit(2);// Termina el programa con cdigo 2 } int n = 0, i, j; String d[] = new String[100]; // Ahora lee el archivo y despliega cada valor try { String linea; while( (linea = entrada.readLine()) != null ) { d[n++] = linea; } } catch(IOException x) { x.printStackTrace();//Esto se ejecuta si hay error al leer }

Mtodo de ordenacin
El mtodo consiste en comparar el primer elemento con el segundo, luego el segundo, el tercero, etc., si es necesario se intercambian los elementos. Al final de este proceso se tendr el ms pequeo al inicio.

El proceso se repite con el segundo elemento comparndolo con los dems y luego el tercero, etc.

Algoritmo en Java
for(i = 0; i<n-1; i++) for(j = i+1; j<n; j++) if(d[i]>d[j]){ intercambiar d[i] y d[j]; }

Ordenacin y despliegue
Usaremos el mtodo ms sencillo (la burbuja)
//Despliega lista desordenada System.out.println("Desordenados\n"); for(i = 0; i<n; i++) System.out.println(d[i]); System.out.println("\nOrdenados\n"); //ordena el vector for(i = 0; i<n-1; i++) for(j = i; j<n; j++) if(d[i].compareToIgnoreCase(d[j])>0){ String temp = d[i]; d[i] = d[j]; d[j] = temp; } //Despliega lista ordenada for(i = 0; i<n; i++) System.out.println(d[i]); } }
Intercambia cadenas Compara cadenas 0 iguales >0 la primera mayor <0 la primera menor

Escritura en archivos
La clase BufferedWriter (Escritor con buffer) escribe texto en un flujo de caracteres. Debe construirse sobre un escritor de flujos o de archivos.
BufferedWriter in = new BufferedWriter(new FileWriter("foo.out")); El mtodo write(s,off,len) escribe una parte de una cadena de caracteres empezando en off y con longitud len. La escritura debe hacerse manejando los posibles errores que se puedan producir en un bloque try. try{ instrucciones si no hay error; } catch (Excepcin x){ instrucciones si hay error; }

Ejemplo
import java.io.*; public class Ejemplo5TextIO { public static void main(String args[]) { // Vamos a escribir el archivo salida.txt BufferedWriter salida = null; try { FileWriter arch = new FileWriter("salida.txt"); // Crea el archivo. salida = new BufferedWriter(arch); // Ata 'salida' a este archivo. } catch(IOException x) { // El archivo puede no ser creado. System.err.println("Archivo no se creo: salida.txt"); System.exit(2);// Termina el programa con cdigo 2 } int i; String d[] = {"hola","que","tal"}; // Ahora escribe el archivo try { for(i=0; i< d.length; i++ ) { salida.write(d[i],0,d[i].length());//Escribe cadena salida.newLine(); //Escribe nueva lnea } salida.close();//Es necesario cerrar el archivo } catch(IOException x) { x.printStackTrace();//Esto se ejecuta si hay error al escribir } } }

Escritura de nmeros
import java.io.*; public class Ejemplo6TextIO { public static void main(String args[]) { // Vamos a escribir el archivo salidanum.txt BufferedWriter salida = null; try { FileWriter arch = new FileWriter("salidanum.txt"); // Crea el archivo. salida = new BufferedWriter(arch); // Ata 'salida' a este archivo. } catch(IOException x) { // El archivo puede no ser creado. System.err.println("Archivo no se creo: salidanum.txt"); System.exit(2);// Termina el programa con cdigo 2 } int i; double a; // Ahora escribe el archivo try { for(i=0; i< 20; i++ ) { a = i*i; String s = ""+i+" "+a; salida.write(s,0,s.length());//Escribe cadena salida.newLine(); //Escribe nueva lnea } salida.close();//Es necesario cerrar el archivo } catch(IOException x) { x.printStackTrace();//Esto se ejecuta si hay error al escribir } } }

También podría gustarte