Curso de Computación. Manipular una colección de datos usando vectores Declarar y utilizar un...

Post on 02-Apr-2015

107 views 0 download

Transcript of Curso de Computación. Manipular una colección de datos usando vectores Declarar y utilizar un...

Curso de Computación

Manipular una colección de datos usando vectores

Declarar y utilizar un vector de tipos de datos primitivos en la implementación de un programa

Inicializar vectores mediante lazos y en la declaración

Utilizar lazos para realzar operaciones con vectores.

Ordenar un vector Leer datos desde un archivo y almacenarlos en

un vector

Un vector es una colección del mismo tipo de datos.

Declaración de un vector:

Tipo[] identificador;

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

lluvia[0] 0.0

lluvia[1] 0.0

lluvia[2] 0.0

lluvia[3] 0.0

lluvia[4] 0.0

lluvia[5] 0.0

lluvia[6] 0.0

lluvia[7] 0.0

lluvia[8] 0.0

lluvia[9] 0.0

lluvia[10] 0.0

lluvia[11] 0.0

Los elementos de un vector se acceden mediante un subíndice.

lluvia[2] o lluvia[i+1]

El índice de la primera posición de un vector es siempre 0.

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);

Leer 12 valores de lluvia mensual y calcular el promedio

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));}

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

El tamaño de un vector se obtiene por medio de la constante pública length.

Los lazos anteriores pueden escribirse como:

for( int i = 0; i < lluvia.length; i++) {

}

Otra forma de iniciar un vector al declararlo es como sigue:

String[] nombreMes = {“enero”,”febrero”,”marzo”,”abril”,”mayo”,”junio”,”julio”,”agosto”,”septiembre”,”octubre”,”noviembre”,”diciembre”};

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;

Cálculo de la media de lluvia en meses pares e impares

1. ¿Cuáles de las siguientes sentencias son válidas?

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];

3. Escriba un programa que lea los milímetros 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.

1 2 3 4 5 6 7 8 9 10

11 12 13 14 15 16 17 18 19 20

Se van tachando los múltiplos de los primos que se van siendo encontrados hasta los múltiplos de sqrt(n) (sqrt(20)~4).

Múltiplos de 2x x x x

x x x x x

1 2 3 4 5 6 7 8 9 10

11 12 13 14 15 16 17 18 19 20

x x x xx x x x xMúltiplos de 3

xx

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

//Implementa la criba de Eratóstenespublic class Criba{

public static void main(String []args){boolean primo[] = new boolean[100];int i,j;//iniciar arreglofor(i = 0; i<primo.length; i++)

primo[i] = true;for (i = 2; i<Math.sqrt(100); i++){

//marca los múltiplos de i del 2o en adelantefor (j = 2; i*j<(100); j++)

primo[i*j]=false;}for(i = 0; i<primo.length; i++)

if(primo[i])System.out.print(i+" ");

}}

1

1

2

N

xxs

N

ii

Escriba una aplicación que calcule la desviación estándar de N números reales. La desviación estándar se calcula con:

Donde x es la media de los N valores.

promediopromedio

desviación estándar pequeña

desviación estándar grande

Se utilizará un vector x de 100 elementos.

1. Leer los elementos del vector

2. Calcular el promedio

3. Calcular la desviación estándar

4. Desplegar resultados

//Esqueleto de programaclass Desviacion{ static public void main(String[] args){ //declaración de variables //leer elementos del vector //calcular el promedio //calcular desviación estándar //desplegar resultados }}

class Desviacion{ static public void main(String[] args){ //declaración de variables double x[] = new double[100], suma = 0, prom, des; int n,i; //leer elementos del vector //calcular el promedio //calcular desviación estándar //desplegar resultados }}

Se requieren variables de tipo double para los valores (x), la suma (suma), el promedio (prom) y la desviación estándar (des). También variables de tipo int para el número de valores (n) y el control de los lazos (i).

Puede leerse primero el valor de n y después en un lazo leer cada elemento de x, o bien, puede leerse con un centinela los valores de x, el centinela podría ser un valor <0. Optaremos por la segunda opción.

import javabook.*;class Desviacion{ static public void main(String[] args){ //declaración 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 desviación estándar //desplegar resultados }}

Calculamos mediante un lazo for.

import javabook.*;class Desviacion{ static public void main(String[] args){ //declaración 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 desviación estándar //desplegar resultados }}

Calculamos mediante un lazo for.import javabook.*;class Desviacion{ static public void main(String[] args){ //declaración 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 desviación estándar suma =0; for(i = 0; i<n; i++) suma += (x[i]-prom)*(x[i]-prom); des = Math.sqrt(suma/(n-1)); //desplegar resultados }}

Desplegar con formato.

import javabook.*;class Desviacion{ static public void main(String[] args){ //declaración 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 desviación estándar 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 leídos: “+n); System.out.println(“el promedio es: “+Format.leftAlign(8,3,prom)); System.out.println(“la desviación es: “+Format.leftAlign(8,3,des)); }}

  x    

0 4.5 promedio= 4.575

1 4.6 desviación= 0.170782513

2 4.4    

3 4.8    

Los siguientes datos fueron calculados con Excel

Agregue código al programa de ejemplo para calcular lo siguiente:

Desviación media

Raíz del valor cuadrático medio

Medio armónico

Intervalo = máx(x1, x2, x3,...,xN) – mín(x1, x2, x3,...,xN)

Medio geométrico

N

ii xx

N 1

1

N

iix

N 1

21

N

iixN

1

1

NNxxx ...21

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 método readLine() lee una línea 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 (Excepción x){

instrucciones si hay error;

}

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 código 2 } // Ahora lee el archivo y despliega cada línea 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 } }}

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 código 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 } }}

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 código 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 } }}

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 alfabéticamente

3. Desplegar los nombres ordenados

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 código 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 }

El método 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 más pequeño al inicio.

El proceso se repite con el segundo elemento comparándolo con los demás y luego el tercero, etc.

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

}

Usaremos el método más 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]); }}

Compara cadenas 0 – iguales>0 – la primera mayor<0 – la primera menor

Intercambia cadenas

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 método 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 (Excepción x){

instrucciones si hay error;

}

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 código 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 línea } salida.close();//Es necesario cerrar el archivo } catch(IOException x) { x.printStackTrace();//Esto se ejecuta si hay error al escribir } }}

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 código 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 línea } salida.close();//Es necesario cerrar el archivo } catch(IOException x) { x.printStackTrace();//Esto se ejecuta si hay error al escribir } }}