Contenido ! Generalidades de Java ! Elementos de una aplicación simple ! Una aplicación simple interactiva ! Ingreso de datos por parámetros ! Consideraciones sobre tipos primitivos numéricos ! Uso de arreglos unidimensionales y multidimensionales Introducción a la Programación en Java Franco Guidi Polanco Escuela de Ingeniería Industrial Pontificia Universidad Católica de Valparaíso, Chile fguidi@ucv.cl Act. 2012.08.01 Hola mundo… en Java 01-08-12 01-08-12 2 Otro ejemplo sencillo public class Factorial { public static void main( String arg[] ) { int número, i=1, fact=1; número = 3; while( i <= número ) { fact = fact * i; i++; } System.out.println( "El factorial de " + número + " es " + fact ); } } public class Saluda{ public static void main (String[] arg) { System.out.println( "Hola mundo!" ); } } Franco Guidi Polanco Franco Guidi Polanco 3 Franco Guidi Polanco 01-08-12 4 Desafío preliminar Un tercer ejemplo ! Escribir un programa en Java que muestre la suma de los números enteros contenidos entre 20 y 30, con ambos límites incluidos. Franco Guidi Polanco 01-08-12 import java.io.* ; public class Decisión{ public static void main(String arg[]) throws IOException { int número, i=1, fact=1; BufferedReader lector = new BufferedReader( new InputStreamReader(System.in )); String ingresado; System.out.println( "Ingrese número: " ); ingresado = lector.readLine( ); número = Integer.parseInt( ingresado ); if( número >= 4){ System.out.println( "Me gusta este número" ); System.out.println( "Es mayor o igual a cuatro"); }else{ System.out.println( "Odio el valor" + número ); System.out.println( "Es menor que cuatro” ); } } 5 Finalemente, un cuarto ejemplo 01-08-12 01-08-12 6 Otros desafíos… import java.io.* ; public class Factorial2 { public static void main(String arg[]) throws IOException { int número, i=1, fact=1; BufferedReader lector = new BufferedReader( new InputStreamReader(System.in )); String ingresado; System.out.println( "Ingrese número: " ); ingresado = lector.readLine( ); número = Integer.parseInt( ingresado ); while( i <= número ) { fact = fact * i; i++; } System.out.println( "El factorial de " + número + " es " + fact ); } } Franco Guidi Polanco Franco Guidi Polanco 7 ! 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 número, y que muestre la secuencia de números enteros positivos desde el cero hasta el número ingresado. Franco Guidi Polanco 01-08-12 8 ¿Qué es JAVA? ! Java es: " un lenguaje de programación orientado a objetos; y " una plataforma de ejecución para programas escritos en lenguaje Java Sección 1 ! Java fue desarrollado por un equipo de investigadores de SUN Microsystems. Generalidades de Java Franco Guidi Polanco 01-08-12 10 Desarrollo y ejecución de aplicaciones en otros lenguajes ¿Para qué sirve JAVA? ! Java permite: " Construir aplicaciones: programas computacionales que apoyan el trabajo o resuelven problemas específicos de usuarios (funcionan stand-alone). Program Hola; begin i :=1; writeln( i ) end. " Construir applets: programas de menor envergadura que se ejecutan al momento de cargar una página WEB (son ejecutados por un browser). Compilador para Windows 111000 1 1110001000111111111 00011101111011010 Compilador para Linux 0000110101100 00111 00011100010001000 0001110 Código fuente Ejemplo de applet: http://java.sun.com/applets/jdk/1.4/demo/applets/DrawTest/example1.html Compilador para Solaris 11100000101100 00111 00000101000 0001111110111111010 Código objeto Franco Guidi Polanco 01-08-12 11 Franco Guidi Polanco 01-08-12 12 Desarrollo y ejecución de aplicaciones en JAVA Intérprete Java: Java Virtual Machine (JVM) Intérprete Java Windows Compilador Java Windows Bytecode 101001010 001001001 111000 1 1110001000111111111 00011101111011010 public class Hola { public static ... i=1; System.out.. } } 1111000011 110000 0000111100 001111 Compilador Java Linux Bytecode Intérprete Java Linux JVM Windows 101011 1 11 1 0 0000110101100 00111 00011100010001000 0001110 Código fuente Intérprete Java Solaris Compilador Java Solaris JVM Linux JVM Solaris 001010 1011 1 011 1 111111 1101 1001 1 11100000101100 00111 00000101000 0001111110111111010 Franco Guidi Polanco 01-08-12 13 Componentes de Java Franco Guidi Polanco 01-08-12 14 Java en distintos tamaños ! Java se compone de: " Compilador (Java-compiler) " Intérprete (Java) " Biblioteca de clases (Java API o Application Programmer Interface) " Utilitarios de desarrollo (para debug, documentación, etc.) J2ME: Java 2 Micro Edition J2SE: Java 2 Standard Edition ! Lo anterior se encuentra en el SDK (Software Development Kit) distribuido por SUNMicrosystems (ahora Oracle) Franco Guidi Polanco 01-08-12 J2EE: Java 2 Enterprise Edition 15 Franco Guidi Polanco 01-08-12 16 ¿Cómo es una aplicación en Java? ! El programa Hola Mundo: Código fuente Sección 2 Compilación Elementos de una aplicación simple en Java public class Saluda{ public static void main (String[] arg) { System.out.println( “hello world” ); } } c:\>javac Saluda.java c:\> Ejecución c:\>java Saluda hello world c:\> Franco Guidi Polanco Desarrollo y ejecución e aplicación en Java public class Saluda{ public static void main (String[] arg) { System.out.println( “hello world” ); } } Código fuente ! Los tipos de datos utilizados por programas en Java se clasifican en dos categorías: Saluda.java " Primitivos: sirven para definir variables que guardan valores numéricos, lógicos y caracteres unitarios. JVM Windows 101011 1 11 1 hello 0 world Franco Guidi Polanco Saluda.class 101001010 001001001 JVM Linux world 01-08-12 " Clases e interfaces: sirven para definir variables que almacenan tipos de datos estructurados y las funciones asociadas. JVM Solaris 001010 1011 1 011 hello 1 18 Tipos de datos en Java Compilador Java Bytecode 01-08-12 111111 1101 1001 1 hello world 19 Franco Guidi Polanco 01-08-12 20 Tipos de datos primitivos Tipos de datos primitivos (cont.) ! Java soporta los siguientes tipos de datos primitivos: ! Familia de datos enteros: byte, short, int y long. " Entero " Punto flotante " Lógico " Caracter Franco Guidi Polanco 01-08-12 21 Tipos de datos primitivos (cont.) Almacena Rango float Punto flotante 32 bit 7 dígitos significativos (10-46, 1038) double Punto flotante 64 bit 15 dígitos significativos (10-324, 10308) 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 long Entero de 64 bit -2.147.483.648 hasta 2.147.483.647 -9.223.372.036.854.755.808 hasta 9.223.372.036.854.755.807 Franco Guidi Polanco 01-08-12 22 Tipos de datos primitivos (cont.) ! Familia de datos punto flotante: float y double. Tipo Tipo ! Tipo caracter: char. Tipo Almacena Rango char Carácter Unicode ! Tipo lógico: boolean. Franco Guidi Polanco 01-08-12 23 Tipo Almacena Rango boolean Lógico false y true Franco Guidi Polanco 01-08-12 24 Operadores básicos para tipos primitivos Tipo de dato String ! El String es un tipo de dato que permite trabajar con cadenas de caracteres, por ejemplo: ! Operador de asignación: = Hola mundo , Mario Mora , 12/10/99 , A , . ! Operadores numéricos: " Binarios: + (suma), - (resta), * (multiplicación), / (división), % (módulo o resto de la división entera) ! Es una clase, no un tipo primitivo, pero se utiliza en forma muy similar a estos últimos. " Unarios: ++ (autoincremento), -- (autodecremento) Franco Guidi Polanco 01-08-12 25 Operadores básicos para tipos primitivos (cont.) 01-08-12 26 Estructuras de control ! Decisión ! Operadores relacionales: == (igual a) != (distinto de) < (menor que), <= (menor o igual que), > (mayor que), >= (mayor o igual que). " Simple: " Compleja: if ( condición ) instrucción if ( condición ) { instrucción 1-1 instrucción 1-2 ... } else { instrucción 2-1 instrucción 2-2 ... if ( condición ) instrucción 1 else ! Operadores lógicos: && (AND) || (OR) ! (NOT) Franco Guidi Polanco Franco Guidi Polanco instrucción 2 } 01-08-12 27 Franco Guidi Polanco 01-08-12 28 Estructuras de control (cont.) Identificadores ! JAVA es sensible a mayúsculas y minúsculas. ! Iteración " Mientras - repetir: " Hacer - mientras: while ( condición ) instrucción do instrucción while ( condición ) while ( condición ) { instrucción 1 instrucción 2 ... } do { instrucción 1 instrucción 2 ... } while ( condición ) Franco Guidi Polanco 01-08-12 Es decir, JAVA considera distinto Nombre y nombre ! Un identificador válido consiste en una combinación de de letras, dígitos y el carácter underscore. No puede comenzar por un dígito. Ejemplo: - Válidos: edad, nota_Alumno, _peso, estadoSalud - No válidos: 1ero, km/hora, Alumno(s), peso total 29 Franco Guidi Polanco 01-08-12 30 Algunos métodos (funciones) de utilidad Declaración de variables ! Despliegue de datos: ! Una variable se declara según el formato: System.out.print() System.out.println() tipo identificador [=valor] [, identificador [ = valor ] ] Por ejemplo: int a, b, c double peso = 7.05 char letra = T byte edad = 20, veces = 3 : escribe. : escribe y cambia de línea. Por ejemplo: System.out.println( Hola ) System.out.println( Hola + nombre ) ! Convención: el identificador de una variable comenzará en minúsculas. Por ejemplo: edad, edadAlumno, estadoCivil, esElUltimo Franco Guidi Polanco 01-08-12 31 Franco Guidi Polanco 01-08-12 32 Algunos métodos (funciones) de utilidad (cont.) Comentarios y documentación ! Convertir de String a número : ! Se pueden incluir comentarios en el código usando los siguientes marcadores: Byte.parseByte() Short.parseShort() Integer.parseInt() Float.parseFloat() Double.parseDouble() // comentario hasta fin de línea /* comentario de múltiples líneas */ /** comentario de documentación @author @exception @see @param @return @version */ Por ejemplo: x = Integer.parseInt( 50 ) y = Integer.parseInt( dato ) + 40 Franco Guidi Polanco 01-08-12 33 Estructura de una aplicación simple Franco Guidi Polanco 01-08-12 34 Ejemplo: programa no interactivo Definición /** de la Ejemplo de una aplicación aplicación (clase) */ public class IdentificadorClase { public static void main (String[ ] idArreglo ) { /** Programa ejemplo para cálculo del Factorial de un número específico. @author Franco Guidi */ public class Factorial1 { Identificador public static void main( String arg[] ) {de la clase (programa) int número, i=1, fact=1; número = 3; Identificadores while( i <= número ) { Método main de variables fact = fact * i; i++; } System.out.println( "El factorial de " + número + " es " + fact ); ... } // Fin método main } // Fin clase } // Fin método main Método main } // Fin clase Franco Guidi Polanco 01-08-12 35 Franco Guidi Polanco 01-08-12 36 Estructura de la aplicación Valores literales /** Programa ejemplo para cálculo del Factorial de un número específico. Clase @author Franco Guidi */ public class Factorial1 { public static void main( String arg[] ) { int número, i=1, fact=1; número = 3; while( i <= número ) { fact = fact * i; i++; } System.out.println( "El factorial de " + número + " es " + fact ); ! Son valores que aparecen explícitamente en el código 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 } // Fin método main Método main } // Fin clase Franco Guidi Polanco 01-08-12 37 Valores literales 01-08-12 public static void main( String arg[] ) { int número, i=1, fact=1; literal número = 3; while( i <= número ) { literal fact = fact * i; literal i++; } System.out.println( "El factorial de " + número + " es " + fact ); } // Fin método main ! Se estructura como una clase que tiene un método main. ! El nombre de la clase debe ser el mismo que el del archivo que la contiene. ! La aplicación se compila invocando al compilador Java junto con el nombre del archivo. Ejemplo: c:\tmp>javac Factorial1.java literal Compilador Franco Guidi Polanco 38 Características generales de una aplicación simple /** Programa ejemplo para cálculo del Factorial de un número específico. @author Franco Guidi literal */ public class Factorial1 { } // Fin clase Franco Guidi Polanco 01-08-12 39 Franco Guidi Polanco 01-08-12 Archivo 40 Características generales de una aplicación simple ! El programa puede ser invocado desde la línea de comandos, invocando al intérprete Java junto con el nombre de la aplicación. Ejemplo: Sección 3 c:\tmp>java Factorial1 Intérprete Franco Guidi Polanco Ingreso de datos por parámetro Programa 01-08-12 41 Traspaso de datos por parámetro Traspaso de datos por parámetro ! El método main puede recibir parámetros desde la línea de comandos del intérprete. Estos se almacenan en las posiciones del arreglo de String indicado en la declaración del método. ! Un arreglo es una colección de datos de un mismo tipo, referenciada por un nombre. Cada dato ocupa una posición dentro de la colección. La cantidad total de posiciones es fija, y son accesibles por medio de un subíndice, que se inicia en cero (0). ! Ejemplo: un arreglo de Strings llamado textos, de largo 4: Parámetro textos hola c:\tmp>java Factorial2 3 0 23 luis 1 2 2rwr 3 textos[0] contiene “hola” textos[1] contiene “23” textos[4] se encuentra indefinido (error al tratar de acceder) Franco Guidi Polanco 01-08-12 43 Franco Guidi Polanco 01-08-12 44 Ejemplo: programa que acepta datos por parámetro Consideraciones importantes ! Java requiere la declaración de variables antes de que sean utilizadas. El tipo de una variable no puede ser modificado. Se dice que es un lenguaje fuertemente tipificado . /** Programa ejemplo para cálculo del Factorial de un número específico, acepta el número proporcionado por parámetro. @author Franco Guidi */ public class Factorial2 { public static void main( String arg[] ) { int número, i=1, fact=1; número = Integer.parseInt( arg[0] ); while( i <= número ) { fact = fact * i; i++; } System.out.println( "El factorial de " + número + " es " + fact ); ! Java distingue entre mayúsculas y minúsculas. ! Las expresiones matemáticas se evalúan con precedencia de * y / sobre + y -. } // Fin método main } // Fin clase Franco Guidi Polanco 01-08-12 45 Características generales de una aplicación simple (cont.) ! Las instrucciones se organizan de acuerdo con las estructuras de control: " secuencia " decisión : if( cond ) ... else ... " Iteración: do ... while( cond ) o 46 Recomendaciones generales ! Adoptar convención para definición de identificadores: while( cond ) ... " Variables: primeraLetraEnMinúscula " Clases: PrimeraLetraEnMayúscula " Métodos: primeraLetraEnMinúscula ! Los bloques son instrucciones agrupadas mediante paréntesis de llave ( { y } ). Se utilizan en decisiones e iteraciones, y no llevan punto y coma al final (después de la llave de cierre). 01-08-12 01-08-12 ! Documentar los programas. ! Las instrucciones se separan mediante un punto y coma ( ; ). Franco Guidi Polanco Franco Guidi Polanco 47 Franco Guidi Polanco 01-08-12 48 Una aplicación interactiva Sección 4 Aplicaciones interactivas (interfaz de consola) Franco Guidi Polanco Una aplicación interactiva 01-08-12 50 Importación de clases desde las Java API Java API package java.lang class Factorial3 Clases de java.lang se importan automáticamente class String class Long class System class Integer class Math class Byte class Double class Short class Float ... package java.io import java.io.* Otras clases deben importarse explícitamente, indicando el nombre del package que las contiene Franco Guidi Polanco 01-08-12 51 Franco Guidi Polanco class InputStreamReader class IOException class BufferedReader ... package . . . 01-08-12 52 Componentes de la Java API Instanciación del objeto lector ! Algunos de los packages de la Java API son: " " " " " " " " " " " " datos del usuario java.applet : construcción de applets. Java.beans : desarrollo y reutilización de componentes. java.awt : componentes visuales. java.io : entrada y salida de datos. java.lang : clases de uso común. java.math : soporte para tipos numéricos con SQL. java.net : componentes para trabajos en red. java.rmi : invocación remota de métodos. java.sql : soporte para JDBC. java.security : firma de applets y codificación de datos. java.text : manejo de distintos tipos de textos . java.util : clases varias de utilidad. Se crea una instancia de clase aplicación clases del package java.io objeto lector (Remitirse a documentación del JDK para una descripción detallada) new Franco Guidi Polanco 01-08-12 53 Uso del objeto lector Franco Guidi Polanco BufferedReader InputStreamReader 01-08-12 54 Vocabulario mínimo ! Puede utilizarse las veces que sea necesario: ! En la aplicación interactiva se observan las siguientes instrucciones: ... String dato; int base, expo; BufferedReader usuario = new BufferedReader ( new InputStreamReader( System.in ) ); ... int número; String ingresado; ... número = Integer.parseInt( ingresado ); ... System.out.println( Ingrese base : ); dato = usuario.readLine( ) ; base = Integer.parseInt( dato ); System.out.println( Ingrese exponente : ); dato = usuario.readLine( ) ; expo = Integer.parseInt( dato ); ... ... String ingresado; BufferedReader lector = new BufferedReader ( new InputStreamReader( System.in ) ); ... ingresado = lector.readLine( ) ; ... ... Franco Guidi Polanco 01-08-12 55 Franco Guidi Polanco 01-08-12 56 Vocabulario mínimo (cont.) Vocabulario mínimo (cont.) Argumento o parámetro actual ingresado = lector.readLine( ) ; número = Integer.parseInt( ingresado ); Objeto de la clase BufferedReader , también llamado instancia de la clase BufferedReader Método de la clase Integer (los métodos llevan paréntesis al final) Clase Integer El método parseInt de la clase Integer retorna el equivalente a int de un String recicibido como parámetro. Este valor es asignado a la variable número. Franco Guidi Polanco 01-08-12 El método readLine() del objeto lector retorna un String ingresado por el usuario. Este valor es asignado a la variable ingresado. 57 Nota... 01-08-12 58 Se requiere: ! La importación de clases del package java.io. ... ! La indicación del sistema de control de excepciones. int base, expo; BufferedReader usuario = new BufferedReader ( new InputStreamReader( System.in ) ); ! La instanciación de un objeto de la clase BufferedReader. ... System.out.println( Ingrese base : ); base = Integer.parseInt( usuario.readLine( ) ); System.out.println( Ingrese exponente : ); expo = Integer.parseInt( usuario.readLine( ) ); Franco Guidi Polanco Franco Guidi Polanco Aplicación interactiva: resumen ! El valor retornado por un método puede usarse como parámetro actual de otro método: ... Método del objeto lector (este método no recibe parámetros, pero de todas formas lleva paréntesis) ! La invocación del método readLine() del objeto de la clase BufferedReader. usuario.readLine() retorna un String que es recibido como parámetro por el método parseInt de la clase Integer 01-08-12 59 Franco Guidi Polanco 01-08-12 60 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 métodos que estas proveen. ! Existen, sin embargo, clases cuyos métodos pueden utilizarse sin haber instanciado objetos. Franco Guidi Polanco 01-08-12 Sección 5 Consideraciones sobre tipos primitivos numéricos 61 Cambio del tipo de un valor: promoción automática Tipos de variables y valores: regla general ! Las variables almacenan datos del mismo tipo que han sido definidas. ! Promoción automática de tipos (conversión por ensanchamiento): una variable de un tipo de dato puede recibir un valor de otro tipo si: pero... " los dos tipos son compatibles(*), y ! Bajo consideraciones especiales las variables pueden recibir datos de otros tipos: " el tipo de destino es de mayor jerarquía que el tipo de origen " Promoción automática de tipos " Casting (*)Tipos compatibles: los tipos numéricos son compatibles entre sí. Franco Guidi Polanco 01-08-12 63 Franco Guidi Polanco 01-08-12 64 Cambio del tipo de un valor: promoción automática Cambio del tipo de un valor: casting ! Casting: permite convertir un valor de un tipo de mayor jerarquía a otro de menor jerarquía (funciona si y sólo si el tipo de menor jerarquía puede contener al valor convertido). El casting tiene prioridad sobre los operadores +,-,* y /. ! Ejemplo de promoción automática de tipos: dato tipo int es almacenado en una variable double. Formato: var1 = (tipo de var1) var2 int x = 4; 4 x double y; y 4.0 y = x; 4 y Franco Guidi Polanco casting x 01-08-12 65 ! Regla general: La operación de dos números de un mismo tipo, genera un resultado también del mismo tipo. ! Se exceptúan de la regla anterior las operaciones sobre datos tipo byte o short. Franco Guidi Polanco 01-08-12 int a=10, b=4, c; c = a + b ; int a=10, b=4, c; c = a / b ; 14 2 byte i=2, j=3, k; i + j ; int byte i=2, j=3; int k; k = i + j ; 5 5 int Error: no puede almacenarse un int en una variable byte. int 01-08-12 66 ! La operación de dos datos de tipo byte o short, genera como resultado un int. k = Franco Guidi Polanco Incorrecto: el máximo valor que puede contener una variable byte es 127. La variable i queda con valor incorrecto. Evaluación de expresiones: promoción automática de byte y short Evaluación de expresiones numéricas int int j=200; byte i; i = (byte) j; double j=1.0; int i; i = (int) j; 67 Franco Guidi Polanco 01-08-12 Correcto 68 Evaluación de expresiones: resultado de una operación Ejemplos de resultados de operaciones ! El resultado de cualquier expresión es del tipo correspondiente al del operando de mayor jerarquía, en el orden: " " " " double float long int Automáticamente es promovido a double antes de realizarse la operación. Franco Guidi Polanco int i=10, k; double j=2.0; k = i / ! Suponer variable x definida como double: x x x x x double j ; // x toma valor 2.0 double // x toma valor 2.5 double // x toma valor 2.5 double // x toma valor 2.5 double // x toma valor 2.0 double Error: no puede almacenarse un double en una variable int. 01-08-12 69 Franco Guidi Polanco 01-08-12 70 Precisión de los cálculos ! Las operaciones aritméticas con tipos enteros (byte, short, int o long), se realizan con alta precisión. ! Suponer variable x definida como float: x = 10.0f / 4; x = (float) 10 / 4; x = (double) (10/4); 10 / 4; 10.0 / 4; 10.0f / 4; (double) 10 / 4; (double) (10/4); 5.0 Ejemplos de resultados de operaciones (cont.) x = 10 / 4; x = 10.0 / 4; = = = = = // x toma valor 2.0 float // Error: x no puede almacenar valor 2.5 double ! Las operaciones aritméticas con tipos de punto flotante (float o double), se realizan con menor precisión. // x toma valor 2.5 float // x toma valor 2.5 float // Error: x no puede almacenar valor 2.0 double Ejemplos*: 0.1 sumado 10 veces: 0.01 sumado 100 veces: 0.001 sumado 1000 veces: 0.9999999999999999 1.0 1.0000000000000007 (*) pruebas efectuadas con variable double) Franco Guidi Polanco 01-08-12 71 Franco Guidi Polanco 01-08-12 72 Precisión de los cálculos (cont.) ! Las operaciones aritméticas con valores float o double fallan en la evaluación de igualdades: if( var1 == var2 ) System.out.println( else System.out.println( Son iguales ); No son iguales Sección 6 ); ! Solución: determinar si la diferencia en valor absoluto de las variables es menor que un error predeterminado: Uso de arreglos con tipos primitivos if( Math.abs( var1 - var2 )< 0.0000001 ) System.out.println( Son iguales ); else System.out.println( No son iguales ); Franco Guidi Polanco 01-08-12 73 Arreglos en Java Identificación y tamaño de un arreglo ! Los arreglos son colecciones ordenadas de datos del mismo tipo. ! Cada arreglo se reconoce por un identificador y cada dato se almacena en una posición indexada. ! Un arreglo de largo N, tiene posiciones indexadas mediante enteros desde 0 hasta N-1. " Ejemplos: Arreglo de bytes: 3 27 50 1 0 4 nombres Ana Arreglo de Strings: Ana Casa Auto 12 Posición: $#! Franco Guidi Polanco 50.4 01-08-12 0.0 Juan Pedro 1 2 Pía 3 Mario 4 ! El máximo largo posible para un arreglo corresponde al mayor valor permitido para un int. Arreglo de doubles: 3.0 0 -4.3 75 Franco Guidi Polanco 01-08-12 76 Pasos para crear un arreglo en Java Creación de un arreglo 1º: Definir una variable que identifique al arreglo, indicando la naturaleza de los datos que se almacenarán: tipo[ ] variable Define que la variable edades referenciará un arreglo de enteros. o alternativamente: tipo variable[ ] int[] edades; edades = new int[8]; 2º: Instanciar el arreglo indicando el largo que tendrá, y asignarlo a la variable: variable = new tipo[ entero ] Instancia un arreglo de enteros de 8 posiciones. Asigna el arreglo instanciado a la variable edades. Franco Guidi Polanco 01-08-12 77 Ejemplos de creación de arreglos Franco Guidi Polanco 01-08-12 78 Forma abreviada para crear arreglos ! Arreglo de byte de largo 1000: ! La definición de variable, instanciación del arreglo y su asignación a la variable puede realizarse en una sola instrucción: byte[] valores; valores = new byte[1000]; tipo[ ] variable = new tipo[ entero ] ! Arreglo de double de largo 4: double nota[]; nota = new double[4]; Ejemplo: ! Arreglo de String de largo 20: double[] nota = new double[4]; int largo = 20; String[] nombres; nombres = new String[ largo ]; Franco Guidi Polanco 01-08-12 79 Franco Guidi Polanco 01-08-12 80 Otra forma para instanciar arreglos Acceso a las posiciones de un arreglo ! Se deben accesar mediante un subíndice de tipo entero (byte, short, int o long): ! También es posible instanciar arreglos escribiéndolos como literales en el código fuente: ... int i; long[] números; int[] nota = { 23, 14, 55, 18 } ; números = new long[ 20 ]; ... i=0; while( i < 20 ){ números[ i ] = i ; i++; } ... Instancia un arreglo de enteros de largo 4. Franco Guidi Polanco 01-08-12 81 Recorrer un arreglo 82 ! Tratar de accesar una posición inexistente del arreglo, por ejemplo, la posición 10 de un arreglo de largo 10. Cuando lo anterior ocurre, se genera en tiempo de ejecución una excepción denominada: ArrayIndexOutOfBoundsException ... int i; long[] números; números = new long[ 20 ]; ... i=0; while( i < números.length ) { System.out.println( números[ i ] ); i++; } ... 01-08-12 01-08-12 Error típico en el manejo de arreglos ! Se puede utilizar la propiedad length del arreglo para controlar procesos iterativos sobre el mismo: Franco Guidi Polanco Franco Guidi Polanco 83 Franco Guidi Polanco 01-08-12 84 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 ! El arreglo de parámetros declarado al inicio del método main, es instanciado por Java al momento de ejecutarse la aplicación. ! El arreglo se instancia con un largo igual a la cantidad de parámetros traspasados en la línea de comandos. + nota.length ); ! El arreglo debe ser declarado como arreglo de Strings. Las propiedades o atributos se consultan sin paréntesis al final, a diferencia de los métodos. Franco Guidi Polanco 01-08-12 85 Resumen de arreglos 01-08-12 86 ! Los arreglos son referenciados desde una variable. ! Todas las posiciones del arreglo son del mismo tipo. ! La instanciación ocurre de tres formas: " cuando se utiliza el operador new. " cuando el arreglo es declarado literalmente. " cuando se ejecuta la aplicación, en el caso particular del arreglo de parámetros del método main. 01-08-12 Franco Guidi Polanco Resumen de arreglos ! Los arreglos se instancian. Franco Guidi Polanco Consideraciones respecto del arreglo de parámetros ! El atributo length permite acceder al largo del arreglo. ! Tratar de acceder una posición inexistente del arreglo genera una excepción ArrayIndexOutOfBoundsException. 87 Franco Guidi Polanco 01-08-12 88 Matrices Características de una matriz ! Un arreglo puede tener más de una dimensión. ! Los arreglos de más de una dimensión se denominan matrices. ! El caso más común es la matriz bidimensional: 12 -3 4 55 4 700 -8 0 1 0 -2 14 ! 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 además por sus dimensiones. ! Las dimensiones de una matriz no se pueden modificar. ! Ejemplo: Matriz de dos dimensiones Franco Guidi Polanco mediciones 01-08-12 89 Convenciones respecto de las matrices 12 -3 4 55 Filas 1 4 700 -8 0 2 1 0 -2 14 Franco Guidi Polanco 01-08-12 -3 4 55 4 700 -8 0 1 0 -2 14 Franco Guidi Polanco Matriz mediciones de datos enteros, de dimensiones 3 x 4 01-08-12 90 Creación de Matrices ! En el caso de las matrices de dos dimensiones, llamaremos a la primera dimensión “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. Columnas 0 1 2 3 0 12 Matriz de 3 filas y 4 columnas ! Para crear matrices: tipo[ ] [ ] variable = new tipo[ entero1 ] [ entero2 ] Por ejemplo: int[ ][ ] utilidad; utilidad = new int[10][15]; ! O mediante literales: double[ ][ ] uti = { {-1, 7, 15}, {3, 0, 2}, {4, -3, 12} }; uti[1][2] contiene un 2. 91 Franco Guidi Polanco 01-08-12 92 Particularidades de los arreglos multidimensionales en Java Acceso a posiciones ! Las posiciones de una matriz se acceden independientemente (una a una). ! Se utiliza un subíndice para especificar cada dimensión ! En una matriz de dos dimensiones, el primer subíndice representa la fila, y el segundo, la columna. ! Ejemplo mediciones 0 1 0 12 -3 2 4 3 55 1 4 700 -8 0 2 1 0 -2 14 Franco Guidi Polanco ! 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: 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... 01-08-12 int[ ][ ] nota = { {-1,7,15}, {3, 2}, {4,-3,12}, {3} }; 93 Es decir, lo anterior queda así… 7 3 2 4 -3 01-08-12 94 Matrices N-dimensionales ! Se pueden crear matrices de más de dos dimensiones. int[ ][ ] nota = { {-1,7,15}, {3, 2}, {4,-3,12}, {3} }; -1 Franco Guidi Polanco ! Ejemplo (un cubo): 15 int[][][] dato = new int[4][10][6]; 12 3 Franco Guidi Polanco 01-08-12 95 Franco Guidi Polanco 01-08-12 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 dimensión (cantidad de filas) • datos[0].length : contiene el largo de la fila 0 (cantidad de columnas). Franco Guidi Polanco 01-08-12 97