Escuela de Ingeniera Industrial Pontificia Universidad Catlica de Valparaso, Chile fguidi@ucv.cl Act. 2012.08.01 01-08-12 Franco Guidi Polanco 2 Contenido ! Generalidades de Java ! Elementos de una aplicacin simple ! Una aplicacin simple interactiva ! Ingreso de datos por parmetros ! Consideraciones sobre tipos primitivos numricos ! Uso de arreglos unidimensionales y multidimensionales Hola mundo en Java 01-08-12 Franco Guidi Polanco 3 public class Saluda{ public static void main (String[] arg) { System.out.println( "Hola mundo!" ); } } Otro ejemplo sencillo 01-08-12 Franco Guidi Polanco 4 public class Factorial { public static void main( String arg[] ) { int nmero, i=1, fact=1; nmero = 3; while( i <= nmero ) { fact = fact * i; i++; } System.out.println( "El factorial de " + nmero + " es " + fact ); } } Desafo preliminar ! Escribir un programa en Java que muestre la suma de los nmeros enteros contenidos entre 20 y 30, con ambos lmites incluidos. 01-08-12 Franco Guidi Polanco 5 Un tercer ejemplo 01-08-12 Franco Guidi Polanco 6 import java.io.* ; public class Decisin{ public static void main(String arg[]) throws IOException { int nmero, i=1, fact=1; BufferedReader lector = new BufferedReader( new InputStreamReader(System.in )); String ingresado; System.out.println( "Ingrese nmero: " ); ingresado = lector.readLine( ); nmero = Integer.parseInt( ingresado ); if( nmero >= 4){ System.out.println( "Me gusta este nmero" ); System.out.println( "Es mayor o igual a cuatro"); }else{ System.out.println( "Odio el valor" + nmero ); System.out.println( "Es menor que cuatro ); } } Finalemente, un cuarto ejemplo 01-08-12 Franco Guidi Polanco 7 import java.io.* ; public class Factorial2 { public static void main(String arg[]) throws IOException { int nmero, i=1, fact=1; BufferedReader lector = new BufferedReader( new InputStreamReader(System.in )); String ingresado; System.out.println( "Ingrese nmero: " ); ingresado = lector.readLine( ); nmero = Integer.parseInt( ingresado ); while( i <= nmero ) { fact = fact * i; i++; } System.out.println( "El factorial de " + nmero + " es " + fact ); } } Otros desafos ! Escribir un programa que reciba cinco puntajes. Si la suma de los puntajes es superior a 70 puntos, el programa deber mostrar la palabra GAN, en caso contrario, la palabra PERDI. ! Escribir un programa que reciba un nmero, y que muestre la secuencia de nmeros enteros positivos desde el cero hasta el nmero ingresado. 01-08-12 Franco Guidi Polanco 8 Seccin 1 Generalidades de Java 01-08-12 Franco Guidi Polanco 10 Qu es JAVA? ! Java es: " un lenguaje de programacin orientado a objetos; y " una plataforma de ejecucin para programas escritos en lenguaje Java ! Java fue desarrollado por un equipo de investigadores de SUN Microsystems. 01-08-12 Franco Guidi Polanco 11 Para qu sirve JAVA? ! Java permite: " Construir aplicaciones: programas computacionales que apoyan el trabajo o resuelven problemas especficos de usuarios (funcionan stand-alone). " Construir applets: programas de menor envergadura que se ejecutan al momento de cargar una pgina WEB (son ejecutados por un browser). http://java.sun.com/applets/jdk/1.4/demo/applets/DrawTest/example1.html Ejemplo de applet: 01-08-12 Franco Guidi Polanco 12 Desarrollo y ejecucin de aplicaciones en otros lenguajes Compilador para Windows Compilador para Linux Compilador para Solaris Cdigo fuente 111000 1 1110001000111111111 00011101111011010 0000110101100 00111 00011100010001000 0001110 11100000101100 00111 00000101000 0001111110111111010 Program Hola; begin i :=1; writeln( i ) end. Cdigo objeto 01-08-12 Franco Guidi Polanco 13 public class Hola { public static ... i=1; System.out.. } } 1111000011 110000 0000111100 001111 Bytecode Compilador Java Windows Compilador Java Linux Compilador Java Solaris Intrprete Java Windows Intrprete Java Linux Intrprete Java Solaris Cdigo fuente 111000 1 1110001000111111111 00011101111011010 0000110101100 00111 00011100010001000 0001110 11100000101100 00111 00000101000 0001111110111111010 Desarrollo y ejecucin de aplicaciones en JAVA 01-08-12 Franco Guidi Polanco 14 Intrprete Java: Java Virtual Machine (JVM) JVM Windows 101001010 001001001 101011 1 11 1 0 JVM Linux 001010 1011 1 011 1 JVM Solaris 111111 1101 1001 1 Bytecode 01-08-12 Franco Guidi Polanco 15 Componentes de Java ! Java se compone de: " Compilador (Java-compiler) " Intrprete (Java) " Biblioteca de clases (Java API o Application Programmer Interface) " Utilitarios de desarrollo (para debug, documentacin, etc.) ! Lo anterior se encuentra en el SDK (Software Development Kit) distribuido por SUN- Microsystems (ahora Oracle) 01-08-12 Franco Guidi Polanco 16 Java en distintos tamaos J2EE: Java 2 Enterprise Edition J2SE: Java 2 Standard Edition J2ME: Java 2 Micro Edition Seccin 2 Elementos de una aplicacin simple en Java 01-08-12 Franco Guidi Polanco 18 Cmo es una aplicacin en Java? ! El programa Hola Mundo: public class Saluda{ public static void main (String[] arg) { System.out.println( hello world ); } }
c:\>java Saluda hello world
c:\> Cdigo fuente
c:\>javac Saluda.java
c:\> Compilacin Ejecucin 01-08-12 Franco Guidi Polanco 19 Desarrollo y ejecucin e aplicacin en Java JVM Windows 101001010 001001001 101011 1 11 1 0 JVM Linux 001010 1011 1 011 1 JVM Solaris 111111 1101 1001 1 Bytecode hello world public class Saluda{ public static void main (String[] arg) { System.out.println( hello world ); } } Compilador Java Cdigo fuente Saluda.java Saluda.class hello world hello world 01-08-12 Franco Guidi Polanco 20 Tipos de datos en Java ! Los tipos de datos utilizados por programas en Java se clasifican en dos categoras: " Primitivos: sirven para definir variables que guardan valores numricos, lgicos y caracteres unitarios. " Clases e interfaces: sirven para definir variables que almacenan tipos de datos estructurados y las funciones asociadas. 01-08-12 Franco Guidi Polanco 21 Tipos de datos primitivos ! Java soporta los siguientes tipos de datos primitivos: " Entero " Punto flotante " Lgico " Caracter 01-08-12 Franco Guidi Polanco 22 Tipos de datos primitivos (cont.) Tipo Almacena Rango byte Entero de 8 bit -128 hasta 127 short Entero de 16 bit -32.768 hasta 32.767 int Entero de 32 bit -2.147.483.648 hasta 2.147.483.647 long Entero de 64 bit -9.223.372.036.854.755.808 hasta 9.223.372.036.854.755.807 ! Familia de datos enteros: byte, short, int y long. 01-08-12 Franco Guidi Polanco 23 Tipos de datos primitivos (cont.) Tipo Almacena Rango float Punto flotante 32 bit 7 dgitos significativos (10 -46 , 10 38 ) double Punto flotante 64 bit 15 dgitos significativos (10 -324 , 10 308 ) ! Familia de datos punto flotante: float y double. 01-08-12 Franco Guidi Polanco 24 Tipos de datos primitivos (cont.) ! Tipo caracter: char. Tipo Almacena Rango char Carcter Unicode ! Tipo lgico: boolean. Tipo Almacena Rango boolean Lgico false y true 01-08-12 Franco Guidi Polanco 25 Tipo de dato String ! El String es un tipo de dato que permite trabajar con cadenas de caracteres, por ejemplo: Hola mundo, Mario Mora, 12/10/99, A, .
! Es una clase, no un tipo primitivo, pero se utiliza en forma muy similar a estos ltimos.
01-08-12 Franco Guidi Polanco 26 Operadores bsicos para tipos primitivos ! Operador de asignacin: =
! Operadores numricos: " Binarios: + (suma), - (resta), * (multiplicacin), / (divisin), % (mdulo o resto de la divisin entera) " Unarios: ++ (autoincremento), -- (autodecremento) 01-08-12 Franco Guidi Polanco 27 Operadores bsicos para tipos primitivos (cont.) ! Operadores relacionales: == (igual a) != (distinto de) < (menor que), <= (menor o igual que), > (mayor que), >= (mayor o igual que).
! Operadores lgicos: && (AND) || (OR) ! (NOT)
01-08-12 Franco Guidi Polanco 28 Estructuras de control ! Decisin " Simple:
" Hacer - mientras: do instruccin while ( condicin )
do { instruccin 1 instruccin 2 ... } while ( condicin ) 01-08-12 Franco Guidi Polanco 30 Identificadores ! JAVA es sensible a maysculas y minsculas. Es decir, JAVA considera distinto Nombre y nombre
! Un identificador vlido consiste en una combinacin de de letras, dgitos y el carcter underscore. No puede comenzar por un dgito. Ejemplo: - Vlidos: edad, nota_Alumno, _peso, estadoSalud - No vlidos: 1ero, km/hora, Alumno(s), peso total 01-08-12 Franco Guidi Polanco 31 Declaracin de variables ! Una variable se declara segn el formato: tipo identificador [=valor] [, identificador [ = valor ] ] Por ejemplo: int a, b, c double peso = 7.05 char letra = T byte edad = 20, veces = 3
! Convencin: el identificador de una variable comenzar en minsculas. Por ejemplo: edad, edadAlumno, estadoCivil, esElUltimo
01-08-12 Franco Guidi Polanco 32 Algunos mtodos (funciones) de utilidad ! Despliegue de datos: System.out.print() : escribe. System.out.println() : escribe y cambia de lnea.
Por ejemplo: System.out.println( Hola ) System.out.println( Hola + nombre ) 01-08-12 Franco Guidi Polanco 33 Algunos mtodos (funciones) de utilidad (cont.) ! Convertir de String a nmero : Byte.parseByte() Short.parseShort() Integer.parseInt() Float.parseFloat() Double.parseDouble()
Por ejemplo: x = Integer.parseInt( 50 ) y = Integer.parseInt( dato ) + 40 01-08-12 Franco Guidi Polanco 34 Comentarios y documentacin ! Se pueden incluir comentarios en el cdigo usando los siguientes marcadores: // comentario hasta fin de lnea /* comentario de mltiples lneas */ /** comentario de documentacin @author @exception @see @param @return @version */ 01-08-12 Franco Guidi Polanco 35 Estructura de una aplicacin simple /** Ejemplo de una aplicacin */ public class IdentificadorClase { public static void main (String[ ] idArreglo ) {
...
} // Fin mtodo main } // Fin clase Definicin de la aplicacin (clase) Mtodo main 01-08-12 Franco Guidi Polanco 36 /** Programa ejemplo para clculo del Factorial de un nmero especfico. @author Franco Guidi */ public class Factorial1 {
public static void main( String arg[] ) {
int nmero, i=1, fact=1; nmero = 3; while( i <= nmero ) { fact = fact * i; i++; } System.out.println( "El factorial de " + nmero + " es " + fact );
} // Fin mtodo main
} // Fin clase Ejemplo: programa no interactivo Identificadores de variables Identificador de la clase (programa) Mtodo main 01-08-12 Franco Guidi Polanco 37 Estructura de la aplicacin /** Programa ejemplo para clculo del Factorial de un nmero especfico. @author Franco Guidi */
public class Factorial1 {
public static void main( String arg[] ) {
int nmero, i=1, fact=1; nmero = 3; while( i <= nmero ) { fact = fact * i; i++; } System.out.println( "El factorial de " + nmero + " es " + fact );
} // Fin mtodo main
} // Fin clase Clase Mtodo main 01-08-12 Franco Guidi Polanco 38 Valores literales ! Son valores que aparecen explcitamente en el cdigo fuente. Por ejemplo: S : tipo char S, Juan, 100 : tipo String 150 : tipo int 150.0 : tipo double 150.0f : tipo float 0150: tipo int octal 0x150: tipo int hexadecimal 01-08-12 Franco Guidi Polanco 39 Valores literales /** Programa ejemplo para clculo del Factorial de un nmero especfico. @author Franco Guidi */ public class Factorial1 {
public static void main( String arg[] ) {
int nmero, i=1, fact=1; nmero = 3; while( i <= nmero ) { fact = fact * i; i++; } System.out.println( "El factorial de " + nmero + " es " + fact );
} // Fin mtodo main
} // Fin clase literal literal literal literal literal 01-08-12 Franco Guidi Polanco 40 Caractersticas generales de una aplicacin simple ! Se estructura como una clase que tiene un mtodo main. ! El nombre de la clase debe ser el mismo que el del archivo que la contiene. ! La aplicacin se compila invocando al compilador Java junto con el nombre del archivo. Ejemplo:
c:\tmp>javac Factorial1.java
Compilador Archivo 01-08-12 Franco Guidi Polanco 41 Caractersticas generales de una aplicacin simple ! El programa puede ser invocado desde la lnea de comandos, invocando al intrprete Java junto con el nombre de la aplicacin. Ejemplo:
c:\tmp>java Factorial1
Intrprete Programa Seccin 3 Ingreso de datos por parmetro 01-08-12 Franco Guidi Polanco 43 Traspaso de datos por parmetro ! El mtodo main puede recibir parmetros desde la lnea de comandos del intrprete. Estos se almacenan en las posiciones del arreglo de String indicado en la declaracin del mtodo.
c:\tmp>java Factorial2 3
Parmetro 01-08-12 Franco Guidi Polanco 44 Traspaso de datos por parmetro ! Un arreglo es una coleccin de datos de un mismo tipo, referenciada por un nombre. Cada dato ocupa una posicin dentro de la coleccin. La cantidad total de posiciones es fija, y son accesibles por medio de un subndice, que se inicia en cero (0). ! Ejemplo: un arreglo de Strings llamado textos, de largo 4: hola 23 luis 2rwr textos 0 1 2 3 textos[0] contiene hola textos[1] contiene 23 textos[4] se encuentra indefinido (error al tratar de acceder) 01-08-12 Franco Guidi Polanco 45 Ejemplo: programa que acepta datos por parmetro /** Programa ejemplo para clculo del Factorial de un nmero especfico, acepta el nmero proporcionado por parmetro. @author Franco Guidi */ public class Factorial2 {
public static void main( String arg[] ) {
int nmero, i=1, fact=1; nmero = Integer.parseInt( arg[0] ); while( i <= nmero ) { fact = fact * i; i++; } System.out.println( "El factorial de " + nmero + " es " + fact );
} // Fin mtodo main
} // Fin clase 01-08-12 Franco Guidi Polanco 46 Consideraciones importantes ! Java requiere la declaracin de variables antes de que sean utilizadas. El tipo de una variable no puede ser modificado. Se dice que es un lenguaje fuertemente tipificado. ! Java distingue entre maysculas y minsculas. ! Las expresiones matemticas se evalan con precedencia de * y / sobre + y -. 01-08-12 Franco Guidi Polanco 47 Caractersticas generales de una aplicacin simple (cont.) ! Las instrucciones se organizan de acuerdo con las estructuras de control: " secuencia " decisin : if( cond ) ... else ... " Iteracin: do ... while( cond ) o while( cond ) ... ! Las instrucciones se separan mediante un punto y coma ( ; ). ! Los bloques son instrucciones agrupadas mediante parntesis de llave ( { y } ). Se utilizan en decisiones e iteraciones, y no llevan punto y coma al final (despus de la llave de cierre). 01-08-12 Franco Guidi Polanco 48 Recomendaciones generales ! Documentar los programas. ! Adoptar convencin para definicin de identificadores: " Variables: primeraLetraEnMinscula " Clases: PrimeraLetraEnMayscula " Mtodos: primeraLetraEnMinscula Seccin 4 Aplicaciones interactivas (interfaz de consola) 01-08-12 Franco Guidi Polanco 50 Una aplicacin interactiva /** Programa ejemplo para clculo del Factorial de un nmero especfico, solicita datos en forma interactiva. @author Franco Guidi */ import java.io.* ; public class Factorial3 { public static void main( String arg[ ] ) throws lOException { int nmero, i=1, fact=1; BufferedReader lector = new BufferedReader( new lnputStreamReader( System.in ) ); String ingresado; System.out.println( "lngrese nmero para clculo de factorial: " ); ingresado = lector.readLine( ); nmero = lnteger.parselnt( ingresado ); while( i <= nmero ) { fact = fact * i; i++; } System.out.println( "El factorial de " + nmero + " es " + fact ); } // Fin mtodo main } // Fin clase 01-08-12 Franco Guidi Polanco 51 Una aplicacin interactiva /** Programa ejemplo para clculo del Factorial de un nmero especfico, solicita datos en forma interactiva. @author Franco Guidi */ import java.io.* ; public class Factorial3 { public static void main( String arg[ ] ) throws lOException { int nmero, i=1, fact=1; BufferedReader lector = new BufferedReader( new lnputStreamReader( System.in ) ); String ingresado; System.out.println( "lngrese nmero para clculo de factorial: " ); ingresado = lector.readLine( ); nmero = lnteger.parselnt( ingresado ); while( i <= nmero ) { fact = fact * i; i++; } System.out.println( "El factorial de " + nmero + " es " + fact ); } // Fin mtodo main } // Fin clase El objeto lector se encarga de leer datos del usuario. Para leer invoca el mtodo readLine( ) . Permite crear el objeto de la clase BufferedReader identificado como con el nombre lector, que se encargar de leer. lndica a Java dnde encontrar las clases requeridas Debe explicitarse qu se har con eventuales errores de l/O 01-08-12 Franco Guidi Polanco 52 Importacin de clases desde las Java API class Factorial3
class String class System class Math class Double class Float class Short class Integer class Long class Byte . . . package java.lang class BufferedReader class InputStreamReader class IOException . . . package java.io Java API import java.io.* Clases de java.lang se importan automtica- mente Otras clases deben importarse explcitamente, indicando el nombre del package que las contiene package . . . 01-08-12 Franco Guidi Polanco 53 Componentes de la Java API ! Algunos de los packages de la Java API son: " java.applet : construccin de applets. " Java.beans : desarrollo y reutilizacin de componentes. " java.awt : componentes visuales. " java.io : entrada y salida de datos. " java.lang : clases de uso comn. " java.math : soporte para tipos numricos con SQL. " java.net : componentes para trabajos en red. " java.rmi : invocacin remota de mtodos. " java.sql : soporte para JDBC. " java.security : firma de applets y codificacin de datos. " java.text : manejo de distintos tipos de textos . " java.util : clases varias de utilidad. (Remitirse a documentacin del JDK para una descripcin detallada) 01-08-12 Franco Guidi Polanco 54 Instanciacin del objeto lector clases del package java.io aplicacin
new objeto lector
datos del usuario
Se crea una instancia de clase BufferedReader InputStreamReader 01-08-12 Franco Guidi Polanco 55 Uso del objeto lector . . . String dato; int base, expo; BufferedReader usuario = new BufferedReader ( new InputStreamReader( System.in ) ); . . . System.out.println( Ingrese base : ); dato = usuario.readLine( ) ; base = Integer.parseInt( dato ); System.out.println( Ingrese exponente : ); dato = usuario.readLine( ) ; expo = Integer.parseInt( dato ); . . . ! Puede utilizarse las veces que sea necesario: 01-08-12 Franco Guidi Polanco 56 Vocabulario mnimo ! En la aplicacin interactiva se observan las siguientes instrucciones: . . . int nmero; String ingresado; . . . nmero = Integer.parseInt( ingresado ); . . . . . . String ingresado; BufferedReader lector = new BufferedReader ( new InputStreamReader( System.in ) ); . . . ingresado = lector.readLine( ) ; . . . 01-08-12 Franco Guidi Polanco 57 Vocabulario mnimo (cont.) Clase Integer Mtodo de la clase Integer (los mtodos llevan parntesis al final) nmero = Integer.parseInt( ingresado ); Argumento o parmetro actual El mtodo parseInt de la clase Integer retorna el equivalente a int de un String recicibido como parmetro. Este valor es asignado a la variable nmero. 01-08-12 Franco Guidi Polanco 58 Vocabulario mnimo (cont.) ingresado = lector.readLine( ) ; Objeto de la clase BufferedReader, tambin llamado instancia de la clase BufferedReader Mtodo del objeto lector (este mtodo no recibe parmetros, pero de todas formas lleva parntesis) El mtodo readLine() del objeto lector retorna un String ingresado por el usuario. Este valor es asignado a la variable ingresado. 01-08-12 Franco Guidi Polanco 59 Nota... . . . int base, expo; BufferedReader usuario = new BufferedReader ( new InputStreamReader( System.in ) ); . . . System.out.println( Ingrese base : ); base = Integer.parseInt( usuario.readLine( ) ); System.out.println( Ingrese exponente : ); expo = Integer.parseInt( usuario.readLine( ) ); . . . ! El valor retornado por un mtodo puede usarse como parmetro actual de otro mtodo: usuario.readLine() retorna un String que es recibido como parmetro por el mtodo parseInt de la clase Integer 01-08-12 Franco Guidi Polanco 60 Aplicacin interactiva: resumen Se requiere: ! La importacin de clases del package java.io. ! La indicacin del sistema de control de excepciones. ! La instanciacin de un objeto de la clase BufferedReader. ! La invocacin del mtodo readLine() del objeto de la clase BufferedReader. import java.io.* ; BufferedReader x = new BufferedReader ( new lnputStreamReader( System.in ) ); public static void main (String[ ] arg) throws lOException { ... nombre = x.readLine() ; 01-08-12 Franco Guidi Polanco 61 Uso de clases y objetos: resumen de lo utilizado ! Las clases nos permiten realizar determinadas tareas. ! Las clases se encuentran disponibles en packages, que deben ser importados a los programas. ! Normalmente se deben crear instancias de clase (u objetos), para poder usar los mtodos que estas proveen. ! Existen, sin embargo, clases cuyos mtodos pueden utilizarse sin haber instanciado objetos. Seccin 5 Consideraciones sobre tipos primitivos numricos 01-08-12 Franco Guidi Polanco 63 Tipos de variables y valores: regla general ! Las variables almacenan datos del mismo tipo que han sido definidas. pero... ! Bajo consideraciones especiales las variables pueden recibir datos de otros tipos: " Promocin automtica de tipos " Casting 01-08-12 Franco Guidi Polanco 64 Cambio del tipo de un valor: promocin automtica ! Promocin automtica de tipos (conversin por ensanchamiento): una variable de un tipo de dato puede recibir un valor de otro tipo si: " los dos tipos son compatibles(*), y " el tipo de destino es de mayor jerarqua que el tipo de origen (*)Tipos compatibles: los tipos numricos son compatibles entre s. 01-08-12 Franco Guidi Polanco 65 Cambio del tipo de un valor: promocin automtica int x = 4;
double y;
y = x; 4 x
y 4.0 y 4 x ! Ejemplo de promocin automtica de tipos: dato tipo int es almacenado en una variable double. 01-08-12 Franco Guidi Polanco 66 Cambio del tipo de un valor: casting ! Casting: permite convertir un valor de un tipo de mayor jerarqua a otro de menor jerarqua (funciona si y slo si el tipo de menor jerarqua puede contener al valor convertido). El casting tiene prioridad sobre los operadores +,-,* y /. Formato: var1 = (tipo de var1) var2 double j=1.0; int i; i = (int) j; casting int j=200; byte i; i = (byte) j; Incorrecto: el mximo valor que puede contener una variable byte es 127. La variable i queda con valor incorrecto. 01-08-12 Franco Guidi Polanco 67 ! Regla general: La operacin de dos nmeros de un mismo tipo, genera un resultado tambin del mismo tipo. ! Se exceptan de la regla anterior las operaciones sobre datos tipo byte o short.
Evaluacin de expresiones numricas int a=10, b=4, c; c = a + b ;
14 int a=10, b=4, c; c = a / b ;
2 int int 01-08-12 Franco Guidi Polanco 68 Evaluacin de expresiones: promocin automtica de byte y short ! La operacin de dos datos de tipo byte o short, genera como resultado un int.
byte i=2, j=3, k;
k = i + j ;
5 int Error: no puede almacenarse un int en una variable byte.
byte i=2, j=3; int k; k = i + j ;
int 5 Correcto 01-08-12 Franco Guidi Polanco 69 Evaluacin de expresiones: resultado de una operacin ! El resultado de cualquier expresin es del tipo correspondiente al del operando de mayor jerarqua, en el orden: " double " float " long " int
int i=10, k; double j=2.0;
k = i / j ;
double Error: no puede almacenarse un double en una variable int. 5.0 Automticamente es promovido a double antes de realizarse la operacin. 01-08-12 Franco Guidi Polanco 70 Ejemplos de resultados de operaciones ! Suponer variable x definida como double: x = 10 / 4; // x toma valor 2.0 double x = 10.0 / 4; // x toma valor 2.5 double x = 10.0f / 4; // x toma valor 2.5 double x = (double) 10 / 4; // x toma valor 2.5 double x = (double) (10/4); // x toma valor 2.0 double
01-08-12 Franco Guidi Polanco 71 Ejemplos de resultados de operaciones (cont.) ! Suponer variable x definida como float: x = 10 / 4; // x toma valor 2.0 float x = 10.0 / 4; // Error: x no puede almacenar valor 2.5 double x = 10.0f / 4; // x toma valor 2.5 float x = (float) 10 / 4; // x toma valor 2.5 float x = (double) (10/4); // Error: x no puede almacenar valor 2.0 double 01-08-12 Franco Guidi Polanco 72 Precisin de los clculos ! Las operaciones aritmticas con tipos enteros (byte, short, int o long), se realizan con alta precisin. ! Las operaciones aritmticas con tipos de punto flotante (float o double), se realizan con menor precisin. Ejemplos*:
(*) pruebas efectuadas con variable double) 01-08-12 Franco Guidi Polanco 73 Precisin de los clculos (cont.) ! Las operaciones aritmticas con valores float o double fallan en la evaluacin de igualdades: if( var1 == var2 ) System.out.println( Son iguales ); else System.out.println( No son iguales ); ! Solucin: determinar si la diferencia en valor absoluto de las variables es menor que un error predeterminado: if( Math.abs( var1 - var2 )< 0.0000001 ) System.out.println( Son iguales ); else System.out.println( No son iguales ); Seccin 6 Uso de arreglos con tipos primitivos 01-08-12 Franco Guidi Polanco 75 Arreglos en Java ! Los arreglos son colecciones ordenadas de datos del mismo tipo. " Ejemplos: 3 27 50 1 0 4 Arreglo de bytes: Casa 12 $#! Auto Ana Arreglo de Strings: 3.0 50.4 0.0 -4.3 Arreglo de doubles: 01-08-12 Franco Guidi Polanco 76 Identificacin y tamao de un arreglo ! Cada arreglo se reconoce por un identificador y cada dato se almacena en una posicin indexada. ! Un arreglo de largo N, tiene posiciones indexadas mediante enteros desde 0 hasta N-1. ! El mximo largo posible para un arreglo corresponde al mayor valor permitido para un int. Juan Pa Mario Pedro Ana nombres Posicin: 0 1 2 3 4 01-08-12 Franco Guidi Polanco 77 Pasos para crear un arreglo en Java 1: Definir una variable que identifique al arreglo, indicando la naturaleza de los datos que se almacenarn: tipo[ ] variable o alternativamente: tipo variable[ ]
2: Instanciar el arreglo indicando el largo que tendr, y asignarlo a la variable: variable = new tipo[ entero ] 01-08-12 Franco Guidi Polanco 78 Creacin de un arreglo
int[] edades; edades = new int[8];
Define que la variable edades referenciar un arreglo de enteros. Instancia un arreglo de enteros de 8 posiciones. Asigna el arreglo instanciado a la variable edades. 01-08-12 Franco Guidi Polanco 79 Ejemplos de creacin de arreglos byte[] valores; valores = new byte[1000]; int largo = 20; String[] nombres; nombres = new String[ largo ]; double nota[]; nota = new double[4]; ! Arreglo de byte de largo 1000: ! Arreglo de double de largo 4: ! Arreglo de String de largo 20: 01-08-12 Franco Guidi Polanco 80 Forma abreviada para crear arreglos ! La definicin de variable, instanciacin del arreglo y su asignacin a la variable puede realizarse en una sola instruccin: tipo[ ] variable = new tipo[ entero ] double[] nota = new double[4]; Ejemplo: 01-08-12 Franco Guidi Polanco 81 Otra forma para instanciar arreglos ! Tambin es posible instanciar arreglos escribindolos como literales en el cdigo fuente:
int[] nota = { 23, 14, 55, 18 } ; Instancia un arreglo de enteros de largo 4. 01-08-12 Franco Guidi Polanco 82 Acceso a las posiciones de un arreglo ... int i; long[] nmeros; nmeros = new long[ 20 ]; ... i=0; while( i < 20 ){ nmeros[ i ] = i ; i++; } ... ! Se deben accesar mediante un subndice de tipo entero (byte, short, int o long): 01-08-12 Franco Guidi Polanco 83 Recorrer un arreglo ... int i; long[] nmeros; nmeros = new long[ 20 ]; ... i=0; while( i < nmeros.length ) { System.out.println( nmeros[ i ] ); i++; } ... ! Se puede utilizar la propiedad length del arreglo para controlar procesos iterativos sobre el mismo: 01-08-12 Franco Guidi Polanco 84 Error tpico en el manejo de arreglos ! Tratar de accesar una posicin inexistente del arreglo, por ejemplo, la posicin 10 de un arreglo de largo 10. Cuando lo anterior ocurre, se genera en tiempo de ejecucin una excepcin denominada: ArrayIndexOutOfBoundsException 01-08-12 Franco Guidi Polanco 85 Consideraciones respecto del largo de un arreglo ! Una vez instanciado un arreglo, no puede modificarse su largo. ! length es una propiedad o atributo del arreglo que contiene el largo del mismo.
double[] nota; nota = new double[4]; System.out.println( El largo es + nota.length );
Las propiedades o atributos se consultan sin parntesis al final, a diferencia de los mtodos. 01-08-12 Franco Guidi Polanco 86 Consideraciones respecto del arreglo de parmetros ! El arreglo de parmetros declarado al inicio del mtodo main, es instanciado por Java al momento de ejecutarse la aplicacin. ! El arreglo se instancia con un largo igual a la cantidad de parmetros traspasados en la lnea de comandos. ! El arreglo debe ser declarado como arreglo de Strings. 01-08-12 Franco Guidi Polanco 87 Resumen de arreglos ! Los arreglos se instancian. ! La instanciacin ocurre de tres formas: " cuando se utiliza el operador new. " cuando el arreglo es declarado literalmente. " cuando se ejecuta la aplicacin, en el caso particular del arreglo de parmetros del mtodo main. 01-08-12 Franco Guidi Polanco 88 Resumen de arreglos ! Los arreglos son referenciados desde una variable. ! Todas las posiciones del arreglo son del mismo tipo. ! El atributo length permite acceder al largo del arreglo. ! Tratar de acceder una posicin inexistente del arreglo genera una excepcin ArrayIndexOutOfBoundsException. 01-08-12 Franco Guidi Polanco 89 Matrices ! Un arreglo puede tener ms de una dimensin. ! Los arreglos de ms de una dimensin se denominan matrices. ! El caso ms comn es la matriz bidimensional: 12 -3 4 55 4 700 -8 0 1 0 -2 14 Matriz de dos dimensiones 01-08-12 Franco Guidi Polanco 90 Caractersticas de una matriz ! Todas las posiciones de una matriz son de un mismo tipo (al igual que el caso de los arreglos). ! La matrices se identifican por su nombre, y se caracterizan adems por sus dimensiones. ! Las dimensiones de una matriz no se pueden modificar. ! Ejemplo: 12 -3 4 55 4 700 -8 0 1 0 -2 14 Matriz mediciones de datos enteros, de dimensiones 3 x 4 mediciones 01-08-12 Franco Guidi Polanco 91 Convenciones respecto de las matrices ! En el caso de las matrices de dos dimensiones, llamaremos a la primera dimensin fila, y a la segunda, columna. ! Representaremos visualmente en nuestros ejemplos las filas hacia abajo y las columnas hacia el lado. ! La primera fila ser la fila 0 y la primera columna, la columna 0. 12 -3 4 55 4 700 -8 0 1 0 -2 14 Filas Columnas Matriz de 3 filas y 4 columnas 0 1 2 3 0
1
2 01-08-12 Franco Guidi Polanco 92 Creacin de Matrices ! Para crear matrices: tipo[ ] [ ] variable = new tipo[ entero1 ] [ entero2 ]
Por ejemplo: int[ ][ ] utilidad; utilidad = new int[10][15];
! O mediante literales: uti[1][2] contiene un 2. 01-08-12 Franco Guidi Polanco 93 Acceso a posiciones ! Las posiciones de una matriz se acceden independientemente (una a una). ! Se utiliza un subndice para especificar cada dimensin ! En una matriz de dos dimensiones, el primer subndice representa la fila, y el segundo, la columna. ! Ejemplo 12 -3 4 55 4 700 -8 0 1 0 -2 14 mediciones mediciones[0][0] contiene un 12 mediciones[0][3] contiene un 55 mediciones[2][0] contiene un 1 mediciones[2][3] contiene un 14 mediciones[1][2] contiene un 8 mediciones[2][1] contiene un 0 etc... 0
1
2 0 1 2 3 01-08-12 Franco Guidi Polanco 94 Particularidades de los arreglos multidimensionales en Java ! En rigor Java no provee arreglos multidimensionales. Java los implementa mediante arreglos de arreglos. ! Esto permite crear, por ejemplo, matrices bidimensionales con cantidades de posiciones distintas por fila:
Matrices N-dimensionales ! Se pueden crear matrices de ms de dos dimensiones. ! Ejemplo (un cubo): int[][][] dato = new int[4][10][6]; 01-08-12 Franco Guidi Polanco 96 Para conocer las dimensiones de una matriz ! Se utiliza la propiedad length. ! Ejemplo: " Si datos es una matriz bidimensional: datos.length : contiene el largo de la primera dimensin (cantidad de filas) datos[0].length : contiene el largo de la fila 0 (cantidad de columnas). 01-08-12 Franco Guidi Polanco 97