203
PROGRAMACIÓN EN JAVA BÁSICO Dr. Juan Muñoz López Agosto 2011

Java Básico Unidad II v2011

Embed Size (px)

Citation preview

Page 1: Java Básico Unidad II v2011

PROGRAMACIÓN EN JAVA BÁSICO

Dr. Juan Muñoz LópezAgosto 2011

Page 2: Java Básico Unidad II v2011

ELEMENTOS DE PROGRAMACIÓN CON JAVAUNIDAD II

Page 3: Java Básico Unidad II v2011

Contenido

1. Tipos de Aplicaciones en Java2. Elementos del lenguaje de programación Java

1. Principios de Programación en Java2. Palabras reservadas3. Tipos de datos, literales y constantes4. Declaración, inicialización y uso de variables

1. Alcance5. Operadores y Asignaciones6. Control de flujo7. Manejo de Excepciones8. Validación9. Afirmaciones

3. Estándares de codificación4. Manejo de arreglos5. Manejo de cadenas6. Paquetes7. Manejo de Entrada/Salida

1. Flujos de Entrada/salida2. Manejo de Archivos y Directorios3. Seriación

Page 4: Java Básico Unidad II v2011

Tipos de Aplicaciones en Java

Page 5: Java Básico Unidad II v2011

Tipos de Programas de Java• Aplicaciones: Programas que pueden ejecutarse normalmente desde la línea de

comandos del sistema operativo. • Aplicaciones de consola: Son aplicaciones que ingresan los datos y presentan sus resultados

en terminales de modo “carácter”• Aplicaciones de escritorio: Son aplicaciones que cuentan con una interface gráfica de usuario

(GUI) basada en el uso de ventanas (contenedores), controles y eventos

• Applets: Son pequeños programas que se incorporan y ejecutan en una página HTML dentro de un navegador de Internet

• Enterprise JavaBeans (EJB): Modelo de aplicaciones distribuidas basadas en componentes reutilizables, existen tres tipos:• EJB de entidad: Su objetivo es encapsular los objetos del lado del servidor que almacena

datos, teniendo como característica principal la persistencia de datos• EJB de sesión: Gestionan el flujo de información en el servidor, sirven como front-end

(interface) de los servicios proporcionados por otros componentes que están disponibles en el servidor

• EJB dirigidos por mensajes: Funcionan de manera asíncrona, pueden suscribirse a un tema o a una cola y activarse al recibir un mensaje dirigido al tema o cola

• JavaBeans: Son componentes reutilizables de software que encapsulan varios objetos en uno solo. Esos componentes pueden ser manipulados visualmente por una herramienta de construcción

Page 6: Java Básico Unidad II v2011

Tipos de Programas de Java• JavaServerPages (JSP): Se generan páginas dinámicas

en forma de documentos HTML, XML o de otros tipos. El código Java se utiliza mediante scripts y pueden además utilizarse algunas acciones JSP predefinidas mediante etiquetas

• Librerías de Clases (paquetes): No son programas que puedan ejecutarse por si solos sino conjuntos de clases que pueden ser utilizadas como partes de otros programas

• Servlets: Son programas que se ejecutan en un servidor HTTP y permiten crear páginas Web interactivas

• Xlet: Aplicaciones desarrolladas en Java para la interfaz API MHP que define una plataforma común para las aplicaciones interactivas de televisión digital.

Page 7: Java Básico Unidad II v2011

Elementos del Lenguaje de Programación Java

Page 8: Java Básico Unidad II v2011

Principios Básicos de Programación• Claridad de lectura es el aspecto más importante de un estilo de programación• Escoger buenos nombres, es decir que sean claros y descriptivos• Tomar ventaja de las características del lenguaje (Java es orientado a objetos, no

procedural)• Ser consistente en las decisiones de estilo que se tomen• Comentar de manera apropiada, algunas cosas que se recomienda que los

comentarios puedan establecer son:• Qué hace el método• Qué dato contiene esta variable o atributo• Cómo trabaja este procedimiento• Cuál es el estado en este punto de ejecución• Por qué se escribió este método de esta forma• Qué alternativas existen• Cuáles son las características de desempeño del algoritmo• Dónde puedo encontrar más información sobre este dominio de problemas• En resumen: Los comentarios deben responder a preguntas

• No permitir que la optimización interfiera con la claridad de la lectura• Cuando se tenga que hacer mantenimiento a código ya hecho (por otra persona)

se debe mantener el estilo

Page 9: Java Básico Unidad II v2011

Principios Básicos de Nombramiento• Usar convenciones de nombres consistentes• Usar nombres fáciles de pronunciar• No utilizar abreviaciones• Los tipos pueden ser buenas “raíces” de nombres (por ejemplo

BotonReset)• Los nombres buenos no necesariamente son largos• Usar nombres que aparecen en fuentes externas (por ejemplo de

publicaciones de donde tomamos los algoritmos)• Utilizar palabras consistentes con lo que se desea expresar, por

ejemplo: • Nombrar clases, interfaces, variables, atributos, etc. con sustantivos• Nombrar métodos con verbos

• Usar nombres en un sentido positivo• Nombrar todas las constantes que se utilicen• Cambiar todos los nombres que no sean realmente buenos

Page 10: Java Básico Unidad II v2011

Principios de Estructura de las Clases

• Escribir comentarios para todas las clases y miembros• Agrupar las declaraciones que se encuentren interrelacionadas• No usar nombres que se califiquen por paquetes excepto en

declaraciones de import• Importar paquetes completos solamente en circunstancias

limitadas• No escribir relaciones circulares de paquetes• No exagerar en el uso de la herencia• No tratar de hacer subclases de clases concretas• Mantener las clases, atributos y métodos privados hasta que sea

necesario usarlos en otro lugar• Usar final para atributos que no deban cambiar• Hacer que todos los atributos que no sean finales sean private• Soportar la creación de instancias anónimas cuando sea oportuno

Page 11: Java Básico Unidad II v2011

Principios para Métodos y Sentencias• Cada método debe hacer solo una cosa• Los métodos más pequeños son más fáciles de entender• Partir los métodos para tener listas de parámetros cortas• Declarar variables en el lugar donde se vayan a usar• Crear nuevas variables en lugar de reasignar nombres

viejos• No modificar las variables de la lista de parámetros• Tratar de modificar lo menos posible los atributos

Page 12: Java Básico Unidad II v2011

Principios para Errores y Excepciones

• No usar excepciones para el control del flujo normal del programa

• No usar excepciones declaradas para condiciones erróneas

• Permitir que el lenguaje encuentre los errores• Utilizar afirmaciones para depurar la lógica del programa

Page 13: Java Básico Unidad II v2011

Otros• Utilizar estructuras while (true) para ciclos infinitos• Establecer limites en las cláusulas de inicialización en

ciclos for

Page 14: Java Básico Unidad II v2011

Otros Principios de Programación en Java

• Fallar rápido: Buscar posibles errores de programación de manera temprana y continua

• Escribir menos código (y más claro): Escribir programas más claros y que requieran menos código, tratar de reutilizar librerías de buena calidad cuando sea posible

• Hacer programas de computadora pensados en las personas: Los programas deben ser escritos para que las personas los puedan leer y las computadoras los puedan ejecutar

• Hacer las cosas correctas: Buscar siempre las mejores soluciones y no las que nos parecen más fáciles

• Reducir el estado: Buscar que los programas dependan menos de variables de clase que no sean declaradas como finales

• Conocer tus errores: Esto no solamente significa saber corregirlos sino saber de donde provienen, tener un profundo conocimiento de la plataforma y los aspectos más importantes del tipo de aplicaciones que estamos programando

(Empathy Box)

Page 15: Java Básico Unidad II v2011

Investigación 03: Principios de Programación en Java

• Localice otros principios de programación en Java y enlístelos. Deberá de tener para cada principio:• Principio (nombrarlo de manera clara)• Explicación• Ejemplo• Referencia, indicando en el caso de libros el título y el nombre del

autor, en el caso de sitios web el nombre del sitio, el nombre de la sección y la URL para localizarlo

Page 16: Java Básico Unidad II v2011

Algunas Recomendaciones para Comenzar a Programar• Antes de comenzar a hacer un programa debemos analizar el problema que

queremos resolver• Analizar el problema implica entender completamente que es lo que vamos a

solucionar• Una vez que sabemos de que se trata el problema debemos diseñar una

solución• Para diseñar una solución es necesario que pensemos en la forma en que

resolveríamos el problema (aún sin tener una computadora)• Al diseñar la solución requerimos determinar:

1. Qué cosas necesitamos (los objetos que vamos a utilizar)

2. Qué necesitamos qué hagan esas cosas (los métodos)

3. Qué esperamos que resulte de la ejecución de esas tareas (los resultados)

4. En qué orden vamos a hacer todas esas acciones para que se den los resultados que esperamos

• Hacer el programa que represente esa solución, al hacer el programa tengo que asegurarme de que funcione bien (que no tenga errores), probablemente después quiera hacer que funcione mejor, cuando lo revise a lo mejor buscaré que sea más rápido y lo modificaré para que así sea (puede ser eliminando instrucciones innecesarias, usando procedimientos más sencillos, etc.)

Page 17: Java Básico Unidad II v2011

Un ejemplo muy sencillo• Problema: Necesito sumar dos números enteros que proporcione

el usuario y presentar el resultado en la pantalla de la computadora

• ¿Cuál es el problema que vamos a solucionar? Sumar dos números enteros proporcionados por el usuario

• ¿Cómo vamos a solucionar el problema?• ¿Qué necesitaría? Un matemático• ¿Qué debe hacer el programa? Solicitar los números a sumar, efectuar la

adición de los números y desplegar los resultados• ¿Qué va a resultar de cada paso?

• Al principio el usuario nos va a dar dos valores • Los dos valores los vamos a sumar y guardar en una variable• Vamos a presentar el resultado de la suma en pantalla

• ¿Cuál es el orden lógico que siguen estas tareas?• Primero: solicito los valores al usuario• Segundo: efectúo la adición• Tercero: entrego el resultado

Page 18: Java Básico Unidad II v2011

El Código para el ejemplo sería…• import java.util.Scanner;• class Matematico {• int valor1, valor2;

• public Matematico(int v1, int v2) {• valor1=v1;• valor2=v2;• }• public int sumar() {• int resultado;• resultado=valor1+valor2;• return resultado;• }• }

• public class ProgramaMatematico {

• public static void main(String[] args) {• Scanner teclado=newScanner(System.in);

• int variable1, variable2, suma;• System.out.print("Proporcione el valor del

primer operando: ");• variable1=teclado.nextInt();• System.out.print("Proporcione el valor del

segundo operando: ");• variable2=teclado.nextInt();• Matematico miAyudante=new

Matematico(variable1,variable2);• suma=miAyudante.sumar();• System.out.println("La suma de los dos

operandos es: "+suma); • }• }

Page 19: Java Básico Unidad II v2011

Otra solución para el mismo ejemplo…

• Problema: Necesito sumar dos números enteros que proporcione el usuario y presentar el resultado en la pantalla de la computadora

• ¿Cuál es el problema que vamos a solucionar? Sumar dos números enteros proporcionados por el usuario

• ¿Cómo vamos a solucionar el problema?• ¿Qué necesitaría? Un programa de computadora• ¿Qué debe hacer el programa? Pedir los números a sumar, sumar los números

y presentar los resultados• ¿Qué va a resultar de cada paso?

• Al pedir los números a sumar vamos a tener dos números • Al sumar los números vamos a tener un resultado• Al desplegar el resultado vamos a tener en pantalla la solución al problema

• ¿Cuál es el orden lógico que siguen estas tareas?• Primero tengo que pedir los números para saber que es lo que hay que sumar• Luego tengo que sumarlos • Tengo que presentar el resultado en pantalla

Page 20: Java Básico Unidad II v2011

El código para esta solución podría ser…• import java.util.Scanner;

• public class Programa {

• /* • * En este metodo vamos a leer cada uno de los

valores enteros que vamos a sumar• */• public static int leer() { • int valorLeido;• Scanner teclado=new Scanner(System.in);• valorLeido=teclado.nextInt();• return valorLeido;• }• /**• * En este método vamos a sumar los dos valores

enteros que leímos• */• public static int sumar(int v1, int v2){• int suma;• suma=v1+v2;• return suma;• }• /** • * En este método vamos a presentar el resultado *

• */• public static void desplegar(int valor) {• System.out.println("El resultado es "+valor);• }• • /**• * El método main nos sirve para darle un orden a las

cosas que tenemos que hacer• */• • public static void main(String[] args) {• /* • *Vamos a requerir variables para guardar los valores

a sumar • * y también una variable para guardar el resultado• */• int valor1, valor2, resultado;• System.out.print("Dame el primer valor a sumar: ");• valor1=leer();• System.out.print("Dame el segundo valor a sumar: ");• valor2=leer();• resultado=sumar(valor1,valor2);• desplegar(resultado);• }• }

Page 21: Java Básico Unidad II v2011

… y si simplificamos la solución anterior…

• import java.util.Scanner;

• public class Programa {• public static void main(String[] args) {• Scanner teclado=new Scanner(System.in); • int valor1, valor2, resultado;• System.out.print("Dame el primer número a sumar: ");• valor1=teclado.nextInt();• System.out.print("Dame el segundo número a sumar: ");• valor2=teclado.nextInt();• resultado=valor1+valor2;• System.out.println("El resultado de la suma es:"+resultado);• }• }

Discusión:

¿Cuál sería la mejor solución?¿Puede haber otras soluciones?¿Qué hay en común en las tres soluciones?¿Cuál sería la solución que más nos acomodaría?

Page 22: Java Básico Unidad II v2011

Tarea 02: Ejemplos de programación muy simples

1. Hacer un programa que solicite al usuario el diámetro de un circulo y calcule la circunferencia. La formula a usar es: circunferencia=pi*diametro

2. Hacer un programa que calcule la densidad de un cuerpo, se solicita al usuario la masa y el volumen que ocupa dicho cuerpo. La formula a usar es: densidad=masa/volumen

3. Hacer un programa que calcule la velocidad final de un cuerpo, se solicita al usuario la velocidad inicial, la aceleración y el tiempo. La formula a usar es: velocidadFinal=velocidadInicial + aceleración * tiempo

4. Hacer un programa que calcule la intensidad de la corriente en un medio, se pide al usuario el voltaje y la resistencia. Se tiene la formula: resistencia = voltaje / intensidad (tome en cuenta que en ocasiones para hacer un programa necesitamos despejar las formulas con que contamos)

5. Hacer un programa que obtenga el peso específico de un líquido en que se sumerge un cuerpo. Se pide al usuario la fuerza de presión, la superficie que recibe la presión y la profundidad de inmersión del cuerpo. Las formulas a utilizar son: presion=fuerzaPresion/superficiePresion y presion=pesoEspecificoLiquido/profundidadInmersion

Page 23: Java Básico Unidad II v2011

Palabras Reservadas

• Las palabras reservadas (o clave) en un lenguaje de programación son aquellas que tienen un significado especial para el lenguaje y por tal razón no deben usarse como nombres de ningún elemento (clases, interfaces, atributos, métodos, etc.)

Page 24: Java Básico Unidad II v2011

Palabras Reservadas en Java• abstract assert boolean break byte• case catch char class continue• default do double else enum• extends final finally float for• if implements import instanceof int• interface long native new package• private protected public return short• static strictfp super switch synchronized • this throw throws transient try• void volatile while• true* false* null* const** goto**

• Hay 48 palabras reservadas• Todas se escriben con minúsculas• * Aunque no son palabras reservadas sino valores, no pueden usarse como

identificadores• ** Ya no se utilizan

Page 25: Java Básico Unidad II v2011

Tipos de Datos en Java• Se dice que Java es un lenguaje fuertemente tipado. Cada

variable tiene un tipo, cada expresión tiene un tipo y cada tipo está definido estrictamente; además, en todas las asignaciones se comprueba la compatibilidad de tipos. Si los tipos no coinciden se generan errores.

• Los tipos de datos en Java se clasifican en:• Tipos primitivos: Son los tipos que están integrados en el sistema y

no se tratan como objetos.• Tipos referenciados: Hay tres clases de tipos referenciados: las

clases, las interfaces y los arreglos (arrays). Son referenciados porque hacen referencia a direcciones de memoria.

Page 26: Java Básico Unidad II v2011

Tipos de Datos Primitivos

Tipo Valores que Maneja

Rango de Valores Espacio en memoria

Valor default

byte Números enteros(byte)

-128 127 8 bits (un byte) 0

short Números enteros(entero corto)

-32768 32767 16 bits (2 bytes) 0

int Números enteros(entero)

-2147483648 2147483647 32 bits (4 bytes) 0

long Números enteros(entero largo)

-9223372036854775808 9223372036854775807 64 bits (8 bytes) 0L

char Números enteros /

Caracteres(carácter)

0\u0000

65335\uFFFF

16 bits (2 bytes) ‘\u0000’

float Números reales (estándar IEEE-754)

(real)

3.4e-038 3.4e+038 32 bits (4 bytes) 0.0f

double Números reales(doble precisión)

1.7e-308 1.7e+308 64 bits (8 bytes) 0.0d

boolean Valores lógicos(booleanos)

true false No definido (1 byte) false

• Para manejar números enteros existen 5 diferentes• Para manejar números reales existen 2 diferentes• Para manejar valores lógicos existe 1

• Java tiene 8 tipos de datos primitivos:

Page 27: Java Básico Unidad II v2011

Literales• Las literales sirven para representar valores de algún tipo específico

Nombre del Valor que se

Maneja

Tipo Ejemplo de Literal

Negativa

Ejemplo de Literal Positiva

Notas

Byte byte -150 123

Entero Corto short -24890 13579

Entero int -1234567 987654

Entero Largo long -987654321L 1234567890L Terminamos la literal con una L

Carácter char ‘x’ Se encierra entre comillas sencillas (apostrofes)

Real float -123456.12F 24689.123F Terminamos la literal con F

Doble Precisión

double -998877.123D 89983445.45D Terminamos la literal con D

Booleano boolean false true No son valores numéricos

Page 28: Java Básico Unidad II v2011

Literales• Ejemplos de otras literales que también pueden representarse en Java:

Literal Tipo Qué representa Notas

256 int El número 256 en base 10

0400 int El número 256 en octal Para representar un número entero en octal (base 8) le ponemos un cero (0) al principio

0x1000 int El número 256 en hexadecimal

Para representar un número entero en hexadecimal (base 16) le ponemos un 0 cero y una x (0x) al principio

1.3e6 double El número 1’300,000 en notación científica

Si la literal de un número de punto flotante no termina con F entonces Java la toma de tipo double

1.3e-6 double El número 0.0000013 en notación científica

La cantidad después de la e representa por que potencia de 10 estamos multiplicando lo que está antes de esa letra

-14.3e4 double El número -143,000 en notación científica

Sería más correcto expresar el valor como -1.43e5, pero es válido

Page 29: Java Básico Unidad II v2011

Literales• Más ejemplos de literales que pueden representarse en Java:

Literal Tipo Qué representa Notas

‘\n’ char El salto de línea Podemos representar de esta forma varias secuencias de escape como: salto de línea ‘\n’ tabulador ‘\t’ Apostrofe ‘\’’comillas dobles ‘”’diagonal invertida ‘\\’retorno de carro ‘\r’cambio de página ‘\f’Retroceso ‘\b’

‘\u0007’ char El carácter que hace un pitido en la computadora

Los caracteres Unicode se representan poniendo la \u y luego un número hexadecimal (base 16) de 4 digitos

“cadena”

String Una literal que representa una cadena de caracteres

Los String no son tipos primitivos sino tipos referenciados de la clase String

Page 30: Java Básico Unidad II v2011

Constantes• Las constantes son valores fijos que son llamados durante

la vida de un programa a través de un identificador.

• La declaración de una constante en Java equivale a declarar un identificador de un tipo, calificarlo como final y/o static y ponerle un valor.

• Ejemplos de constantes:

• final static long VELOCIDAD_LUZ=300000;• final static String CONTINUAR=“Pulse ENTER para continuar”;• final double DENSIDAD_PLOMO=11.4;

Page 31: Java Básico Unidad II v2011

Declaración de Variables• Una variable representa un espacio en memoria que sirve para

almacenar un valor de un determinado tipo.• Su valor puede cambiar a lo largo de la ejecución de un

programa.• Para declarar una variable se escribe el tipo de la variable y se

le asigna un identificador de la siguiente forma:

tipo identificador[, identificador …];• Como puede observarse podemos declarar varias variables

del mismo tipo en una sola sentencia separándolas por comas.• Ejemplos de declaraciones:

float masa;

int coordenadaX, coordenadaY, coordenadaZ;

String texto;

Page 32: Java Básico Unidad II v2011

Inicialización de Variables• Las variables miembro de una clase (atributos) son inicializadas automáticamente por el

compilador.• Las variables locales deben ser inicializadas por el programador.• Inicializar una variable consiste en asignarle un valor. Ejemplo:

x=20;• Al momento de declarar una variable también podemos inicializarla usando la siguiente

sintaxis:

tipo identificador[=valor][, identificador[=valor]…];• Ejemplo:

float masa=19.765F;

int coordenadaX=7, coordenadaY=3, coordenadaZ=12;

String texto=“Cadena inicial de texto”;• Java permite la inicialización dinámica de variables utilizando expresiones válidas en el

instante que la variable es declarada. Por ejemplo:

int a=5,b=10, c=b*a;

double diametro=5.6;

double circunferencia=Math.PI*diametro;• Una expresión de inicialización no es valida si dentro de ella se encuentra la variable a

inicializar. Por ejemplo:

int c=10, a=a+c;

Page 33: Java Básico Unidad II v2011

Uso de Variables• Las variables se usan dentro de las expresiones del

lenguaje Java.• Se pueden usar solas o en conjunto con otras variables,

literales o constantes, dependiendo de la sintaxis de la sentencia en la que intervengan.

• Ejemplos de uso de variables son:

precioTotal=cantidad * precio;

precioIVA=precioTotal*1.16;

if (precioIVA>1000) {

System.out.println(“Ha obtenido: “+boletos+” boletos del sorteo”);

participante=true;

}

if (participante)

System.out.println(“Sus boletos se entregan en servicio al cliente”);

Nota: Las variables están destacadas en rojo

Page 34: Java Básico Unidad II v2011

Conversión de tipos• En Java existen dos tipos de conversiones de tipos:

• Conversión implícita: Aplica a valores numéricos (recuerde que char también se toma como numérico, pero boolean no). Cuando en una expresión intervienen variables o valores de diferente tipo el resultado siempre será del tipo que tenga capacidad de manejar mayor precisión para evitar perdida de información.

• Una variable numérica que tiene mayor precisión siempre podrá recibir el resultado de una expresión que tiene un tipo de menor precisión.

• Si acomodamos los tipos de menor a mayor capacidad tenemos:byte

Menor Precisión

Mayor Precisión

short char

int

long

float

double

• Conversión explícita: A esta también se le conoce como conversión forzada. Se hace mediante una construcción de cast, que consiste en anteceder encerrado entre paréntesis el tipo que deseamos que tenga la expresión. Ejemplos:

float b=5.0001F, r;int a, c;a=(int) b; c= (int) Math.sqrt(a*b);r= (float) (19.10*c);

Page 35: Java Básico Unidad II v2011

Ejemplos de Conversión

Expresión TipoResultante

Observaciones

real+entero1+octeto+largo; float float es el tipo de mayor precisión

entero1/entero3; int Aunque el resultado tuviera decimales se convertiría automáticamente a entero perdiendo precisión

12.56f+90+3.2+real; double El valor literal 3.2 al no terminar con f se toma como double, que tiene mayor precisión que float

largo + real; float Aunque long mide 8 bytes y float solamente 4, float puede manejar una mayor precisión

carácter+entero1 int El resultado será igual a 69, porque se sumará el valor del carácter ‘A’ que es 65 con el valor de entero1 que es 4

Variables a usar:float real=10.5f, int entero1=4, entero2=12, entero3=15;double doble=300.3;char carácter=‘A’;byte octeto=-120;

long largo=120000;boolean lógico=false;

Page 36: Java Básico Unidad II v2011

Ejemplos de Conversión

Expresión TipoResultante

Observaciones

(int) doble + real; float El cast no está convirtiendo toda la expresión a entero, solamente a la variable doble

(int) (doble + real); int El cast está convirtiendo a toda la expresión

entero1 + (int) lógico; Error No podemos convertir booleanos a números

(real > doble) boolean El resultado de una expresión de comparación es un valor lógico

carácter + octeto int En cualquier expresión los tipos short y byte son convertidos automáticamente a int.

carácter + carácter int El tipo char también se convierte automáticamente a int si se encuentra en una operación que implique cálculos numéricos

octeto * 123456712 int Aunque se hará el cálculo y generará un valor entero este será erróneo ya que el tipo entero no tiene la capacidad de soportar el valor resultante

Variables a usar:float real=10.5f, int entero1=4, entero2=12, entero3=15;double doble=300.3;char carácter=‘A’;byte octeto=-120;

long largo=120000;boolean lógico=false;

Page 37: Java Básico Unidad II v2011

Ejemplos de Conversión

Expresión TipoResultante

Observaciones

c=a/b; float El resultado se asigna a una variable de tipo float. Sin embargo es necesario notar que el resultado de a/b es de tipo entero entero. El resultado de la división entera 15/2 nos devuelve 7.

c=(float) (a/b); float Aunque el resultado se convierte a float, la división se hizo entre dos enteros por lo que la división fue entera. El resultado de esta operación es 7.0 al convertir ese resultado a float.

c=(float) a / (float) b; float El resultado es una división entre dos números reales (a y b se convierten a float antes de hacer la operación) por lo que el resultado es 7.5

c=(float) a / b; float El resultado es una división entre un número real (la variable a convertida a float) y un número entero (la variable b), por tanto la expresión es de tipo real, así que el resultado será 7.5

Variables a usar:int a=15, b=2;float c;

Page 38: Java Básico Unidad II v2011

Alcance de las Variables• Recordemos que el alcance de una variable depende del ámbito en que fue

declarada• El ámbito de una variable es determinado por el lugar donde esta se declara. El

ámbito puede ser a nivel de clase (atributo) o a nivel local• El alcance de una declaración es la porción del programa que puede hacer

referencia a la entidad declarada por su nombreclass MiClase {

//variables miembro de la clase (atributos)

public void unMetodo(lista de parámetros) {

//variables locales// una sentencia compuesta{

//variables locales}

}}

AlcanceLimitado a una Clase

AlcanceLimitado a un MétodoAlcanceLimitado a un Método

Alcance Limitado a un Bloque

Page 39: Java Básico Unidad II v2011

Clases Envolventes• Cada uno de los tipos primitivos en Java tienen

asociada una clase, a estas clases se les conoce como Clase Envolvente.

• Al proceso se asignar al objeto de la clase envolvente un dato de su tipo primitivo correspondiente se llama boxing (envuelto=primitivo) y al procedimiento contrario, es decir, a asignarle a un dato primitivo un objeto de su clase envolvente se llama unboxing (primitivo = envuelto).

• Las clases envolventes tienen métodos que permiten manejar el tipo de dato primitivo al que corresponden

• Entre los métodos más importantes tenemos parseTipo que sirven para convertir un String a un tipo primitivo particular, valueOf que permiten convertir un String en un objeto de la clase envolvente, toString que permite convertir un tipo primitivo en String

• Hay una clase abstracta que se llama Number, esta clase trabaja con valores double, float, int y long. De ella se derivan las clases envolventes.

Tipo Primitivo

Clase Envolvente

boolean Boolean

byte Byte

char Character

short Short

int Integer

long Long

float Float

double Double

void (en realidad este no es un tipo)

Void

Page 40: Java Básico Unidad II v2011

• Al proceso se asignar al objeto de la clase envolvente un dato de su tipo primitivo correspondiente se llama boxing (En el código:envuelto=primitivo1) y al procedimiento contrario, es decir, a asignarle a un dato primitivo un objeto de su clase envolvente se llama unboxing (En el código: primitivo2 = envuelto).

Page 41: Java Básico Unidad II v2011

Operadores• Los operadores son símbolos que indican como son manipulados

los datos.• Java maneja ocho grupos de operadores:

• Aritméticos: Se utilizan para realizar operaciones matemáticas• Unarios (Unitarios): Son los que se aplican a un solo operando• De Bits: Realizan operaciones directas con los bits de variables de tipos

enteros (byte, char, short, int, long)• De Asignación: Almacena el valor de una expresión al operando que se

encuentra a la izquierda de él• Relacionales (De Comparación): Permiten evaluar la igualdad y la magnitud

(orden) devolviendo valores lógicos• Lógicos: Sirven para realizar operaciones booleanas, devuelven valores

lógicos• Operador Condicional (Ternario): Se utiliza para la evaluación de expresiones

condicionales• De Comparación de Tipos: Para determinar si una instancia es del tipo de una

clase

Page 42: Java Básico Unidad II v2011

Operadores AritméticosOperador Descripción Observaciones Ejemplo

+ Suma Adiciona operandos enteros o reales r = a + b;

- Resta Sustrae al minuendo el sustraendo, se aplica a valores enteros o reales

r= a – b;

* Multiplicación Multiplica al multiplicando tantas veces como las que indique el multiplicador, se aplica a operandos enteros o reales

r= a * b;

/ División Obtiene el cociente del dividendo sobre el divisor, se aplica a operandos enteros o reales, si ambos operandos son enteros el resultado es entero, en cualquier otro caso es un real.

r= a / b;

% Módulo Obtiene el residuo (resto) resultante de dividir el dividendo entre el divisor. Se aplica solo a operandos enteros.

r= a % b;

Page 43: Java Básico Unidad II v2011

Operadores UnariosOperador Descripción Observaciones Ejemplo

+ Más unario Indica que el valor es positivo, no es necesario poner este operador para indicar que un valor es positivo.

x = +10;

- Menos unario Niega una expresión, convierte al valor en negativo.

y = -10;

~ Complemento a 1 Cambia ceros por unos y unos por ceros a nivel bit. Solo aplica a valores enteros

b=2;c=~b;(c vale -3)

! Complemento Lógico

Invierte los valores lógicos. Si es verdadero será falso y viceversa. Solo aplica a valores booleanos

fuera=true;dentro = !fuera;(dentro es false)

++ Incremento Agrega uno a su operando x++;

-- Decremento Disminuye uno a su operando y--;

Page 44: Java Básico Unidad II v2011

Observaciones sobre los Operadores de Incremento y Decremento

• Los operadores de incremento pueden usarse como sufijos (variable++) o como prefijos (++variable) y el resultado final será el mismo para la variable

• Si el resultado de un incremento o de un decremento se asigna a una variable si existe diferencia entre aplicar los operadores como sufijos o como prefijos:

int a=2, b=2, e=2, f=2;

int c=a++;

int d=++b;

e++;

++f;

Los valores que tendremos serán:

a=3 b=3 c=2 d=3 e=3 f=3

• Como podemos ver: • Si el operador de incremento (o decremento) se utiliza como sufijo, primero se realiza la

asignación del valor de la variable y luego se hace el incremento (o decremento)• Si el operador de incremento (o de decremento) se utiliza como prefijo, primero se realiza

la operación y luego se hace la asignación

• En algunos libros estos operadores son considerados como operadores de asignación ya que hacen el incremento o decremento y su valor es asignado a la variable a la que se aplicó la operación.

Page 45: Java Básico Unidad II v2011

Operadores De BitsOperador Descripción Observaciones Ejemplo

& AND (AND binario) AND a nivel de bit, su tabla de valores es:1 & 1 resulta 1 1 & 0 resulta 00 & 1 resulta 0 0 & 0 resulta 0

int a=154, b=130, c;c=a & b;//c valdrá 130

| OR (OR binario) OR a nivel de bit, su tabla de valores es:1 | 1 resulta 1 1 | 0 resulta 10 | 1 resulta 1 0 | 0 resulta 0

int a=154, b=130, c;c=a | b;//c valdrá 154

^ XOR (XOR binario) XOR a nivel de bit, su tabla de valores es:1 ^ 1 resulta 0 1 ^ 0 resulta 10 ^ 1 resulta 1 0 ^ 0 resulta 0

int a=154, b=130, c;c=a ^ b;//c valdrá 24

<< Corrimiento a la izquierda

Mueve a la izquierda todos los bits de un valor (el primero operando, el de la izquierda) tantas posiciones como se indique en el segundo operando (el de la derecha)

int a=154, b=-154, c ,d;c = a << 2;d = b << 2;// c valdrá 616// d valdrá -616

>> Corrimiento a la derecha

Mueve a la derecha todos los bits de un valor tantas posiciones como se indique en el segundo operando. No se afecta el bit superior (el primer bit) por lo que siempre se conserva el signo)

int a=154, b=-154, c ,d;c = a >> 2;d = b >> 2;// c valdrá 38// d valdrá -39

>>> Corrimiento a la derecha rellenando con ceros a la izquierda

Mueve a la derecha todos los bits de un valor tantas posiciones como se indique en el segundo operando. Si se afecta el bit superior (el primer bit) por lo que no siempre se conserva el signo)

int a=154, b=-154, c ,d;c = a >>> 2;d = b >>> 2;// c valdrá 38// d valdrá 1073741785

~ NOT Es un operador unario que invierte los bits del operando al que anteceda

int a=154, b=-154, c ,d;c = ~a;d = ~b;// c valdrá -155// d valdrá 153

Page 46: Java Básico Unidad II v2011

Ejemplo adicional de Operaciones con Bits

a & b 8 00001000 a<<1 24 00011000

a & c 8 00001000 b<<1 16 00010000

a | b 12 00001100 c<<1 -16 11110000

a | c -4 11111100 a>>1 6 00000110

a ^ b 4 00000100 b>>1 4 00000100

a ^ c -12 11110100 c>>1 -4 11111100

~a -13 11110011 a>>>1 6 00000110

~b -9 11110111 b>>>1 4 00000100

~c 7 00000111 c>>>1 -4 11111100

Se tienen las siguientes variables:byte a=12, b=8, c=-8;

a (12) en binario es igual a: 00001100b (8) en binario es igual a:00001000c (-8) en binario es igual a: 11111000

Valores de los bits:128 64 32 16 8

4 2 1(Signo)

Page 47: Java Básico Unidad II v2011

Operadores De Asignación

Operador Descripción Observaciones Ejemplo

= Asignación Simple (igual) El resultado de la expresión de la derecha se asigna al operando de la izquierda

int a=10;a= 8 * 2 - 5;//a vale 11

+= Suma y asignación El resultado de la expresión de la derecha se suma al operando de la izquierda

int a=10;a+=8;//a vale 18

-= Resta y asignación El resultado de la expresión de la derecha se resta al operando de la izquierda

int a=10;a-=8;//a vale 2

*= Multiplicación y asignación El resultado de la expresión de la derecha se multiplica al operando de la izquierda

int a=10;a*=8;//a vale 80

/= División y asignación El resultado de la expresión de la derecha divide al operando de la izquierda

float a=10;a/=8;//a vale 1.25

%= Residuo y asignación El resultado de la expresión de la derecha divide al operando de la izquierda y le asigna al operando de la izquierda el residuo

int a=10;a%=8;//a vale 2

Page 48: Java Básico Unidad II v2011

Operadores De Asignación

Operador Descripción Observaciones Ejemplo

&= AND binario y asignación Se hace una operación de AND binario entre los operandos izquierdo y derecho y asigna el resultado al operando izquierdo

int a=10;a&=8;//a vale 8

|= OR binario y asignación Se hace una operación de OR binario entre los operandos izquierdo y derecho y asigna el resultado al operando izquierdo

int a=10;a|=8;//a vale 10

^= XOR binario y asignación Se hace una operación de XOR binario entre los operandos izquierdo y derecho y asigna el resultado al operando izquierdo

int a=10;a^=8;//a vale 2

<<= Corrimiento a la izquierda y asignación

Se hace una operación de corrimiento a la izquierda del operando izquierdo tomando las posiciones que indique el operando derecho y asigna el resultado al operando izquierdo

int a=10;a<<=1;//a vale 20

>>= Corrimiento a la derecha y asignación

Se hace una operación de corrimiento a la derecha del operando izquierdo tomando las posiciones que indique el operando derecho y asigna el resultado al operando izquierdo

int a=10;a>>=1;//a vale 5

>>>= Corrimiento a la derecha con relleno de ceros y asignación

Se hace una operación de corrimiento a la derecha con relleno de ceros del operando izquierdo tomando las posiciones que indique el operando derecho y asigna el resultado al operando izquierdo

int a=10;a>>>=1;//a vale 5

Page 49: Java Básico Unidad II v2011

Operadores RelacionalesOperador Descripción Observaciones Ejemplo

> Mayor que Devuelve true si el primer operando es mayor que el segundo

c = a > b;

< Menor que Devuelve true si el primer operando es menor que el segundo

if (a < b)

>= Mayor o Igual que

Devuelve true si el primer operando es mayor o igual que el segundo

if (a <= b)

<= Menor o Igual que

Devuelve true si el primer operando es menor o igual que el segundo

c = a <= b;

!= Diferente que Devuelve true si el primer operando es diferente al segundo

if (a != b)

== Igual que Devuelve true si el primer operando es igual al segundo

if (a == b)

Page 50: Java Básico Unidad II v2011

Operadores LógicosOperador Descripción Observaciones Ejemplo& AND Realiza la operación lógica Y, teniendo que:

true & true resulta truetrue & false resulta falsefalse & true resulta falsefalse & false resulta false

if ((edad > 18) & (cartilla == true))

&& AND en cortocircuito

Es equivalente al AND, solamente que si el primer valor es falso el segundo ya no se evalúa pues se sabe que el resultado será falso

iIf ((cantidad>10) && (precio < 5))

| OR Realiza la operación lógica O, teniendo que:true | true resulta truetrue | false resulta truefalse | true resulta truefalse | false resulta false

if ((peso > 70) | (edad >40))

|| OR en cortocircuito

Es equivalente al OR, solamente que si el primer valor es verdadero el segundo ya no se evalúa pues se sabe que el resultado será verdadero

if ((temp > 20) || (humedad < 15))

! NOT Realiza la operación NOT, se aplica a un solo operando. Invierte el valor lógico

if (!(presion>9))

^ XOR Realiza la operación lógica de OR Exclusivo (XOR), teniendo que:

true ^ true resulta falsetrue ^ false resulta truefalse ^ true resulta truefalse ^ false resulta false

if ((a>b) ^ (b>c))

Page 51: Java Básico Unidad II v2011

Operador Condicional (Ternario)Operador Descripción Observaciones Ejemplo

?: Operador Ternario

Es utilizado en expresiones condicionales, con la forma:

operandoLógico?operando1:operando2;

operandoLógico puede ser:1. Una expresión relacional o lógica2. Cualquier expresión booleana3. Una variable (valor) booleano

Si operandoLógico tiene un valor true entonces el resultado de la expresión será lo que se encuentre en operando1, si el valor es false entonces el resultado será el valor de operando2

int a=5, b=3;String res;res=(a>b)?”Primero”:”Segundo”;

/* Después de ejecutar la operación res tendrá el valor “Primero”*/

Page 52: Java Básico Unidad II v2011

Operador De Comparación de TiposOperador Descripción Observaciones Ejemplo Ejemplo

instanceof Instancia de Este operador devuelve un valor booleano siendo true si un objeto es instancia de una clase, de una subclase o de una clase que implementa a una determinada interface.

class Padre {}class Hijo extends Padre{}interface MiInterface {}class Nieto extends Hijo implements MiInterface {}class prueba { public static void main(String args[]) { Padre elPapa = new Padre(); Hijo elHijo = new Hijo(); Nieto elNieto = new Nieto(); boolean prueba1, prueba2, prueba3; boolean prueba4, prueba5, prueba6; boolean prueba7, prueba8, prueba9; boolean prueba10, prueba11, prueba12; prueba1=elPapa instanceof Padre; prueba2=elPapa instanceof Hijo; prueba3 = elPapa instanceof Nieto; prueba4 = elPapa instanceof MiInterface; prueba5=elHijo instanceof Padre; prueba6=elHijo instanceof Hijo; prueba7= elHijo instanceof Nieto; prueba8 = elHijo instanceof MiInterface; prueba9=elNieto instanceof Padre; prueba10=elNieto instanceof Hijo; prueba11= elNieto instanceof Nieto; prueba12= elNieto instanceof MiInterface; }}

/* Los resultados para cada una de las variables son los siguientes: Para elPapa prueba1 (Padre): true prueba2 (Hijo): false prueba3 (Nieto): false prueba4 (MIInterface): false

Para elHijo prueba5 (Padre): true prueba6 (Hijo): true prueba7 (Nieto): false prueba8 (MiInterface): false

Para elNieto prueba9 (Padre): true prueba10 (Hijo): true prueba11 (Nieto): true prueba12 (MiInterface): true*/

Page 53: Java Básico Unidad II v2011

Precedencia de OperadoresOperadores Asociatividad Prioridad

Asociación () [] . Izquierda a Derecha Mayor Prioridad

Unarios Posfijos expr++ expr-- Derecha a Izquierda

Unarios ++expr --expr +expr -expr ~ ! Derecha a Izquierda

Instanciación new (tipo) expr Derecha a Izquierda

Multiplicativos * / % Izquierda a Derecha

Aditivos + - Izquierda a Derecha

Cambio << >> >>> Izquierda a Derecha

Relacionales < > <= >= instanceof Izquierda a Derecha

Igualdad == != Izquierda a Derecha

AND binario & Izquierda a Derecha

XOR binario ^ Izquierda a Derecha

OR binario | Izquierda a Derecha

AND lógico & && Izquierda a Derecha

OR lógico | || Izquierda a Derecha

Ternario ? : Derecha a Izquierda

Asignación = += -= *= /= %= &= ^= |= <<= >>= >>>= Derecha a Izquierda Menor Prioridad

Page 54: Java Básico Unidad II v2011

Aplicación de la Precedencia• La evaluación de una expresión al aplicar la precedencia

puede modificar el resultado• Ejemplo:

a=10/2+3*5 //a vale 20

5+3*5-> 5+15

a=10/(2+3)*5 //a vale 10

10/5*5 ->2*5

a=(10/2+3)*5 //a vale 40

(5+3)*5 -> 8*5

Page 55: Java Básico Unidad II v2011

Tarea 03: Ejemplos con Operadores1. Realice un programa que solicite cuánto cuesta el kilogramo de un cierto

producto, luego pida una cantidad en gramos de ese producto y diga al usuario cuál será el costo por la cantidad especificada.

2. Realice un programa que solicite dos números (dividendo y divisor) a un usuario y luego los divida, el programa deberá presentar el resultado en número real, el resultado en número entero y el residuo.

3. Hacer un programa que solicite al usuario una hora (horas, minutos y segundos) y calcule cuantos segundos han pasado en total desde que inició el día.

4. Hacer un programa que solicite al usuario dos pares de coordenadas de un rectángulo (uno correspondiente a la esquina superior izquierda y otro correspondiente a la esquina inferior derecha) y calcule su área. Considere que cada coordenada tiene un centímetro de separación y que están en el primer cuadrante.

5. Realice un programa que solicite un número entero al usuario y presente en pantalla si el número es par o es non (se recomienda el uso del operador ternario).

Page 56: Java Básico Unidad II v2011

Control de Flujo• Una sentencia es una secuencia de expresiones que especifican

una o varias operaciones• Las sentencias se ejecutan en el orden del primero al último, al

menos que en una de ellas se indique un cambio en el flujo de un programa

• Un lenguaje de programación utiliza las sentencias de control para provocar que el flujo de la ejecución avance, retroceda o se bifurque conforme a los cambios de estado de un programa

• Las sentencias de control se pueden clasificar en:• Sentencias de selección: Permiten que el programa elija distintos caminos

de ejecución en función del resultado de una expresión o del estado de una variable

• Sentencias de iteración (repetición): Permiten que el programa ejecute una o más sentencias repetidamente, hasta que se cumpla una condición o cambie el estado de una variable

• Sentencias de salto: Permiten ir a un punto específico del programa de manera directa (no lineal)

Page 57: Java Básico Unidad II v2011

Sentencias de Selección (Condicionales)• En Java existen dos sentencias de selección:

• if Permite a un programa tomar una decisión para ejecutar una acción u otra

• switch Permite ejecutar una o varias acciones en función del valor de una expresión

true

false(else)

if

case

case

case

default

switch

Page 58: Java Básico Unidad II v2011

Sentencia if• Se utiliza para dirigir la ejecución de un programa hacia uno de dos

caminos diferentes.• Su sintaxis es la siguiente:

if (condición)

sentencia_verdadero

[else

sentencia_falso]• Si la condición se cumple (es verdadera) se ejecuta la

sentencia_verdadero, si no se cumple se ejecuta la sentencia_falso• La sentencia puede ser una sentencia simple o una sentencia

compuesta (bloque)• Recuerde que una sentencia simple termina en punto y coma• Recuerde que una sentencia compuesta se encierra entre llaves {}

• La sección del else es opcional, puede o no incluirse en el programa

Page 59: Java Básico Unidad II v2011

if Anidados• Un if anidado es una sentencia condicional if que se encuentra dentro de otra sentencia if• Puede estar dentro de la parte de la sentencia_verdadero o dentro de la parte del else

(sentencia_falso), ejemplo:

if (condicion)

if (condicion) //if anidado

sentencia_verdadero //del if anidado

else

sentencia_falso //del if anidado

else

if (condicion) //if anidado dentro del else

sentencia_verdadero //del if anidado en el else

else

sentencia_falso //del if anidado en el else• Cuando trabajemos con if anidados es necesario tener cuidado para no confundirnos con

respecto a los else.• Se sugiere que cuando hagamos anidación siempre usemos llaves para identificar más

claramente el nivel al que pertenecen los if y else

Page 60: Java Básico Unidad II v2011

if en secuencia• Es una construcción muy común en programación• Consiste en que vayamos poniendo en los else sentencias if que se

ejecutarán si la condición anterior no se cumplió• La forma en que se establece este if en secuencia es el siguiente:

if (condición1)

sentencia_verdadero_condición1

else if (condición2)

sentencia_verdadero_condición2

else if (condición3)

sentencia_verdadero_condición3

else

sentencia_falso• La sentencia_falso solamente se ejecuta si ninguna de las

condiciones en la secuencia del if se cumplió

Page 61: Java Básico Unidad II v2011

Ejemplos de uso de if

1. Realizar un programa para resolver una ecuación de segundo grado utilizando la formula general:

El programa solamente obtendrá valores para X si el discriminante () es mayor o igual que 0.

2. Hacer un programa que determine cuál es el menor de tres números (uso de if anidado)

3. Realizar un programa para determinar a que estación del año pertenece un mes determinado (uso de if en secuencia). El usuario proporcionará el número del mes

Page 62: Java Básico Unidad II v2011

Sentencia switch• La sentencia switch permite ejecutar una de varias acciones en función del valor de una expresión• Su sintaxis es:

switch (expresión) {

case constante1:

[sentencia1;]

[break;]

[ case constante2:

[sentencia2;]

[break;]]

[ case constante3:

[sentencia3;]

[break;]]

[default:

[sentencia_default;]

[break;]]

}• La expresión puede ser una variable de tipo entero: char, byte, short o int.• constante1, constante2 … son valores que puede tomar la variable expresión. Si expresión es igual a constante1,

entonces se ejecuta a partir de sentencia1; si expresión es igual a constante2, entonces se ejecuta a partir de expresión2, etc.

• default se ejecuta si la expresión no fue igual a ninguna de las constantes en el switch. Como puede verse es opcional y no es indispensable que sea la última opción.

• sentenciaN puede ser 1 o varias sentencias, en este caso no requiere de llaves dentro de cada case• Si no ponemos break al final de cada sección case el código continua en los siguientes case. Por ejemplo si la expresión

fue igual a la constante2 y constante2 no tiene break al final, entonces el programa continuará ejecutando lo que esté en constante3, luego en constante4 etc. hasta que se encuentre un break. Se recomienda poner un comentario que indique la omisión del break al final del case

• La sentencias switch también pueden anidarse.

Page 63: Java Básico Unidad II v2011

Ejemplos de uso de switch

1. Hacer un programa que presente un menú con las siguientes opciones: A. Helado sencillo, B. Helado doble, C. Sundae, D. Malteada, E. Banana Split, F. Tres Marías. Los precios son: Helado sencillo $12.00, Helado doble $17.00, Sundae $22.00, Malteada $18:00, Banana Split $25.00, Tres Marías: 23.00. El programa solicitará al usuario una opción y le dirá cuanto deberá pagar.

2. Hacer un programa que pida el número de un planeta del sistema solar (según su orden) y que presente su nombre y que además presente los que se encuentren más cerca del sol que él. 1. Mercurio, 2. Venus, 3. Tierra, 4. Marte, 5. Ceres, 6. Júpiter, 7. Saturno, 8. Urano, 9. Neptuno, 10. Plutón, 11. Haumea, 12. Makemake, 13. Eris. (omisión de break)

Page 64: Java Básico Unidad II v2011

Sentencias de Iteración• Sirven para repetir un conjunto de instrucciones con base en el

cumplimiento de una condición, el valor de una variable o el resultado de una expresión booleana.

• A un conjunto de instrucciones que se repite hasta que se cumple una condición de terminación también se le conoce como bucle.

• Las sentencias de iteración de Java son:• while Repite una sentencia simple o un bloque mientras su expresión de

control sea verdadera. La expresión de control se evalúa al principio del bucle.

• do while Repite una sentencia simple o un bloque mientras su expresión de control sea verdadera. La expresión de control se evalúa al final del bucle.

• for Permite ejecutar una sentencia simple o un bloque una cantidad conocida de veces, utilizando una variable de control que se incrementa o disminuye con cada iteración.

• for mejorado (for-each) Permite ejecutar una sentencia simple o un bloque una cantidad conocida de veces, utilizando como criterio de repetición la cantidad de elementos contenidos en un arreglo o en una colección.

Page 65: Java Básico Unidad II v2011

Sentencia while• Permite repetir cero o más veces una sentencia simple o

compuesta• Su sintaxis es la siguiente:

while (condición)

sentencia;

• La sentencia while evalúa la condición al inicio, si el resultado es true ejecuta la sentencia, si es false no se ejecuta y pasa el control a la siguiente sentencia posterior al while

true

while

false

Page 66: Java Básico Unidad II v2011

Ejemplos de uso de while

1. Programa que presente las potencias de 2 a partir del 1 siempre que sean menores al 300,000

2. Programa que solicite números enteros positivos al usuario y diga si son pares o nones. El programa termina cuando el usuario proporcione un número negativo.

Page 67: Java Básico Unidad II v2011

Sentencia do-while• Permite repetir al menos una vez una sentencia simple o compuesta• Su sintaxis es la siguiente:

do

sentencia;

while (condición);• La sentencia do-while evalúa la condición al final, primero se

ejecuta la sentencia y luego se verifica la condición, si el resultado es true, entonces regresa al do.

do-while

true

Page 68: Java Básico Unidad II v2011

Ejemplos de uso de do-while1. Hacer un programa que presente las siguientes opciones: 1.

Presentar un número aleatorio, 2. Presentar la fecha y hora del sistema, 3. Presentar el valor de PI, 4. Salir. Una vez que presente el resultado correspondiente a la opción seleccionada el programa volverá a presentar el menú hasta que seleccione la opción de Salir.

2. Hacer un programa para jugar con la computadora a adivinar un número entero. El programa generará un número entre 1 y 10 y el usuario tendrá hasta tres oportunidades para adivinarlo. Una vez que termine la partida, se preguntará al usuario si desea jugar otra más. El juego se repetirá hasta que el usuario diga a la computadora que no desea continuar. Al final el programa informará cuantas veces ganó el usuario y cuantas la computadora.

Page 69: Java Básico Unidad II v2011

Sentencia for• Permite ejecutar una sentencia simple o compuesta un número de veces conocido• Su sintaxis es la siguiente:

for ([variable1=expresión1][, variable2=expresión2…]; [condición]; [expresión_progresión1 [, expresión_progresión2…])

Sentencia;• Podemos inicializar una o más variables al inicio del ciclo, en general aquí inicializamos la variable que

servirá para controlar el ciclo• La condición permite establecer cuándo termina el ciclo, el ciclo termina cuando la condición sea false.

Si la condición se omite entonces se crea un ciclo infinito porque se supondrá que tiene valor true. Normalmente aquí hacemos la pregunta para saber si la variable de control ha llegado al estado por el que termina el ciclo.

• La condición se evalúa al principio del ciclo• Las expresiones de progresión se ejecutan cada vez que hay una iteración. Normalmente aquí vamos

a incrementar/decrementar la variable de control.

true

for

false

Inicialización

Incremento

for (inicialización; condición; incremento)sentencia;

Page 70: Java Básico Unidad II v2011

Ejemplos de uso de for1. Hacer un programa que despliegue los números del 1 al 100; luego

deberá imprimir solamente los números nones entre el 1 y el 100

2. Desplegar cada una de las letras mayúsculas del abecedario (no será necesario desplegar la Ñ), primero en orden normal y luego en orden inverso

3. Hacer un programa que despliegue el siguiente triángulo:

4. Hacer un programa que presente un cuadro con las tablas de multiplicar del 1 al 10. El resultado deberá presentarse de la siguiente forma:

11 21 2 31 2 3 41 2 3 4 5

1 2 3 4 5 6 7 8 9 101 1 2 3 4 5 6 7 8 9 10 2 2 4 6 8 10 12 14 16 18 203 3 6 9 12 15 18 21 24 27 304 4 8 12 16 20 24 28 32 36 405 5 10 15 20 25 30 35 40 45 506 6 12 18 24 30 36 42 48 54 607 7 14 21 28 35 42 49 56 63 708 8 16 24 32 40 48 56 64 72 809 9 18 27 36 45 54 63 72 81 9010 10 20 30 40 50 60 70 80 90 100

Page 71: Java Básico Unidad II v2011

Sentencia for-each• Recorre una colección o arreglo y hace una iteración para cada uno de

sus elementos • Su sintaxis es la siguiente:

for (variable:colección_arreglo)

Sentencia;• Esta sentencia toma cada uno de los elementos de la colección o arreglo

y lo asigna a la variable (la variable debe ser del mismo tipo que el arreglo)

for-each

Fin de lista

Lista

Page 72: Java Básico Unidad II v2011

Ejemplos de uso de for-each

1. Solicitar 10 valores al usuario, guardarlos en un arreglo, obtener el promedio de ellos y desplegar el resultado

2. Se tiene un arreglo con los siguientes nombres: “José”, “Pedro”, “Carmen”, “Ana”, “Carlos”, “Daniel”. Hacer un programa que despliegue un saludo para cada uno de ellos, ejemplo: “Hola Pedro”, “Hola Carmen”, …

3. Se tienen dos arreglos, el primero tiene nombres de animales, el segundo tiene adjetivos. Hacer un programa que presente todas las posibles combinaciones con los dos arreglos:

Lista1: Gato, Perro, Pez, León, Tortuga, Loro

Lista2: Veloz, Fuerte, Ágil, Feroz, Parlanchín

Page 73: Java Básico Unidad II v2011

Sentencias de Salto• Sirven para transferir el flujo a otra parte del programa de

manera incondicional.• Las sentencias de salto en Java son tres:

• break Tiene tres usos: terminar una secuencia de sentencias de un switch, salir de un ciclo y para mandar el flujo a una etiqueta particular

• continue Termina una iteración de un ciclo saltando las sentencias que aún no se hayan ejecutado

• return Se utiliza para volver de un método a la línea siguiente a aquella en que fue llamado.

Page 74: Java Básico Unidad II v2011

Sentencia break• Finaliza la ejecución de una sentencia de control (switch,

while, do, for) y transfiere el control a la siguiente línea posterior a esta. Cuando se indica el nombre de una etiqueta envía el flujo del programa a donde se encuentre dicha etiqueta

Page 75: Java Básico Unidad II v2011

Ejemplos de uso de break

1. Hacer un programa que esté generando 5 números enteros aleatorios entre 1 y 6 cada vez que haga una iteración y los presente en pantalla. El programa terminará de hacer iteraciones cuando los cinco números sean iguales. Al terminar presentará cuantas iteraciones hizo el programa antes de encontrar los cinco números iguales.

2. Hacer un programa que solicite un número entero y presente todos sus factores (los números entre los que se puede dividir). El programa no presentará los factores si el número es negativo. Al final el programa deberá de enviar un saludo de despedida.

Page 76: Java Básico Unidad II v2011

Sentencia continue• Esta sentencia obliga a finalizar la iteración actual del

bucle en el que está contenida. Funciona para sentencias for, do y while.

• Al igual que en el break puede enviar el flujo del programa hacia donde se encuentre una etiqueta

Page 77: Java Básico Unidad II v2011

Ejemplos de uso de continue1. Hacer un programa que genere números enteros aleatorios

entre 1 y 10, el programa sumará solo aquellos que sean nones mientras el total de la suma sea menor que 1000.

2. Hacer un programa que simule la ruta diaria que sigue un autobús en una ciudad (De domingo a sábado). El programa presentará todas las paradas por las que debe pasar el autobús cada día. La ruta se compone de las siguientes estaciones: 1. Estación, 2. Boulevard, 3. Industria, 4. Estadio, 5. Zoológico, 6. Parque, 7. Satélite, 8. Mall, 9. Centro, 10. Central, 11. Periférico, 12. Fuente, 13. Industria, 14. Boulevard y 15. Estación. Los sábados y domingos el autobús no pasa por la estación Fuente y solamente pasa una vez en su ruta por las estaciones de Industria y Boulevard. Como se puede ver, la ruta comienza y termina siempre en la parada de Estación.

Page 78: Java Básico Unidad II v2011

Sentencia return• Sirve para devolver el valor de un método y regresar al

punto en que éste fue llamado.• Su sintaxis es:

return expresión;• La expresión debe corresponder con el tipo declarado

para el método en su encabezado.• La sentencia return puede ser o no la última y puede

aparecer más de una vez en el cuerpo del método.

Page 79: Java Básico Unidad II v2011

Ejemplos de uso de return1. Hacer un programa para calcular el punto de reorden de una

materia prima. Se tendrá un método que recibirá como parámetros cuántas unidades se consumen en un período y la duración de ese período, el método calculará a partir de esta información cuántas unidades se consumen por día (consumo_diario=unidades_periodo/dias_periodo); el otro método calcula el punto de reorden a partir del consumo diario, el inventario de seguridad requerido y el tiempo de espera (punto_reorden=(consumo_diario*inventario_seguridad)+ tiempo_espera).

2. Hacer un programa que convierta una temperatura en grados Celcius a grados Kelvin, Rankine, Farenheit o Réaumur. El programa utilizará métodos (una conversión por método) para realizar las conversiones. Para todos los métodos el único parámetro que se permite recibir es la temperatura en grados celcius. Las formulas que puede utilizar son: °K=°C+273.15; °Ra=(9/5)*°C+492; °Ra=°F+459.67; °F=(9/5*°C) +32; °Re=(°F-32)/2.25; °C=(5/9)*(°F-32)

Page 80: Java Básico Unidad II v2011

Etiquetas• Las etiquetas señalan puntos a donde es conveniente

enviar el flujo del programa por alguna razón• Las etiquetas pueden usarse en conjunto con las

sentencias break o continue• La sintaxis de una etiqueta es la siguiente:

nombre_etiqueta:• Para ir a la etiqueta se utilizará:

break nombre_etiqueta;

continue nombre_etiqueta;

• La sentencia break o continue deben hacer referencia a etiquetas que nombren bloques en los que está contenida la propia sentencia, no importa que tan anidada esté.

Page 81: Java Básico Unidad II v2011

Ejemplo de uso de etiquetas• Hacer un programa que solicite un número entero al

usuario y obtenga todos aquellos valores que satisfagan la expresión x=a*b+c; donde x es el número solicitado al usuario (usar continue con etiquetas)

Page 82: Java Básico Unidad II v2011

Tarea 04: Ejercicios con sentencias de control

1. Hacer un programa que solicite al usuario 5 números enteros y determine cual tercia tiene la menor suma de distancias entre ellos, por ejemplo, el usuario teclea los siguientes números: 7, 2, 6, 9, 14, la distancia del 3 al 6 es 4, la distancia del 6 al 7 es 1, la distancia del 7 al 9 es 2, la distancia del 9 al 14 es 5. Por tanto la tercia con la menor suma de distancias es 6, 7 y 9 pues sus distancias suman solamente 3

2. Hacer un programa que genere el triángulo de Pascal, para potencias entre 1 y 15. Por si no lo recuerda, el triángulo de Pascal tiene el siguiente aspecto:1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

3. Hacer un programa para encontrar todos los números primos que existen entre el 1 y el 10000. Un número primo solamente es divisible entre 1 y entre él mismo.

4. Hacer un programa que pida al usuario dos horas diferentes expresadas en horas, minutos y segundos y que conforme a lo que solicite el usuario obtenga la suma de ambas (mostrando el resultado en horas, minutos y segundos) o la diferencia entre ambas (mostrando el resultado en horas, minutos y segundos).

5. Hacer un programa que solicite al usuario su fecha de nacimiento y una fecha (por ejemplo la fecha al día de hoy) y obtenga mediante un método el tiempo transcurrido en días. Tomar en cuenta los años bisiestos transcurridos durante el periodo.

Page 83: Java Básico Unidad II v2011

Manejo de Excepciones• Cuando ocurre un error en tiempo de ejecución, el programa se

interrumpe.• Cuando esto ocurre Java una excepción indicando la razón por la

cual el programa se ha detenido.• Si no se desea que el programa interrumpa su ejecución, podemos

hacer uso del manejo de excepciones.• Las instrucciones que se utilizan para manejar excepciones son try..

catch y finally• try se utiliza para poner en alerta a las sentencias que están dentro de un

bloque de código acerca de la posibilidad de un error que pueda lanzar una excepción

• catch contiene las instrucciones que se utilizan para hacer el manejo de la excepción. Podemos poner varios catch, uno para manejar cada una de las posibles excepciones que se generen.

• finally es una sentencia opcional al hacer el manejo de excepciones. Contiene código que se deberá ejecutar siempre, haya o no ocurrido una excepción.

Page 84: Java Básico Unidad II v2011

Excepciones• Las excepciones son situaciones “anómalas” que pueden

provocar que un programa interrumpa su ejecución• Las excepciones son manejadas por código que se encuentra

fuera del flujo normal de control del programa• Las excepciones permiten verificar errores• Las excepciones en Java son objetos de clases derivadas de la

clase Throwable que se encuentra en el paquete java.lang• Un objeto Error se crea cuando ha ocurrido un problema serio• La clase Exception cubre las excepciones que una aplicación

normal puede manejar• Otras clases también pueden declarar excepciones, por ejemplo

la clase java.io que maneja los flujos de entrada y salida (con los que se manejan archivos) mantiene sus propias excepciones

Page 85: Java Básico Unidad II v2011

Árbol de la Clase Throwablejava.lang.Throwable (implements java.io.Serializable) • java.lang.Error

• java.lang.AssertionError• java.lang.LinkageError

• java.lang.BootstrapMethodError• java.lang.ClassCircularityError• java.lang.ClassFormatError

• java.lang.UnsupportedClassVersionError

• java.lang.ExceptionInInitializerError• java.lang.IncompatibleClassChangeError

• java.lang.AbstractMethodError• java.lang.IllegalAccessError• java.lang.InstantiationError• java.lang.NoSuchFieldError• java.lang.NoSuchMethodError

• java.lang.NoClassDefFoundError• java.lang.UnsatisfiedLinkError• java.lang.VerifyError

• java.lang.ThreadDeath• java.lang.VirtualMachineError

• java.lang.InternalError• java.lang.OutOfMemoryError• java.lang.StackOverflowError• java.lang.UnknownError

• java.lang.Exception

• java.lang.CloneNotSupportedException• java.lang.InterruptedException• java.lang.ReflectiveOperationException

• java.lang.ClassNotFoundException• java.lang.IllegalAccessException• java.lang.InstantiationException• java.lang.NoSuchFieldException• java.lang.NoSuchMethodException

• java.lang.RuntimeException • java.lang.ArithmeticException• java.lang.ArrayStoreException• java.lang.ClassCastException• java.lang.EnumConstantNotPresentException• java.lang.IllegalArgumentException

• java.lang.IllegalThreadStateException• java.lang.NumberFormatException

• java.lang.IllegalMonitorStateException• java.lang.IllegalStateException• java.lang.IndexOutOfBoundsException

• java.lang.ArrayIndexOutOfBoundsException• java.lang.StringIndexOutOfBoundsException

• java.lang.NegativeArraySizeException• java.lang.NullPointerException• java.lang.SecurityException• java.lang.TypeNotPresentException• java.lang.UnsupportedOperationException

Page 86: Java Básico Unidad II v2011

Algunas de las Excepciones más comunes

• java.lang.Exception Cualquier error que pueda ser manejado por el programa

• java.lang.ArithmeticException Señala que un error aritmético ha ocurrido, por ejemplo, que se ha tratado de dividir entre cero

• java.lang.NumberFormatException Indica que se ha tratado de convertir un String en un número pero la cadena no se encuentra en el formato correcto

• java.lang.IndexOutOfBoundsException Indica que algún índice (en un String, en un arreglo, en una colección) se encuentra fuera de rango

• java.lang.ArrayIndexOutOfBoundsException Sucede cuando se envía un subindice que sobrepasa el tamaño del arreglo

• java.io.IOException Señala que un error de entrada o salida ha ocurrido, por ejemplo, que un archivo no ha podido ser abierto

• Java.sql.SQLException Indica un error relacionado con el manejo de bases de datos

Page 87: Java Básico Unidad II v2011

Proceso de Manejo de Excepciones

• Cuando un programa encuentra una anomalía que se puede resolver se lanza una excepción que es manejada a través de un bloque de manejo de excepciones

• La sintaxis de la estructura try-catch que se utiliza para el manejo de excepciones es la siguiente:

try {

sentencias;

} catch(tipo_de_excepcion variable) {

sentencias;

} [catch(tipo_de_excepcion variable) {

sentencias;

}…]

[ finally {

sentencias;

}• Si dentro del bloque de sentencias que encierra el try ocurre alguna excepción se tratará de

encontrar un manejador de excepciones (un catch) que sea apropiado para el tipo de excepción, el primero que se encuentre que sea capaz de manejar la excepción será el que se ejecute.

• Se recomienda que los manejadores de los tipos de excepciones más generales se pongan después de los más específicos.

• El bloque finally, cuando se escriba, debe ser el último bloque y contendrá instrucciones que deberán ejecutarse forzosamente, haya o no ocurrido algún error.

Page 88: Java Básico Unidad II v2011

Ejemplo de try-catch

1. Hacer un programa que solicite dos números enteros, un dividendo y un divisor y señale cuando se intente hacer una división entre cero. Los números deberán ser solicitados como String y convertidos luego a tipo int por lo que también se deberá indicar si alguno de los números no tiene el formato correcto.

Page 89: Java Básico Unidad II v2011

Crear, Lanzar, Declarar y Atrapar Excepciones• Se pueden crear excepciones propias creando una clase que extienda a

Exception, de la siguiente forma:public class nombre_excepcion extends Exception {

public nombre_excepcion () {}

public nombre_excepcion (String mensaje) {

super(mensaje);

}

}

• Es posible lanzar excepciones de manera explícita dentro de un programa de la siguiente forma:

throw new tipo_de_excepcion;

• Cuando vayamos a tener un código que lanza una excepción debemos encerrarlo dentro de un try

• Toda excepción que lancemos debemos de atraparla dentro de un bloque catch• Si un método no tiene un bloque catch para manejar por si mismo la excepción

puede devolverla al método que lo mando llamar declarando las excepciones en el encabezado del método de la siguiente forma:public nombre_metodo([lista_parámetros]) throws tipo_excepción[, tipo_excepción…] {

// cuerpo del método

}

• El método que llame al método que tiene un throws deberá estar dentro de un bloque try y tener el catch apropiado para cada tipo de excepción que se maneje.

Page 90: Java Básico Unidad II v2011

Ejemplo de manejo de excepciones1. Hacer un programa para simular votaciones y que contenga un

método para comprobar la edad (se recibe como parámetro la edad del votante y el número de credencial), un método para votar (se recibe como parámetro la opción), un método para desplegar la cantidad de votos por opción, un método para presentar el ganador. Deberá manejar las siguientes excepciones:• Qué el votante sea menor de edad• Qué la credencial no tenga un número valido (que tenga menos o más de 6 dígitos)• Qué se haya seleccionado una opción no válida• Que haya un empate en el ganador

Al principio se señalarán al programa la cantidad de opciones válidas.

Las opciones se señalarán con un número

El programa solicitará votos hasta que se indique que ya se cierra la casilla (opciones posibles votar –en este proceso se verificará los datos del votante- o cerrar casilla), al cerrar la casilla se llamará a los métodos para desplegar los votos por opción y para presentar al ganador.

Page 91: Java Básico Unidad II v2011

Validación• Validar la entrada de datos consiste en establecer las

sentencias de control necesarias para evitar que el usuario ingrese un dato que nos pueda provocar un error de procesamiento.

• La validación de la entrada de datos proporcionada por los usuarios es un importante paso en la recolección de información.

• La validación ayuda a evitar errores de procesamiento debido a que los datos estén incompletos, tengan un formato inapropiado, su valor se encuentre fuera del rango aceptable, etc.

• La validación también puede aplicarse a entradas de datos que obtenemos de archivos, de interfaces de comunicaciones, de dispositivos periféricos, etc.

• Java contiene algunas clases que se aplican a la validación de formularios cuando hacemos aplicaciones de escritorio.

Page 92: Java Básico Unidad II v2011

Ejemplos de validación

1. Hacer un programa que obtenga el total de personas que hay en un grupo, su promedio de edades, la cantidad de hombres y la cantidad de mujeresa) El programa solamente aceptará como válidas edades entre 0 y

110 años

b) Se tienen tres códigos para genero: H (Hombre), M (Mujer) y N (No proporcionado)

2. Hacer un programa que solicite los ID y nombre de un grupo de personas (el máximo de personas en el grupo será de 100), el ID no podrá repetirse. Al final el programa presentará la lista de nombres de personas ordenadas alfabéticamente junto con su ID

Page 93: Java Básico Unidad II v2011

Afirmaciones (Aserciones)

• Se utilizan solamente durante la etapa de desarrollo y depuración de la aplicación para verificar ciertas suposiciones asumidas por el programa.

• Cuando la suposición asumida por el programa no se cumple, la aserción generará un error que provocará la interrupción inmediata del programa.

• Al realizar el despliegue (deployment) de la aplicación todas las aserciones son ignoradas sin necesidad de introducir cambios de código.

• Una instrucción de aserción tiene el siguiente formato:

assert(condición);• Si la condición es false, entonces el programa se interrumpe• Para que se habiliten las aserciones es necesario que el programa se compile

con las aserciones utilizando la opción -source y luego ejecutar el programa habilitando las aserciones con la opción -enableassertions (-ea) de la siguiente forma:

javac –source programa.java

java –enableassertions programa o

java –ea programa

Page 94: Java Básico Unidad II v2011

Ejemplo de Uso de Aserciones1. Realice un programa que simule el enfriador de un equipo de

cómputo, el programa recibirá datos aleatorios de los grados que se eleva la temperatura del equipo (serán números aleatorios entre el 0 y el 5), el enfriador tendrá un acelerador que producirá enfriamiento conforme a lo caliente que se encuentre el equipo, si el equipo se encuentra en menos de 23° el enfriador estará apagado, si el equipo se encuentra entre 23° y 26° el enfriador trabaja a velocidad 1, si el equipo se encuentra entre 27° y 35° el equipo trabaja a velocidad 2, si el equipo está entre 36° y 45° el enfriador estará a velocidad 3, a una temperatura mayor el equipo se apaga (el assert indica que se debe interrumpir el programa). La velocidad establece cuantos grados se bajan por turno. La temperatura al encender el equipo será de 18°.

Page 95: Java Básico Unidad II v2011

Tarea 05: Ejercicios de validación, manejo de excepciones y uso de afirmaciones

1. Hacer un programa para aplicar la siguiente encuesta:1. Qué edad tiene: Solamente se aceptan edades comprendidas entre 1 y 120 años

2. Tiene credencial para votar: Solamente se aceptan las respuestas “SI”, “NO”, “S”, “N”, en el caso de respuesta “SI” o “S” la edad debe ser mayor de 18 años

3. Diga el día, mes y año de su fecha de nacimiento: Solamente se aceptarán valores válidos para los días del mes que señale la persona, el mes deberá ser un entero entre 1 y 12 (enero a diciembre). La fecha deberá ser válida conforme a la edad señalada en la pregunta 1

4. Estudia actualmente: Solamente se aceptan como respuestas válidas “SI”, “NO”, “S”, “N”

5. Sabe leer y escribir: Solamente se aceptan como respuestas válidas “SI”, “Leer”, “Escribir”, “Ninguno”, “N” (Ninguno y N se toman igual)

6. Cuál es el promedio actual en sus estudios: Solamente se aceptan valores enteros entre 1 y 10 y solamente se hará esta pregunta a quienes estudien actualmente

7. Cuántos libros utiliza actualmente para sus estudios: Valores válidos entre 0 y 10 y solamente se hará esta pregunta a quienes estudien actualmente

8. Diga el precio promedio de los libros que utiliza: Valores válidos serán precios mayores a 50 pesos, se aceptan cantidades con centavos

La encuesta se aplicará hasta que el usuario señale que ya no hay más personas (respuestas posibles “SI”, “NO”, “S”, “N”). Al finalizar la encuesta presentar los resultados para cada pregunta y opción

Page 96: Java Básico Unidad II v2011

Tarea 05: Ejercicios de validación, manejo de excepciones y uso de afirmaciones

2. Hacer un programa que maneje hasta cinco cuentas bancarias, el usuario tendrá un menú con el que podrá:

1. Crear una cuenta. Se tendrá un método para crear las cuentas. Se solicitará número de cuenta (que no podrá repetirse), nombre de la persona (qué solamente deberá contener caracteres) y saldo inicial. Un número de cuenta solamente será valido si tiene 6 dígitos. Solamente se acepta crear hasta cinco cuentas en el programa.

2. Depositar una cantidad. El programa utilizará un método que reciba como parámetros el número de cuenta y la cantidad. Un número de cuenta solamente será valido si tiene 6 dígitos. El número de cuenta debe corresponder con una existente. El método regresará el saldo actual.

3. Retirar una cantidad. El programa utilizará un método que reciba como parámetros el número de cuenta, el saldo y la cantidad. Un número de cuenta solamente será valido si tiene 6 dígitos. El número de cuenta debe corresponder con una existente. La cantidad a retirar no debe ser mayor al saldo. El método regresará el saldo actual

4. Consultar el saldo. El programa utilizará un método que reciba como parámetro el número de cuenta. Un número de cuenta solamente será valido si tiene 6 dígitos. El número de cuenta debe corresponder con una existente.

5. Salir del programa

Cualquier caso que no cumpla con las reglas deberá ser manejado mediante excepciones señalando la causa del problema

Page 97: Java Básico Unidad II v2011

Tarea 05: Ejercicios de validación, manejo de excepciones y uso de afirmaciones

3. Hacer un programa que calcule la distancia entre dos coordenadas que proporcionará el usuario, el programa considera que las coordenadas han sido proporcionadas de tal manera que no habrá distancias negativas por lo que si hay una distancia negativa el programa deberá interrumpirse mediante una aserción. El programa también se interrumpirá por una aserción si al calcular la pendiente está debe hacer una división entre cero.

4. Hacer un programa que obtenga el consumo promedio de gasolina de un automóvil, el programa solicitará al usuario la cantidad de litros que se cargan al principio, la cantidad recorrida, la cantidad de litros con que cuenta el auto al final. El programa no validará que el usuario no de una cantidad de litros al final mayor que la que se tenía al principio. El programa lanzará una excepción si el usuario indica que el auto ha recorrido cero kilómetros (pues habría una división entre cero). Mediante una aserción se controlará que el consumo promedio de gasolina resultante no sea menor a 3 km por litro, si fuera así el programa terminará

5. Hacer un programa que solicite números enteros al usuario, el programa solamente aceptará números que sean primos o que pertenezcan a valores que pertenezcan a la secuencia de Fibonacci. El programa solicitará valores hasta que el usuario indique que ya no quiere dar más números. Al final el programa presentará cuantos de los números fueron primos y cuántos pertenecieron a la secuencia de Fibonnacci. Recuerde que un número primo también puede ser parte de la secuencia de Fibonnacci.

Page 98: Java Básico Unidad II v2011

Proyecto de Medio Termino• El proyecto consiste en hacer un programa que simule un “Casino” con los siguientes

juegos:• Juego de Dados “Siete” (http://www.acanomas.com/Reglamentos-Juegos-de-Dados/045/Siete.htm)• Juego de Dados “Klondike” (http://

www.acanomas.com/Reglamentos-Juegos-de-Dados/031/Klondike.htm)• Juego de Cartas Black Jack (http://

www.acanomas.com/Reglamentos-Juegos-de-Naipes/105/Black-Jack.htm)• Juego de Cartas Parejas (http://www.acanomas.com/Reglamentos-Juegos-de-Naipes/286/Parejas.htm)• Ruleta (http://www.acanomas.com/Reglamentos-Juegos-de-Salon/1619/La-Ruleta.htm)

• El jugador podrá seleccionar jugar a cualquier juego, hasta que decida salir del Casino o se haya quedado sin dinero

• Al principio del juego se proporcionará a todos los jugadores (el usuario y los que simule la computadora) una cantidad de dinero igual para todos

• La computadora simulara a dos jugadores• Los jugadores podrán realizar apuestas por montos entre 1 y 100 pesos en cada partida• Al salir el jugador del Casino se indicará quien es el jugador ganador• Todos los detalles que no se contemplen aquí deberán ser resueltos por el equipo • Se deberá hacer manual técnico (que explique cómo se estructura el programa, describa

el código y explique como se instala y usa el programa) y de usuario (que explique al usuario como usar el programa y cuáles son las reglas para cada opción). Los manuales deberán tener portada e índice. En la portada deberán estar los nombres de todos los integrantes del grupo.

• Se dará un punto extra sobre la parte práctica si el programa incluye gráficos.

Page 99: Java Básico Unidad II v2011

Estándares de Codificación

Page 100: Java Básico Unidad II v2011

Estándares Tipográficos de Codificación

• Las palabras múltiples en identificadores se separan con el uso de mayúsculas internas: nombreUsuarioPrincipal

• Los nombres de clases e interfaces comienzan con mayúscula• Paquetes, métodos, atributos y variables locales comienzan con

minúscula• Atributos constantes se nombran todos con mayúscula y las palabras

múltiples se separan con guiones bajos: VELOCIDAD_LUZ• Las llaves que abren aparecen al final de la línea que comienza el

bloque (clase, método o instrucción) • Las llaves que cierran aparecen en una línea separada del cuerpo

que las contienen y están alineadas horizontalmente con el comienzo de la línea que contiene la llave que abre.

• La continuación de una instrucción después de una llave que cierra (else, while, catch, finally) aparece en la misma línea que la llave

• Instrucciones múltiples separadas por punto y coma “;” nunca aparecen en la misma línea

Page 101: Java Básico Unidad II v2011

Estándares Tipográficos de Codificación• Poner espacios a los lados de todos los operadores• No se ponen espacios entre los nombres de los métodos y los

paréntesis de la lista de argumentos• Los espacios nunca aparecen entre dos paréntesis

secuenciales que abren • Los espacios separan cualquier cosa que preceda a un

paréntesis abierto de un grupo encerrado entre paréntesis (excepto los casos anteriores)

• Ningún espacio aparece después de un paréntesis que abre o antes de un paréntesis que cierra

• No debe haber espacio antes de una coma• Un espacio en blanco siempre separa una coma del siguiente

token• Ningún espacio debe aparecer antes o después de un punto

que separa a un objeto del nombre de un método o de un atributo

Page 102: Java Básico Unidad II v2011

Otros estándares tipográficos de codificación

• Escribir código que un buscador pueda localizar fácilmente• Partir las líneas que sean mayores a 80 columnas

(caracteres)• Usar identación de un tamaño de cuatro espacios (o

menos)• Usar líneas en blanco para identificar líneas de código

relacionadas• Usar los paréntesis cuando sean requeridos para facilitar

la lectura del código

Page 103: Java Básico Unidad II v2011

Estándares de Codificación Propuestos por Sun• Estándares de espaciado

• Cada nivel de identación debe ser de cuatro espacios• Los tabuladores se establecen a ocho espacios• No se debe identar: al comenzar comentarios, en las declaraciones de paquetes, en las sentencias

import, en las declaraciones de interfaces (encabezados) y en las declaraciones de clases (encabezados)

• Se debe identar a un nivel (4 espacios): Variables estáticas, variables de instancia, constructores, métodos y sus comentarios respectivos

• Se debe identar en un nivel adicional: Las variables locales, sentencias y comentarios que se encuentren dentro de métodos o de constructores

• Se debe identar en otro nivel adicional: Sentencias y comentarios que se encuentren dentro de bloques. Se debe agregar un nivel de identación por cada nivel de anidamiento.

• Ejemplo:public class Indent {

static int staticVar = 7;

public Indent() { }

public static void main(String [] args) {

int x = 0;

for(int z=0; z<7; z++) {

x = x + z;

if (x < 4) {

x++;

}

}

}

}

Page 104: Java Básico Unidad II v2011

Estándares de Codificación Propuestos por Sun• Longitudes de Línea y División de Líneas

• La longitud de las líneas debe ser de 80 caracteres como máximo (se recomiendan 65)

• Cuando una línea exceda la longitud máxima se recomienda:• Dividir la línea después de una coma• Dividir la línea antes de un operador• Alinear la nueva línea un tabulador después del inicio de la línea que se

dividió• Tratar de no dividir expresiones que se encuentren encerradas entre

paréntesis

• Líneas en Blanco• Se deben usar:

• En medio de métodos y constructores• Después de la última variable de instancia• Dentro de un método entre las variables locales y la primera sentencia• Dentro de un método para separar segmentos lógicos de código• Antes de un comentario

Page 105: Java Básico Unidad II v2011

Estándares de Codificación Propuestos por Sun• Uso de espacios en Blanco

• Los espacios en blanco se utilizan:• Entre los operadores binarios• Después de una coma en una lista de argumentos• Después de las expresiones de una sentencia for• Entre una palabra clave y un paréntesis• Después de un cast

• Uso de llaves• La llave que abre se pone al final de la misma línea de declaración

(encabezado) de las clases, interfaces, constructores y métodos• Las llaves que cierran se ponen en una nueva línea y se identan para

quedar a la altura de la correspondiente declaración• Los bloques de control siempre se encierran entre llaves. • La llave que abre en un bloque de control se pone en la misma línea que

la sentencia y se cierra en una línea nueva identada a la altura de la sentencia de control

Page 106: Java Básico Unidad II v2011

Estándares de Codificación Propuestos por Sun• Comentarios

• Usar comentarios en bloque (/* … */) cuando sea necesario describir aspectos del programa que requieran más de una línea.

• Se recomienda que se siga el siguiente formato para comentarios de bloque:/*

*este comentario de bloque

*puede ocupar varias líneas

*/

• Usar comentarios de línea para descripciones cortas//Comentario de línea sencilla

• Se pueden poner comentarios al final de las sentencias, estos se conocen como: “comentarios de fin de línea”

x = 5; // establece el valor de x en 5

• Si se usan varios comentarios de fin de línea seguidos deberá asegurarse que se encuentren alineados

• Cuando se desee que una porción de código sea ignorada por el compilador se puede comentar cada instrucción como comentario de línea sencilla

• Se deben usar comentarios siempre que el código no sea muy claro• Los comentarios deben proveer resumenes cortos del código que sea complejo

y para revelar información que sería díficil de determinar

Page 107: Java Básico Unidad II v2011

Estándares de Codificación Propuestos por Sun• Declaraciones

• Establecer una secuencia para las declaraciones• Se recomienda ser consistente con la secuencia:

1. Comentarios de las clases

2. Declaración de paquetes

3. Sentencias import

4. Declaración de clases

5. Declaración de variables estáticas

6. Declaración de variables de instancia

7. Constructores

8. Métodos

• Declaraciones dentro de los métodos:• Declarar e inicializar variables locales antes de cualquier sentencia (cuando

sea posible)• Declarar e inicializar variables de bloque antes de cualquier sentencia (cuando

sea posible)• Declarar solamente un miembro por línea• Evitar variables sombra. Es decir, evitar variables locales que tengan el mismo

nombre que variables de instancia

Page 108: Java Básico Unidad II v2011

Estándares de Codificación Propuestos por Sun• Uso de Mayúsculas y Minúsculas

• Nombres de paquetes: Usar nombres en minúsculas siempre que sea posible

• Nombres de clases e interfaces: Utilizar sustantivos, usar mayúscula en la primer letra y al principio de cada otra palabra del identificador

• Nombres de métodos: Utilizar verbos, usar minúscula en la primer letra y mayúscula al principio de cada otra palabra del identificador

• Nombres de variables: usar minúscula en la primer letra y mayúscula al principio de cada otra palabra del identificador. Usar identificadores de una sola letra solamente para variables temporales (como las de los ciclos)

• Nombres de constantes: Deben ser declaradas como static y final. El identificador se escribe todo en mayúsculas y cada palabra se separa con guión bajo

Page 109: Java Básico Unidad II v2011

Tarea 06: Ejercicios usando estándares de codificaciónAl resolver los siguientes problemas deberá aplicar los estándares de codificación propuestos por Sun

1. Hacer un programa que solicite un número entero y regrese su sumatoria, ejemplo la sumatoria de 5 es 5+4+3+2+1=15

2. Hacer un programa que obtenga todos los grupos de 3 factores de un número entero que proporcione el usuario; ejemplo para el número 8: 1x1x8, 1x2x4, 2x1x4, 2x2x2, 2x4x1, 4x1x2, 4x2x1

3. Hacer un programa que obtenga cuantos dígitos contiene un número entero que introduzca el usuario; por ejemplo, si el usuario introduce el número 8124567; el programa regresará un 7, si el usuario ingresa el número 878, el programa regresa un 3

4. Hacer un programa que presente un número entero en su representación en binario

5. Hacer un programa que a partir del radio de un circulo proporcionado por el usuario calcule las áreas de cada uno de los polígonos regulares inscritos de 3 a 359 lados que se puedan formar.

Page 110: Java Básico Unidad II v2011

Manejo de Arreglos

Page 111: Java Básico Unidad II v2011

Concepto de arreglo• Un arreglo (array) es un objeto contenedor que mantiene un

número fijo de valores de un solo tipo. • Los arreglos, también conocidos como vectores (cuando son de

una dimensión) o matrices (por lo general cuando son de dos o más dimensiones) son estructuras homogéneas, compuestas por varios elementos, todos del mismo tipo que se almacenan de manera consecutiva en memoria.

• Se pueden crear arreglos de cualquier tipo y pueden tener una o más dimensiones.

• A cada uno de los elementos (valores) de un arreglo se accede por medio de sus subíndices.

19 43 9 83315 412 2 6459

0 1 2 3 4 5 6 7 8 9 10 11

Longitud (length) = 12

Subíndices

Valores

Page 112: Java Básico Unidad II v2011

Declaración de arreglos• Un arreglo de una dimensión se declara utilizando la

siguiente sintaxis:

tipo nombre[];• Otra forma de declarar un arreglo de una dimensión es:

tipo[] nombre;• Un arreglo de dos dimensiones se declara de la siguiente

forma:

tipo nombre[][];

tipo[][] nombre;• La sintaxis para más dimensiones es la misma, solo hay

que agregar un par de corchetes más para cada dimensión

Page 113: Java Básico Unidad II v2011

Entendiendo las dimensiones

19 43 9 83315 412 2 6459

Este es un arreglo de una dimensión:

6 7 3 9 1 5 8 2 1 7 4 3 6 4 2 1 1 2

Ya que es más fácil de comprender, es más común que un arreglo de dos dimensiones lo representemos como una tabla, en la que la primer dimensión corresponde a las filas y la segunda a las columnas:

Este es un arreglo de dos dimensiones:

6 7 3

9 1 5

8 2 1

7 4 3

6 4 2

1 1 2

0

1

2

3

4

5

0 1 2

arreglo[3][1] tiene un valor de 4Fila

s

Columnas

0 1 2 3 4 5 6 7 8 9 10 11

arreglo[6] tiene un valor de 33

Page 114: Java Básico Unidad II v2011

Entendiendo las dimensionesSi extendemos el concepto a un arreglo de 3 dimensiones:

1 5 7 3 6 2 9 8 4 2 5 7 8 8 3 6 9 1 7 9 6 3 6 1

Otra vez, para entender más fácilmente este concepto algunos representan las matrices como cubos y otros las representan como hojas de matrices, la primera dimensión es el número de hoja, la segunda el número de fila y la tercera el número de columna:

1 5 7

3 6 2

9 8 4

2 5 7

8 8 3

6 9 1

7 9 6

3 6 1

arreglo[2][1][0] tiene un valor de 6

0 1 2 0 1 2 0 1 2 0 1 2

0

1

0

1

0

1

0

1

0 1 2 3

Para conceptualizar cuatro dimensiones podemos imaginar libros de hojas con matrices, si deseamos conceptualizar cinco pensaríamos posiblemente en colecciones de libros, para seis podríamos usar libreros, para siete podríamos usar bibliotecas…

Page 115: Java Básico Unidad II v2011

Construcción de arreglos• Una vez que tenemos declarado un arreglo hay que construirlo,

esto es reservar la memoria necesaria para que el arreglo pueda contener los elementos que requerimos.

• La sintaxis para construir un arreglo de una dimensión es:

nombre = new tipo[tamaño_dimensión];• La sintaxis para construir una arreglo de dos dimensiones sería:

nombre = new tipo[tamaño_dimensión][tamaño_dimensión];• La sintaxis para construir arreglos de más dimensiones es la

misma solamente habrá que agregar un par de corchetes con el tamaño que tendrá cada una de las siguientes dimensiones

• También es posible declarar y construir el arreglo en la misma sentencia, la sintaxis para hacer esto sería:

tipo[] nombre=new tipo[tamaño_dimensión];

O bien:

tipo nombre[]= new tipo[tamaño_dimensión];

Page 116: Java Básico Unidad II v2011

Construcción de arreglos

Un arreglo de una dimensión como el representado en el dibujo anterior que sirviera para guardar números enteros se declararía y se crearía de la siguiente forma:

int arreglo[];arreglo=new int[12];

O en una sola sentencia:int arreglo[]=new int[12];

Un arreglo de dos dimensiones como el representado en el dibujo anterior que sirviera para guardar números reales se declararía y se crearía de la siguiente forma:

float arreglo[][];arreglo=new float[6][3];

O en una sola sentencia:float arreglo[][]=new float[6][3];

Page 117: Java Básico Unidad II v2011

Construcción de arreglos

Un arreglo de tres dimensiones como el representado en el dibujo anterior que sirviera para guardar cadenas de caracteres (Strings) se declararía y se crearía de la siguiente forma:

String arreglo[];arreglo=new String[4][2][3];

También lo podemos hacer en una sola sentencia:String arreglo[][][]=new String[4][2][3];

0 1 2 0 1 2 0 1 2 0 1 2

0

1

0

1

0

1

0

1

0 1 2 3

Page 118: Java Básico Unidad II v2011

Llenado de arreglos• Una vez construido un arreglo podemos llenarlo con

valores, una forma de hacerlo podría ser:19 43 9 83315 412 2 6459

int arreglo = new arreglo[12];arreglo[0]=12;arreglo[1]=15;arreglo[2]=4;arreglo[3]=3;arreglo[4]=19;arreglo[5]=4;arreglo[6]=33;arreglo[7]=9;arreglo[8]=8;arreglo[9]=59;arreglo[10]=2;arreglo[11]=64;

• La forma anterior no es muy eficiente, Java permite usar la siguiente forma si conocemos los valores que deben ir dentro del arreglo:

int arreglo[]={12,15,4,3,19,4,33,9,8,59,2,64};

Page 119: Java Básico Unidad II v2011

Llenado de arreglos• Según lo comentado anteriormente, el arreglo de dos dimensiones de la derecha se

podría llenar así:

int arreglo[][]=new int[6][3];

arreglo[0][0]=6;

arreglo[0][1]=7;

arreglo[0][2]=3;

arreglo[1][0]=9;

arreglo[1][1]=1;

arreglo[1][2]=5;

arreglo[2][0]=8;

arreglo[2][1]=2;

arreglo[2][2]=1;

arreglo[3][0]=7;

arreglo[3][1]=4;

arreglo[3][2]=3;

arreglo[4][0]=6;

arreglo[4][1]=4;

arreglo[4][2]=2;

arreglo[5][0]=1;

arreglo[5][1]=1;

arreglo[5][2]=2;• Pero sería más eficiente llenarlo de la siguiente forma:

int arreglo[][]={{6,7,3}, {9,1,5}, {8,2,1}, {7,4,3}, {6,4,2}, {1,1,2}};• Puede observarse que todo el arreglo está encerrado entre un par de llaves, pero

cada fila a su vez también se encierra entre otro par de llaves.

6 7 3

9 1 5

8 2 1

7 4 3

6 4 2

1 1 2

Page 120: Java Básico Unidad II v2011

Llenado de arreglos

• Una matriz de tres dimensiones se puede llenar de la misma forma: int arreglo[][][]=new int[4][2][3];arreglo[0][0][0]=1;arreglo[0][0][1]=5;arreglo[0][0][2]=7;arreglo[0][1][0]=3;arreglo[0][1][1]=6;arreglo[0][1][2]=2;arreglo[1][0][0]=9;arreglo[1][0][1]=8;

arreglo[1][0][2]=4; arreglo[1][1][0]=2; arreglo[1][1][1]=5; arreglo[1][1][2]=7; arreglo[2][0][0]=8; arreglo[2][0][1]=8; arreglo[2][0][2]=3; arreglo[2][1][0]=6; arreglo[2][1][1]=9;

arreglo[2][1][2]=1;arreglo[3][0][0]=7;arreglo[3][0][1]=9;arreglo[3][0][2]=6;arreglo[3][1][0]=3;arreglo[3][1][1]=6;arreglo[3][1][2]=1;

• O bien:int arreglo[ ][ ][ ]={{{1,5,7}, {3,6,2}}, {{9,8,4}, {2,5,7}}, {{8,8,3}, {6,9,1}}, {{7,9,6}, {3,6,1}}};

Page 121: Java Básico Unidad II v2011

Llenado de arreglos• Cuando no conocemos los valores con los que hay que llenar

un arreglo normalmente le solicitaremos al usuario que los ingrese, por lo general esto lo hacemos con un ciclo for (aunque puede hacerse con otros tipos de ciclo o fuera de ellos).

• El siguiente código ejemplifica como se realiza este llenado:

Scanner teclado=new Scanner(System.in);int edades[]=new int[10];System.out.println(Proporcione las edades de 10 personas);for (int i=0; i<10; i++) {

System.out.print(“Edad de la persona “+(i+1)+”: “;edades[i]=teclado.nextInt();

}

65 903 19 236 128 74

4 53 7 81 20 96i=

4

Page 122: Java Básico Unidad II v2011

Llenado de arreglos• El siguiente ejemplo muestra como podemos solicitar datos al

usuario para llenar un arreglo de dos dimensiones:Scanner teclado=new Scanner(System.in);float calificaciones[]=new float[4][3];System.out.println(Proporcione las 3 calificaciones de 4 alumnos);for (int i=0; i<4; i++) {

System.out.print(“Calificaciones del alumno “+(i+1)+”: “;for (int j=0; j<3; j++) {

System.out.print(“Calificación “+j+” de alumno “+i” :”);calificaciones[ i ][ j ]=teclado.nextFloat();

}}

9 7.5 8

8.5 10 9

7.5 8.5 10

9 9.5 9.5

0

1

2

3

0 1 2

Page 123: Java Básico Unidad II v2011

Aspectos que hacen diferentes a los arreglos multidimensionales en Java

• En Java los arreglos multidimensionales son arreglos de arreglos.

• Es posible declarar arreglos multidimensionales e inicialmente reservar memoria solo para la primera dimensión

• También es posible que cada uno de los elementos de las siguientes dimensiones tenga un tamaño diferente. Ejemplo:

int arreglo[][] = new int[5][];

arreglo[0]=new int[1];

arreglo[1]=new int[2];

arreglo[2]=new int[3];

arreglo[3]=new int[2];

arreglo[4]=new int[1];

Page 124: Java Básico Unidad II v2011

Atributos y métodos de los arreglos• Los arreglos tienen algunos atributos y métodos que pueden ser

de utilidad:• length Devuelve un valor entero con el tamaño del arreglo• clone() Devuelve una copia del arreglo• equals(arreglo) Devuelve un valor true si el arreglo es igual al

pasado como parámetro

• Así mismo, Java contiene una clase estática llamada Arrays que contiene algunos métodos para manejar arreglos, entre los que destacan:• sort(arreglo) Ordena el arreglo que se pase como parámetro• binarySearch(arreglo, valor) Busca un valor en un arreglo y regresa el

subíndice donde se encuentra. El arreglo debe estar ordenado• fill(arreglo, valor) Llena un arreglo con el valor que se especifique

Page 125: Java Básico Unidad II v2011

Uso de arreglos en los métodos• Un método puede recibir un arreglo como argumento en su línea de parámetros.• Un ejemplo de la sintaxis del encabezado de un método para recibir un arreglo como

parametro sería:

public int sumatoria(int arreglo[])• La llamada al método podría ser algo similar al siguiente:

int resultado=objeto.sumatoria(miArreglo);• Se debe notar que al pasar el arreglo como argumento solamente se escribe el nombre del

arreglo• Un método puede devolver un arreglo como resultado, esto se puede hacer de una forma

similar a la siguiente:• En el encabezado del arreglo definimos que se regresa un arreglo:

float[] regresaArreglo();• Y el arreglo se regresa en el return de la siguiente forma:

return arreglo;• Para recibir el arreglo, la llamada al método se haría de la siguiente forma:

int[] arregloResultante;

arregloResultante=objeto.metodoDevuelveArreglo();• Nota: Hay que tener cuidado, si pasamos un arreglo como argumento estamos haciendo un

paso de valores por referencia por lo que si modificamos el valor de alguno de sus elementos en el método el valor quedará modificado aún cuando regresemos del método, a diferencia de lo que pasaría con una variable de tipo primitivo pasada como parámetro.

Page 126: Java Básico Unidad II v2011

Uso de los valores que se pasan como argumentos a un programa

• Como se ha visto, todos los programas de consola declaran en la lista de parámetros de su método main un arreglo de tipo String, para recordar:

public static void main(String[] args) {

//sentencias

}• Este arreglo permite que el programa pueda recibir valores desde el sistema

operativo cuando es llamado• Para pasar los valores al arreglo, simplemente se pasa una lista de valores

separados por espacios después del nombre del programa cuando se manda a ejecutar, ejemplo:

java nombrePrograma valor1 valor2 valor3 valor4• En el interior del método main el arreglo definido en la lista de parametros (al

que normalmente le ponemos el nombre args) podemos acceder a los valores en el orden en que hayan sido escritos, así args[0] almacena valor1, args[2] almacena valor2, etc.

• La longitud del arreglo (cantidad de casillas) será igual a la cantidad de valores que se hayan pasado como argumentos al programa (en el caso del ejemplo de esta lámina la longitud sería de 4)

Page 127: Java Básico Unidad II v2011

Ejemplos de uso de arreglos1. Una empresa de investigación de precios revisó en varios negocios el precio de

un producto obteniendo los siguientes resultados: 15.50, 18.40, 19.60, 17.50, 16.60, 18.90, 16.50, 14.00, 15.80, 17.20, 16.00, 15.00. Hacer un programa que tenga métodos para obtener: el precio promedio, el precio más bajo y el precio más alto.

2. Hacer un programa que solicite a un grupo de 5 personas su nombre, su estatura y su peso y calcule para cada uno su índice de masa corporal (indice_masa_corporal = peso_kg / estatura_metros2). El programa deberá presentar para cada uno su nombre, su masa, índice de masa corporal, su tipo de peso y en su caso su tipo de obesidad. Para ello se tienen las siguientes tablas: Resultados del IMC Tipo de Peso

Por debajo de 18.0 Peso menor que el normal18.1 - 24.9 Normal25.0 - 29.9 Sobrepeso30.0 ó más Obesidad

Resultados del IMC Tipo de Obesidad

30.0 - 34.9 Tipo I

35.0 - 39.9 Tipo II

Mayor que 40.0 Tipo III (Extrema)

Page 128: Java Básico Unidad II v2011

Ejemplos de uso de arreglos3. Hacer un programa que genere matrices como las

siguientes en forma de triángulo:

4. Una empresa encuestadora desea un programa para preguntar a 10 estudiantes de la carrera de LITC en cada una de 5 universidades (1. UAA, 2. ITA, 3. Tec, 4. Bonaterra, 5. UVM) cuál es su lenguaje de programación favorito entre cinco opciones numeradas del 1 al 5 (1. C#, 2. Java, 3. PHP, 4. Perl y 5. Otro). El programa debe preguntar a cada estudiante su opción y obtener cuál es el lenguaje favorito en cada universidad y luego cuál es el lenguaje favorito para todas las universidades.

1

1 2

1 2 3

1 2 3 4

1 2 3 4 5

1

2 1

3 2 1

4 3 2 1

5 4 3 2 1

5

4 4

3 3 3

2 2 2 2

1 1 1 1 1

Page 129: Java Básico Unidad II v2011

Ejemplos de uso de arreglos5. Hacer un programa que genere dos matrices. Las longitudes

de las dos dimensiones de cada matriz son iguales y se solicitan al usuario. Luego se solicitan al usuario los valores para llenar cada matriz. El programa debe contener un método que permita decir cuál de las dos matrices tiene un mayor valor (que la suma de todos sus valores sea mayor a la de la otra). También debe tener otro método para obtener una tercera matriz con la suma de los valores de ambas matrices (que se pasarán como parámetros).

6. Hacer un programa que reciba como parámetros desde la línea de comandos una lista de valores y presente cuáles de ellos son enteros y cuáles son reales. Nota: Solo se tomará como número real aquel que tenga un valor mayor a cero después del punto decimal.

Page 130: Java Básico Unidad II v2011

Tarea 07: Uso de arreglos1. Hacer un programa que solicite al usuario 10 números enteros e

indique cuántas veces aparece cada uno de los números contenidos en el arreglo. Ejemplo si se tuviera 4,5,7,18,3,5,2,4,7,9 el programa diría el 2 aparece 1 vez, el 3 aparece 1 vez, el 4 aparece 2 veces, el 5 aparece 1 vez, el 7 aparece 2 veces, el 9 aparece 1 vez, el 18 aparece 1 vez

2. Hacer un programa que solicite 15 pares de números y que luego indique para cuantos pares la suma de sus dos valores es menor al promedio obtenido de los 30 números solicitados.

3. Hacer un programa que solicite una cantidad de coordenadas al usuario, luego solicitará cada coordenada y le asignará una letra (a la primera la ‘A’, a la segunda la ‘B’, etc.). El programa obtendrá la distancia entre cada par de coordenadas y luego presentará cuál sería la ruta más corta para recorrer todas las coordenadas

Page 131: Java Básico Unidad II v2011

Tarea 07: Uso de arreglos4. Hacer un programa que solicite al usuario la cantidad de filas y columnas

de una matriz (la matriz tendrá el mismo número de filas que de columnas) y luego solicite valores para cada una de sus celdas. Luego el programa calculará: El valor de la suma de todas las celdas, el valor de la suma de cada fila, el valor de la suma de cada columna y el valor de cada una de sus dos diagonales

5. Hacer un programa que solicite al usuario cuántas filas y cuantas columnas tiene una matriz y la llene de manera automática en espiral (la matriz deberá llenarse conforme al orden ascendente de los números). Ejemplo:

1 2 3 4 5 6 7 8

26 27 28 29 30 31 32 9

25 44 45 46 47 48 33 10

24 43 54 55 56 49 34 11

23 42 53 52 51 50 35 12

22 41 40 39 38 37 36 13

21 20 19 18 17 16 15 14

Page 132: Java Básico Unidad II v2011

Manejo de Cadenas

Page 133: Java Básico Unidad II v2011

Manejo de Cadenas en Java• Una cadena de caracteres es una secuencia ordenada de longitud arbitraria de

elementos que pertenecen a un alfabeto. • En lo general una cadena de caracteres es una secuencia de letras, dígitos,

signos y otros símbolos• En Java las cadenas de caracteres no representan un tipo primitivo, sino que son

objetos de la clase java.lang.String• Los objetos de la clase String son inmutables, esto es, una vez creado un objeto

String no se puede modificar y como es final ninguna clase puede heredarla• Para crear un objeto de la clase String seguimos la misma sintaxis que para

declarar e instanciar un objeto de cualquier otra clase:• String cadena;• cadena = new String();

• Al instanciar podemos pasar un valor a la variable String como parámetro en su constructor:• String cadena = new String(“Texto de la cadena”);

• O incluso igualarla a un valor como si fuera una variable de tipo primitivo:• String cadena=“Texto de la cadena”;

• Podemos hacer uso del operador + para concatenar cadenas, por ejemplo:• String cadena2 = cadena + “ generada en Java”;• En este caso cadena2 contendrá: “Texto de la cadena generada en Java”

Page 134: Java Básico Unidad II v2011

Manejo de Cadenas como Objetos• La implementación de cadenas como objetos le permite a

Java proporcionar un conjunto completo de operaciones que facilitan su manejo

• La clase String tiene varios constructores, por ejemplo:

String()

String(String cadena)

String(char[] arreglo)

String(char[] arreglo, int inicio, int cantidad)

String(byte[] arreglo, byte tablaUnicode)

String(byte[] arreglo, byte tablaUnicode, int inicio, int cantidad)

String(StringBuffer cadena)

• Los dos primeros son los más comunes

Page 135: Java Básico Unidad II v2011

Métodos de la clase StringMétodo Uso

String toString() Devuelve al objeto convertido a String

String concat(String cadena) Concatena a la cadena objeto la cadena que se pasa como argumento

boolean equals(String cadena) Devuelve true si la cadena objeto es igual a la cadena que se pasa como argumento

boolean equalsIgnoreCase(String cadena)

Devuelve true si la cadena objeto es igual a la cadena que se pasa como argumento, ignorando mayúsculas y minúsculas

int compareTo(String cadena) Compara dos cadenas (la del objeto y la pasada como argumento) y devuelve:<0 si la cadena es menor a la que se pasa como argumento=0 si la cadena es igual a la que se pasa como argumento>0 si la cadena es mayor a la que se pasa como argumento

int compareToIgnoreCase(String cadena)

Compara dos cadenas (la del objeto y la pasada como argumento) ignorando mayúsculas y minúsculas y devuelve:<0 si la cadena es menor a la que se pasa como argumento=0 si la cadena es igual a la que se pasa como argumento>0 si la cadena es mayor a la que se pasa como argumento

Page 136: Java Básico Unidad II v2011

Métodos de la clase StringMétodo Uso

int length() Devuelve la longitud de la cadena

String toLowerCase() Convierte la cadena a minúsculas

String toUpperCase() Convierte la cadena a mayúsculas

String trim() Elimina los espacios en blanco que existan al principio o al final de la cadena

boolean startsWith(String cadena) Devuelve true si la cadena objeto inicia con la que se pasa como argumento

boolean endsWith(String cadena) Devuelve true si la cadena objeto finaliza con la que se pasa como argumento

String substring(int inicio, int final) Devuelve un String con la porción de la cadena que comience en la posición inicial y termine en la posición final - 1. Las posiciones se cuentan desde 0

String substring(int inicio) Devuelve un String con la porción de la cadena que comience desde la posición inicial hasta el final de la cadena

char charAt(int posición) Devuelve el carácter que se encuentre en la posición indicada como argumento

Page 137: Java Básico Unidad II v2011

Métodos de la clase StringMétodo Uso

int indexOf(int letra) Devuelve la posición de la primera ocurrencia de la letra que se pasa como argumento. Si no la encuentra regresa -1

int indexOf(String cadena) Devuelve la posición de la primera ocurrencia de la cadena pasada como argumento. Si no la encuentra regresa -1

int lastIndexOf(int letra) Devuelve la posición de la última ocurrencia de la letra que se pasa como argumento. Si no la encuentra regresa -1

int lastIndexOf(String cadena) Devuelve la posición de la última ocurrencia de la cadena pasada como argumento. Si no la encuentra regresa -1

String replace (char viejo, char nuevo) Reemplaza todas las ocurrencias del viejo carácter por el nuevo carácter

String replaceAll(String vieja, String nueva) Reemplaza todas las ocurrencias de la cadena vieja por la nueva

String replaceFirst(String vieja, String nueva)

Reemplaza la primera ocurrencia de la cadena vieja por la nueva

Page 138: Java Básico Unidad II v2011

Métodos de la clase StringMétodo Uso

String valueOf(tipoReferencia objeto) Regresa la representación en String del objeto pasado como argumento

String valueOf(tipoPrimitivo valor) Convierte el valor de tipo primitivo pasado como argumento a String

String valueOf(char[] arreglo) Convierte el arreglo de caracteres a String

String valueOf(char[] arreglo, int inicio, int cantidad)

Convierte la porción del arreglo de caracteres a partir de la casilla indicada por inicio tantos caracteres como los indicados por cantidad a String

String copyValueOf(char[] arreglo) Convierte el arreglo de caracteres a un String

String copyValueOf(char[] arreglo, int inicio, int cuantos)

Convierte la cantidad de casillas del arreglo de caracteres que se especifiquen con cuantos desde el subíndice especificado en inicio

Byte[ ] getBytes() Devuelve la cadena convertida a un arreglo de bytes

Byte[ ] getBytes(String tabla) Devuelve la cadena convertida a un arreglo de bytes codificados usando la tabla de caracteres especificada

Page 139: Java Básico Unidad II v2011

Métodos de la clase StringMétodo Uso

void getChars(int inicio, int fin, char[] arreglo, int inicioDestino)

Copia la cadena convertida a un arreglo de caracteres que se pasa como argumento desde la posición inicio. Inicio y fin marcan la porción de la cadena a convertir

char[] toCharArray() Devuelve un arreglo de caracteres de la cadena objeto

int hashCode() Devuelve un código hash para la cadena

contentEquals(StringBuffer cadena) Devuelve verdadero si la cadena objeto es igual a la cadena StringBuffer que se pasa como argumento

String intern() Devuelve la representación canónica (reducida a su forma más simple) de la cadena

boolean matches(String expresion) Devuelve true si la cadena cumple con la expresión regular pasada como argumento

boolean regionMatches(int inicio, String subCadena, int inicioSubcadena, int cuantos)

Devuelve true si la cadena objeto a partir de la posición inicio es igual a la porción del argumento subCadena especificado por inicioSubcadena y cuantos

Page 140: Java Básico Unidad II v2011

Métodos de la clase StringMétodo Uso

boolean regionMatches(boolean mayúsculas, int inicio, String subCadena, int inicioSubcadena, int cuantos)

Devuelve true si la cadena objeto a partir de la posición inicio es igual a la porción del argumento subCadena especificado por inicioSubcadena y cuantos. Si mayúsculas es true se ignoran mayúsculas y minúsculas

String[] split(String expresión) Divide la cadena utilizando como referencia la expresión y devuelve cada porción en una casilla de un arreglo de Strings

String[] split(String expresión, int limite) Divide la cadena utilizando como referencia la expresión y devuelve cada porción en una casilla de un arreglo de Strings. Limite indica el máximo de casillas a generar

String subSequence(int inicio, int fin) Devuelve una subcadena delimitada por inicio y fin

Page 141: Java Básico Unidad II v2011

Ejemplos de uso de los métodos de la clase String• Realizar un programa que muestre un menú con cada uno

de los métodos de la clase String vistos anteriormente y muestre su funcionalidad cuando sean seleccionados.

Page 142: Java Básico Unidad II v2011

• package manejocadenas;• import java.util.Scanner;

• public class ManejoCadenas {• public static void main(String[] args) {• Scanner teclado=new Scanner(System.in);• String cadena="", cadena2="", cadenaReemplazo="", resultado="", continuar;• StringBuffer cadenaBuffer; • int inicio, fin,cantidad, inicioSubcadena; • char opcion=' ', letra=' ', reemplazo=' '; • char arregloChar[];• byte arregloBytes[];• String arregloStrings[];• do { • System.out.println("A. Obtener longitud [método length()]");• System.out.println("B. Concatenar [método concat()]");• System.out.println("C. Comparar [métodos equals(), equalsIgnoreCase(), compareTo() y compareToIgnoreCase()]");• System.out.println("D. Convertir a mayúsculas/minúsculas [métodos toUpperCase() y toLowerCase()]");• System.out.println("E. Eliminar espacios al inicio y fin [método trim()]");• System.out.println("F. Ver si inicia/termina una cadena [métodos startsWith(), endsWith(), indexOf()");• System.out.println("G. Obtener una porción de una cadena [métodos substring() y subsequence()]");• System.out.println("H. Obtener un carácter [método charAt()]");• System.out.println("I. Localizar una cadena [métodos IndexOf() y LastIndexOf()]");• System.out.println("J. Reemplazar letras [método replace()]");• System.out.println("K. Reemplazar cadenas [métodos replaceAll() y replaceFirst()]");• System.out.println("L. Convertir un arreglo de caracteres [métodos valueOf() y copyValueOf()]");• System.out.println("M. Convertir a arreglo de bytes [método getBytes() ");• System.out.println("N: Convertir a arreglo de chars [métodos getChars() y toCharArray()]");• System.out.println("O. Obtener un código hash de la cadena [método hashCode()]");• System.out.println("P. Comparar con cadena StringBuffer [método contentEquals()]");• System.out.println("Q. Obtener la representación canónica [método intern()]");• System.out.println("R. Comprobar subcadena/expresión [método matches() y regionMatches()]");• System.out.println("S. Partir una cadena [método split()]");• System.out.println("T. Terminar");• System.out.print("¿Qué desea hacer (opcion)? "); • opcion=teclado.next().toUpperCase().charAt(0);

Page 143: Java Básico Unidad II v2011

• if ((opcion!='T') && (opcion!='L')) {• System.out.print("Proporcione una cadena de texto: ");• if (teclado.hasNext())• teclado.nextLine();• cadena=teclado.nextLine(); • }• switch (opcion) {• case 'A': • System.out.println("Longitud: "+cadena.length());• break; • case 'B':• System.out.print("Proporcione la cadena a concatenar: "); • cadena2=teclado.nextLine();• resultado=cadena.concat(cadena2);• System.out.println("Cadena resultante: "+resultado); • break;•

Page 144: Java Básico Unidad II v2011

• case 'C':• System.out.print("Proporcione la cadena a comparar: "); • cadena2=teclado.nextLine();• if (cadena.equals(cadena2))• System.out.println("Conforme al método equals() las cadenas son iguales"); • else• System.out.println("Conforme al método equals() las cadenas son diferentes"); • if (cadena.equalsIgnoreCase(cadena2))• System.out.println("Conforme al método equalsIgnoreCase() las cadenas son iguales"); • else• System.out.println("Conforme al método equalsIgnoreCase() las cadenas son diferentes"); • if (cadena.compareTo(cadena2)>0)• System.out.println("Conforme al método compareTo '"+cadena+"' es mayor que '"+cadena2+"'");• else if (cadena.compareTo(cadena2)<0)• System.out.println("Conforme al método compareTo '"+cadena+"' es menor que '"+cadena2+"'");• else • System.out.println("Conforme al método compareTo '"+cadena+"' es igual que '"+cadena2+"'"); • if (cadena.compareToIgnoreCase(cadena2)>0)• System.out.println("Conforme al método compareToIgnoreCase '"+cadena+"' es mayor que

'"+cadena2+"'");• else if (cadena.compareToIgnoreCase(cadena2)<0)• System.out.println("Conforme al método compareToIgnoreCase '"+cadena+"' es menor que

'"+cadena2+"'");• else • System.out.println("Conforme al método compareToIgnoreCase '"+cadena+"' es igual que '"+cadena2+"'");

• break; •

Page 145: Java Básico Unidad II v2011

• case 'D':• resultado=cadena.toUpperCase();• System.out.println("La cadena convertida a mayúsculas usando toUpperCase() es: "+resultado);• resultado=cadena.toLowerCase();• System.out.println("La cadena convertida a mayúsculas usando toLowerCase() es: "+resultado);• break;• case 'E':• resultado=cadena.trim();• System.out.println ("La cadena '"+cadena+"' sin espacios es: '"+resultado+"'");• break;• case 'F':• System.out.print("Proporcione la cadena a localizar: "); • cadena2=teclado.nextLine();• if (cadena.startsWith(cadena2))• System.out.println("'"+cadena+"' comienza con: '"+cadena2+"'");• else• System.out.println("'"+cadena+"' no comienza con: '"+cadena2+"'");• if (cadena.endsWith(cadena2))• System.out.println("'"+cadena+"' termina con: '"+cadena2+"'");• else• System.out.println("'"+cadena+"' no termina con: '"+cadena2+"'");• break;• case 'G':• System.out.print("Posición inicial (contando desde 0): ");• inicio=teclado.nextInt();• System.out.print(• "Posición final (contando desde 0, recuerde que se toma hasta la posición final -1): ");• fin=teclado.nextInt();• resultado=cadena.substring(inicio, fin);• System.out.println("Cadena resultante al aplicar el método substring(): "+resultado);• resultado=(String) cadena.subSequence(inicio, fin);• System.out.println("Cadena resultante al aplicar el método subSequence(): "+resultado);• break;

Page 146: Java Básico Unidad II v2011

• case 'H':• System.out.print("Posición del carácter (contando desde 0): ");• inicio=teclado.nextInt();• letra=cadena.charAt(inicio);• System.out.println("Carácter extraido: '"+letra+"'");• break;• case 'I':• System.out.print("Proporcione la cadena a localizar: "); • cadena2=teclado.nextLine();• inicio=cadena.indexOf(cadena2);• if (inicio>=0)• System.out.println("La primera aparición de la cadena: '"• +cadena2• +"' es a partir de la posición "• +inicio+" en '"+cadena+"' (uso de indexOf())");• else• System.out.println("La cadena '"+cadena2• +" no se encuentra en '"+cadena+"'");• fin=cadena.lastIndexOf(cadena2);• if (fin>=0)• System.out.println("La última aparición de la cadena: '"• +cadena2• +"' es a partir de la posición "• +fin+" en '"+cadena+"' (uso de lastIndexOf())");• else• System.out.println("La cadena '"+cadena2• +" no se encuentra en '"+cadena+"'");• break;•

Page 147: Java Básico Unidad II v2011

• case 'J':• System.out.print("Letra a reemplazar: ");• letra=teclado.next().charAt(0);• System.out.print("Reemplazar por: ");• reemplazo=teclado.next().charAt(0);• resultado=cadena.replace(letra, reemplazo);• System.out.println("Nueva cadena: "+resultado);• break;• case 'K':• System.out.print("Proporcione la porción de cadena a reemplazar: "); • cadena2=teclado.nextLine(); • System.out.print("Reemplazar por: "); • cadenaReemplazo=teclado.nextLine();• resultado=cadena.replaceAll(cadena2, cadenaReemplazo);• System.out.println("Resultado al aplicar replaceAll(): "+resultado);• resultado=cadena.replaceFirst(cadena2, cadenaReemplazo);• System.out.println("Resultado al aplicar replaceFirst(): "+resultado);• break;• case 'L':• System.out.print("Longitud del arreglo: ");• cantidad=teclado.nextInt();• arregloChar=new char[cantidad];• System.out.println("Llenado del arreglo: ");• for (int i=0; i<cantidad; i++) {• System.out.print("Valor para la casilla "+i+": ");• arregloChar[i]=teclado.next().charAt(0);• }• resultado=String.valueOf(arregloChar);• System.out.println("Cadena resultante al aplicar valueOf(): "+resultado);• resultado=String.copyValueOf(arregloChar);• System.out.println("Cadena resultante al aplicar copyValueOf: "+resultado);• break;

Page 148: Java Básico Unidad II v2011

• case 'M':• arregloBytes=cadena.getBytes();• System.out.println("Arreglo de bytes resultante: ");• for (byte elemento:arregloBytes)• System.out.print(elemento+"\t");• System.out.println();• break;• case 'N':• arregloChar=new char[cadena.length()];• cadena.getChars(0, cadena.length(), arregloChar, 0);• System.out.println("Arreglo de caracteres resultante al aplicar getChars():");• for (char caracter:arregloChar)• System.out.print(caracter+"\t");• System.out.println("");• arregloChar=cadena.toCharArray();• System.out.println("Arreglo de caracteres resultante al aplicar toCharArray():");• for (char caracter:arregloChar)• System.out.print(caracter+"\t");• System.out.println("");• break;• case 'O':• inicio=cadena.hashCode();• System.out.println("El código hash resultante es: "+inicio);• break;• case 'P':• System.out.print("Proporcione la cadena para el objeto StringBuffer: "); • cadenaBuffer=new StringBuffer(teclado.nextLine());• if (cadena.contentEquals(cadenaBuffer))• System.out.println("Ambas cadenas son iguales");• else• System.out.println("Las cadenas son diferentes");• break;

Page 149: Java Básico Unidad II v2011

• case 'Q':• resultado=cadena.intern();• System.out.println("Representación canónica de la cadena: "+resultado);• break; • case 'R':• System.out.print("Proporcione la subcadena/expresión: "); • cadena2=teclado.nextLine(); • if (cadena.matches(cadena2)) • System.out.println("La cadena no equivale a la subcadena conforme al método matches()");• else• System.out.println("La cadena no equivale a la subcadena conforme al método matches()"); • System.out.print("Proporcione la posición de búsqueda en la cadena: ");• inicio=teclado.nextInt();• System.out.print("Proporcione la posición de inicio de la subcadena: ");• inicioSubcadena=teclado.nextInt();• System.out.print("Proporcione la cantidad de caracteres de la subcadena: ");• cantidad=teclado.nextInt();• if (cadena.regionMatches(inicio, cadena2, inicioSubcadena, cantidad)) • System.out.println("La porción de la subcadena si se encuentra en la cadena conforme al método

regionMatches()");• else• System.out.println("La porción de la subcadena no se encuentra en la posición de la cadena indicada conforme al

método regionMatches()"); • break;

Page 150: Java Básico Unidad II v2011

• case 'S':• System.out.print("Proporcione el delimitador: "); • cadena2=teclado.nextLine();• arregloStrings=cadena.split(cadena2);• System.out.println("Arreglo resultante: ");• for (String elemento:arregloStrings)• System.out.println(elemento);• break;• case 'T': • System.out.println("Gracias por usar este programa");• break; • default:• System.out.println("Opción no válida");• break;• }• if (opcion!='T') {• System.out.print("Pulse <C> para continuar"); • do {• continuar=teclado.next();• } while (!continuar.toUpperCase().equals("C")); • teclado.reset(); • } • } while (opcion!='T');• }• }

Page 151: Java Básico Unidad II v2011

Conversión de Cadenas a Números• Para convertir un número a String sabemos que solamente hay que usar el método

valueOf() de la clase String, pasando como argumento el valor a convertir

• Sin embargo, para convertir un String a un tipo primitivo debemos hacer uso de las diferentes clases que envuelven los tipos primitivos de Java

• Java contiene las siguientes clases que envuelven a tipos primitivos:Clase Tipo Primitivo que

envuelve

Método usado para convertir un String a

número

Ejemplo

Byte byte parseByte() numeroByte=Byte.parseByte(“100”);

char No lo hay

Short short parseShort(); numeroShort=Short.parseShort(“1234”);

Integer int parseInt(); numeroInt=Integer.parseInt(“12345”);

Long long parseLong(); numeroLong=Long.parseLong(“123456”);

Float float parseFloat(); numeroFloat=Float.parseFloat(“123.45”);

Double double parseDouble(); numeroDouble=Double.parseDouble(“1234.567”);

boolean No lo hay

• En cualquier caso, si el método parse se encuentra con una cadena que no representa un número válido correspondiente al tipo primitivo que envuelve el objeto se generará una excepción NumberFormatException

Page 152: Java Básico Unidad II v2011

Conversión de Cadenas a Números• Otra alternativa para convertir cadenas a números es utilizando los métodos value de cada una de las

clases mencionadas:

Clase Tipo Primitivo que

envuelve

Método usado para convertir un String a

número

Ejemplo

Byte byte byteValue() Byte objetoByte=new Byte(“100”);numeroByte=objetoByte.byteValue();

char No lo hay

Short short shortValue(); Short objetoShort=new Short(“1234”);numeroShort=objetoShort.shortValue();

Integer int intValue(); Integer objetoInteger=new Integer(“12345”);numeroInt=objetoInteger.intValue();

Long long longValue(); Long objetoLong=new Long(“123456”);numeroLong=objetoLong.longValue();

Float float floatValue(); Float objetoFloat=new Float(“123.45”);numeroFloat=objetoFloat.floatValue();

Double double doubleValue(); Double objetoDouble=new Double(“1234.567”);numeroDouble=objetoDouble.doubleValue();

boolean No lo hay

• Todos los métodos value presentados se encuentran disponibles para cada una de las clases (por ejemplo la clase Double contiene todos los métodos byteValue, shortValue(), intValue(), longValue(), floatValue y doubleValue()); sin embargo, se debe tener cuidado porque se puede generar una excepción (del tipo NumberFormatException) si un objeto de una cierta clase es de menor precisión que el número que se le quiere asignar.

Page 153: Java Básico Unidad II v2011

Ejemplos de uso de Strings

1. Hacer un programa que solicite un texto y cuente cuántas letras tiene de cada una, por ejemplo: “La casa blanca”, tiene A:5, B:1, C:2, L:2, N:1, S:1

2. Hacer un programa que solicite un número y lo convierta a una cadena String con su representación en binario. Ejemplo 67 queda como 1000011

Page 154: Java Básico Unidad II v2011

Tarea 08: Manejo de Strings1. Hacer un programa que solicite una cadena de texto y que cuente cuántas veces aparece cada una de las

palabras que contiene. Por ejemplo: En primavera el castor y el conejo corren en el prado; en:2, primavera:1, el:3, castor:1, y:1, conejo:1, corren:1 prado:1

2. Hacer un programa que solicite un número entero entre el 1 y 1’000’000’000’000 y lo presente con palabras. Ejemplo 456 quedará como “cuatrocientos cincuenta y seis”

3. Hacer un programa que solicite un número entre el 1 y el 3499 y lo convierta a número romano. Si el usuario en vez de ingresar el número expresado en números ingresa el número en formato romano deberá entonces decir que valor representa. Ejemplos: si el usuario ingresa 246 el programa devuelve CCXLVI, si el usuario ingresa DCLXVII el programa devuelve 667

4. Hacer un programa que solicite un texto y lo convierta a código morse para mandarla por telegrama. Luego el programa deberá calcular el costo del telegrama tomando en cuenta que el servicio base cuesta $5.00, cada palabra se cobra a razón de $0.20 por letra para las primeras 20 palabras, de la palabra 21 a la 50 cada letra se cobra en $0.15, para las palabras de la 51 en delante las letras se cobran a $0.10. Las palabras se delimitan por espacios, por signos de puntuación o ambos. Ni los signos de puntuación, ni los espacios se cobran. No olvide presentar además del costo del telegrama el texto convertido a código morse.

5. Hacer un programa que solicite para una cantidad N de productos su nombre, marca y precio y los presente ordenados por marca y luego por nombre junto con su precio. Así aparecerán ordenados primero todos los productos de una marca en orden alfabético conforme a su nombre, luego los de la siguiente marca, etc. Ejemplo de un resultado sería:Calmex, Atún, $10.00Calmex, Sardinas, $15.00Calmex, Pulpo, $20.00Costeña, Chiles Jalapeños, $8.00Costeña, Chiles Serranos, $8.00Herdez, Elote, $12.00etc...

Page 155: Java Básico Unidad II v2011

Tarea 08: Manejo de Strings6. Hacer un programa que determine cuántos diptongos (2 vocales seguidas) y triptongos (3

vocales seguidas) contiene una frase que introduzca el usuario

7. Hacer un programa que solicite una frase al usuario y luego la presente con cada una de las palabras que contenga invertidas, ejemplo, si el usuario teclea: “esta tarea debe quedar terminada el día de hoy”, el programa regresará: “atse aerat edeb radeuq adanimret le aíd ed yoh”

8. Hacer un programa que solicite una cadena de texto y determine si es un palíndroma. Un palíndroma es aquella frase que se lee igual independientemente del sentido de lectura (de izquierda a derecha o viceversa), sin tomar en cuenta el espaciado. Por ejemplo: “anita lava la tina”

9. Solicitar una fecha en el formato: “dd de mes de aaaa” y calcular cuántos días han transcurrido del año tomando en cuenta si es año bisiesto o no. Ejemplo si el usuario teclea “3 de marzo de 2012” el programa devuelve: 63 días (ya que en el 2012 febrero tendrá 29 días por ser bisiesto, los bisiestos son aquellos años que son divisibles exactamente entre 4 y no terminan en 00).

10. Suponga que maneja un robot que recibe instrucciones de la siguiente forma “4S3D2S15D6B2IS” y que las letras significan: S sube, B baja, I izquierda, D derecha. Hacer un programa que indique cuál será la coordenada en que quede el robot durante su ejecución y hasta el final. Al principio del programa el usuario proporcionará la posición (coordenadas X y Y) en la que se encuentra el robot. Al final el programa también deberá reportar cuales comandos no son válidos. Si una letra no está precedida de un número significa que se desplaza una posición en el sentido que corresponda. Para el ejemplo anterior, suponiendo que las coordenadas iniciales son (0,0), al interpretar la cadena las coordenadas que resultarían al interpretarla serían 4S:(0,4), 3D:(3,4), 2S:(3,6), 15D:(18,6), 6B:(18,0), 2I:(16,0), S:(16,1)

Page 156: Java Básico Unidad II v2011

Otras clases para el manejo de Cadenas en Java

• Además de la clase String, las clases StringBuffer y StringBuilder sirven para manejar cadenas de caracteres

• Las clases StringBuffer y StringBuilder permiten manejar cadenas de caracteres que si pueden modificarse

• La clase StringTokenizer contiene métodos para descomponer una cadena en las partes que la componen de acuerdo a los delimitadores que especifiquemos

• Para manejar expresiones regulares (patrones de caracteres), Java utiliza las clases Pattern y Matcher que contienen métodos que permiten establecer si una cadena se encuentra en un formato específico

Page 157: Java Básico Unidad II v2011

Investigación 04: Clases para manejo de cadenas en Java

• Para cada una de las clases: StringBuffer, StringBuilder, StringTokenizer, Pattern y Matcher investigar lo siguiente:

1. Cuál es el propósito de la clase

2. Cuáles son los métodos que contiene, cuál es la sintaxis de cada uno de ellos y para que se utiliza

3. Al menos dos ejemplos del uso de cada una de las clases explicando que es lo que hacen y como son utilizadas las clases

Page 158: Java Básico Unidad II v2011

Paquetes

Page 159: Java Básico Unidad II v2011

Paquetes• Un paquete es un conjunto de clases que se encuentran relacionadas

entre sí• Este concepto es equivalente al de librería que se maneja en otros

lenguajes de programación• Una clase se incorpora a un paquete haciendo dos cosas:

1. Ubicándola en una carpeta que tenga el nombre del paquete2. Incluyendo la clase package al inicio del archivo de la clase (debe ser la primer

sentencia en el archivo)

• Si una clase no tiene la claúsula package se dice que pertenece a un paquete anónimo, que se compone de todos las clases que se encuentren en la misma carpeta del sistema operativo.

package paquete[.subpaquete][.subpaquete];• Un paquete puede tener subpaquetes, esto es equivalente a poner

clases en diferentes carpetas dentro de la carpeta del paquete. El nombre de los subpaquetes se conforma entonces por el nombre del paquete (carpeta principal), un punto y luego el nombre del subpaquete (la subcarpeta)

• Es posible tener subcarpetas dentro de las subcarpetas, esto es, un subpaquete puede contener a su vez subpaquetes

Page 160: Java Básico Unidad II v2011

Paquetes

• Tomemos como ejemplo el paquete votaciones

• Como podemos ver contiene dos clases públicas:• Casilla.java• Votaciones.java

• El paquete también contiene otras clases (las de las excepciones) aunque estas no son públicas

• Observe que cada uno de los archivos .java comienza indicando a que paquete corresponde la clase mediante la sentencia package

Page 161: Java Básico Unidad II v2011

Uso de los paquetes• Para usar un paquete lo que debemos hacer es utilizar la sentencia import• La sintaxis para el import es:

import paquete[.subpaquete][.subpaquete…][.clase|*];• Si se desea usar solamente una clase del paquete indicamos la clase:

import javax.swing.JLabel;• Si se desean usar todas las clases de un paquete, indicamos el paquete y en su caso el subpaquete y

terminamos con .*

import javax.swing.*;• Si queremos utilizar todos los subpaquetes de un paquete indicamos solo el nombre del paquete y terminamos

con .*

import javax.*;• Cuando hayamos incluido todos los subpaquetes (como es el caso anterior) al usar sus clases debemos indicar

en su nombre a que subpaquete pertenecen, por ejemplo:

swing.JLabel etiqueta = new swing.JLabel(“Proporcione opción”);• Para localizar de los paquetes dependemos de la variable classpath para localizar las clases (revisar la unidad I). • Recordemos que un paquete también lo buscará la JVM en el siguiente nivel de la carpeta en que estemos

trabajando, por ejemplo si estamos trabajando en la carpeta programa01 y la clase pública que está en esta (usaPaquete.java) importa el paquete votaciones, al compilar el programa se espera que debajo de la carpeta programa01 haya una carpeta que se llame votaciones

programa01

votaciones

import votaciones.Casilla;

public class programa01 {Casilla objeto=new Casilla();…

}

Casilla.java

Votaciones.java

usaPaquete.java

usaPaquete.java

Page 162: Java Básico Unidad II v2011

Archivos jar• Los archivos jar (Java Archive) son carpetas comprimidas. Son

archivos que contienen carpetas que almacenan paquetes (y algunos otros recursos como archivos de imágenes, archivos de datos, etc.)

• Para hacer un archivo jar utilizamos el programa jar.exe que incluye el jdk.

• Para crear un archivo jar usamos la siguiente sintaxis:

jar –cvf nombrearchivo.jar archivo1 archivo2 archivo3…Nota: archivo1, archivo2, etc. son los archivos que vamos a incluir en el archivo jar (por ejemplo los archivos .class)

• Para ver que archivos contiene un archivo jar se usa:

jar –tvf nombrearchivo.jar• Para usarlo simplemente hay que copiarlo a un lugar en donde

la variable classpath pueda localizarlo, o bien a la carpeta donde estemos trabajando con nuestro programa

Page 163: Java Básico Unidad II v2011

Manejo de Entrada/Salida

Page 164: Java Básico Unidad II v2011

Flujos (Streams)• Un flujo (stream) es cualquier conjunto de bits que es leído o

escrito por un programa desde o hacia cualquier dispositivo• Un dispositivo puede ser un teclado, la memoria de la

computadora, una impresora, un disco duro, una tarjeta de red, etc.• Cuando se lee o escribe un flujo de información a Java no le

importa de dónde proviene o a dónde va, y tampoco le importa el contenido

• Un flujo de entrada es aquel que sirve para que el programa pueda leer la información de algún dispositivo

• Un flujo de salida es aquel que sirve para que el programa pueda escribir la información en algún dispositivo

ProgramaFuente de Información

Destino de Información

Flujo de Entrada

Flujo de Salida

Leer Escribir

Page 165: Java Básico Unidad II v2011

Clases para el Manejo de Flujos• En el paquete java.io de la biblioteca estándar de Java existe

un conjunto de clases para manejar flujos• Los flujos en Java se pueden separar en dos tipos: los que

manejan bytes (unidades de 8 bits) y los que manejan caracteres (unidades de 16 bits)• En la jerarquía de Java las clases principales para el manejo de flujos

de bytes son InputStream para lectura y OutputStream para escritura• Las clases principales para manejar flujos de caracteres (char) son

Reader para leer y Writer para escribir• A menos que se trabaje con datos binarios (por ejemplo con archivos

de imágenes o de sonidos) se recomienda usar los flujos de caracteres. Estos son más eficientes que los flujos de bytes porque internamente manejan mecanismos de buffer

Un mecanismo de buffer permite depositar en memoria una cierta cantidad de información mayor a la que requerimos al hacer una lectura o escritura para disminuir la cantidad de lecturas o escrituras que hacemos desde/hacia un dispositivo, ya que normalmente estos son más lentos que la memoria

Page 166: Java Básico Unidad II v2011

Algunas clases de Java para manejar flujosObject

InputStreamOutputStream

ByteArrayInputStreamByteArrayOutputStream

StringBufferInputStream

FileInputStreamFileOutputStream

PipedInputStreamPipedOutputStream

ReaderWriter

CharArrayReaderCharArrayWriter

StringReaderStringWriter

FileReaderFileWriter

PipedReaderPipedWriter

Arreglos

Memoria

Archivos

Tuberías (procesos/hilos)

Arreglos

Memoria

Archivos

Tuberías (procesos/hilos)

bytes

chars

Page 167: Java Básico Unidad II v2011

Clases para manejar flujos que procesan los datosObjectInputStream

OutputStreamBufferedInputStreamBufferedOutputStream

FilterInputStreamFilterOutputStream

SequenceInputStream

ObjectInputStreamObjectOutputStream

DataInputStreamDataOutputStream

LineNumberInputStream

PushbackInputStream

PrintStream

ReaderWriterBufferedReader

BufferedWriter

FilterReaderFilterWriter

InputStreamReaderInputStreamWriter

LineNumberReader

PushbackReader

PrintWriter

Establecer un buffer

Establecer un filtro

Concatenar

Seriación

Conversión de datos

Contar

Mirar anticipadamente

Escribir

Establecer un buffer

Establecer un filtro

Conversión (bytes-chars)Contar

Mirar anticipadamente

Escribir

bytes

chars

Page 168: Java Básico Unidad II v2011

Métodos comunes para manejar flujos

Relacionados con Clases para Lectura (InputStream y Reader)

Relacionados con Clases para Escritura(OutputStream y Writer)

int read() Leer un byte/char. void write(byte dato)Void write(int letra)

Escribe un byte/carácter en el flujo

int read(byte[] datos)int read(char[] datos)

Lee un conjunto de bytes/chars y los deposita en el arreglo datos, regresa cuántos bytes/chars pudo leer

void write(byte[] datos)void write(char[] datos)

Escribe el arreglo de bytes/chars en el flujo

void close() Cierra el flujo y libera los recursos que tenga asociados

void close() Cierra el flujo asegurándose de que todo lo contenido en él quede escrito

boolean ready() Indica si el flujo se encuentra listo para ser leído

void flush() Limpia el flujo asegurándose de que su contenido quede escrito

long skip(long n) Salta n bytes/chars y los descarta

Writer append(char letra) Añade el char al final del flujo. Solo aplicable a flujos derivados de la clase Writer

Page 169: Java Básico Unidad II v2011

Algoritmos para Escribir/Leer

• Algoritmo para leer

Abrir el flujo de lectura

Mientras haya información

leer información

Cerrar el flujo

• Algoritmo para escribir

Abrir el flujo de escritura

Mientras haya información

escribir información

Cerrar el flujo

Cuando leemos o escribimos información usando flujos normalmente seguimos un proceso (algoritmo) más o menos similar

Page 170: Java Básico Unidad II v2011

Ejemplo de escritura de un flujo• El siguiente programa escribe en un flujo que se dirige a la pantalla (la salida estándar de

Java), todo lo que vaya tecleando el usuario.

import java.io.*;

import java.util.Scanner;

public class EscrituraFlujo {

public static void main(String[] args) {

String cadena;

Scanner teclado=new Scanner(System.in);

try {

OutputStreamWriter pantalla=new OutputStreamWriter(System.out);

System.out.println("Para terminar teclee <SALIR>");

do {

cadena=teclado.nextLine();

pantalla.write(cadena+"\n");

pantalla.flush();

} while (!cadena.toUpperCase().equals("<SALIR>"));

pantalla.close();

} catch (IOException e) {

System.out.println("Error al manejar el flujo");

}

}

}

Page 171: Java Básico Unidad II v2011

Ejemplo de lectura de un flujo• El siguiente programa escribe en pantalla todo lo que vaya tecleando el usuario a través de la

entrada estándar de Java representada por un flujo.

import java.io.*;public class LecturaFlujo { public static void main(String[] args) { String cadena; try { int cantidad; char[] arreglo; InputStreamReader teclado = new InputStreamReader(System.in); System.out.println("Para terminar teclee <SALIR>"); do { arreglo=new char[255]; cantidad=teclado.read(arreglo); cadena=new String(arreglo); cadena=cadena.trim(); System.out.println(cadena); } while (!cadena.toUpperCase().equals("<SALIR>")); teclado.close(); } catch (IOException e) { System.out.println("Error al manejar el flujo"); } }}

Page 172: Java Básico Unidad II v2011

Archivos• Un archivo es un contenedor de información. El diccionario dice que un archivo

es un conjunto ordenado de documentos• Un archivo informático es el espacio que se reserva en un dispositivo de

memoria de la computadora para almacenar porciones de información que tienen la misma estructura. El conjunto de información que se almacena en dicho espacio también se conoce de la misma forma

• Un archivo informático es un conjunto de bits que se almacena en un dispositivo de almacenamiento

• Un archivo computacional es un bloque de información o un recurso almacenando información que está disponible para un programa computacional y usualmente se basa en algún tipo de almacenamiento durable (a almacenamiento secundario, por ejemplo un disco duro, un dispositivo USB, una cinta, etc.)

• Un archivo es durable en el sentido de que permanece disponible para los programas aún cuando finalizan su ejecución

• Los archivos informáticos se llaman así porque son el equivalente a los archivos almacenados en papel

• Los archivos informáticos facilitan una manera de organizar los recursos usados para almacenar permanentemente datos en un sistema informático

• Cada fila (una entrada desde su inicio hasta donde se encuentra el símbolo de retorno de carro o nueva línea) de un archivo informático se conoce como registro

Page 173: Java Básico Unidad II v2011

Fin de Registro y Fin de Archivo• En el código ASCII, los símbolos para indicar el fin de registro son CR (“Carriage Return” Retorno de

Carro, el carácter 10) y LF (“Line Feed” Nueva Línea, el carácter 13). Conforme al sistema operativo que se use, se toman diferentes combinaciones:

• LF:     Unix y sistemas tipo Unix, Linux, AIX, Xenix, Mac OS X, BeOS, Amiga, RISC OS y otros• CR+LF: CP/M, MP/M, DOS, Microsoft Windows• CR:     familia Apple II y Mac OS hasta la versión 9• LF+CR: Las antiguas maquinas de escribir (por establecer la analogía con las computadoras)

• Otros sistemas operativos como EBCDIC usan el carácter NEL (“NExt Line” Siguiente Línea, carácter 21)

• En Unicode (que es el que usa Java), se tienen una cantidad más variada de terminadores de registro::• LF: Salto de línea, u000A (carácter 10)• CR: Retorno de carro, u000D (carácter 13) • CR+LF: CR seguido por LF (carácter 13 y luego carácter 10)• NEL: Next Line, u0085 (carácter 133)• FF: Form Feed, u000C (carácter 12)• LS: Line Separator, u2028• PS: Paragraph Separator, u2029

• Java acepta que en los Strings pongamos secuencias de escape para representar a los terminadores, “\n” representa la nueva línea y “\r” representa el retorno de carro

• Si en un archivo de texto queremos que se represente correctamente al desplegarlo deberemos agregar al final de cada registro “\r\n”

• El fin de archivo (“EOF”, “End of File”) indica el final del archivo (o del flujo). El fin de archivo varía según el tipo de partición, en una de tipo FAT16 el terminador es: FFF8-FFFFh. El carácter de fin de archivo no se encuentra en el archivo sino a nivel de sistema operativo por lo cual en Java se reconoce el fin de archivo (o del flujo) simplemente cuando se dejan de recibir datos. Si tratamos de leer más datos de los que tiene el flujo, entonces se genera una excepción EOFException

Page 174: Java Básico Unidad II v2011

Directorios• En el área informática también son conocidos como folders, carpetas, catálogos o cajones• Los directorios sirven para organizar los archivos en un dispositivo de cómputo. Pueden

contener archivos u otros directorios• Propiamente los directorios contienen ligas a donde se ubican los archivos (u otros directorios)

físicamente en el dispositivo• Los directorios y los archivos se ordenan generando una jerarquía, a esta jerarquía

generalmente se le llama sistema de directorios• Un dispositivo de almacenamiento puede tener uno o más sistemas de directorios, para esto se

divide en porciones lógicas a las que se conoce como particiones• El directorio principal de un sistema de archivos de un equipo de cómputo se conoce como

directorio raíz• Un directorio que se encuentra contenido dentro de otro se conoce como subdirectorio• La asociación jerárquica desde el directorio raíz hasta el lugar donde se encuentra un directorio

específico se conoce como trayectoria. Para algunos sistemas operativos la trayectoria puede iniciar con el nombre del dispositivo en que se encuentra el sistema de directorios

• Una trayectoria absoluta es aquella que contiene la descripción completa de la jerarquía para llegar a un determinado archivo o directorio

• Una trayectoria relativa es aquella que contiene la descripción para llegar a un determinado archivo o directorio desde el directorio en que se esté situado actualmente (directorio de trabajo)

• Un archivo es identificado por su nombre y la trayectoria que identifica el directorio donde se encuentra

Page 175: Java Básico Unidad II v2011

Manejo de archivos y directorios en Java• Java incluye la clase File que sirve para manejar archivos y directorios• Esta clase representa una vista abstracta e independiente del sistema

operativo de las trayectorias• Una trayectoria abstracta tiene dos componentes:

1. Un pefijo dependiente del sistema tal como un especificador de dispositivo, el directorio raíz (/ en Unix y \\\\ en Windows UNC)

2. Una secuencia de cero o más nombres

• La clase File tiene varios constructores:

File(File padre, String hijo)

Crea una nueva instancia a partir de una trayectoria abstracta padre y una trayectoria hijo representada por un String

File(String pathname)

Crea una nueva instancia conviertiendo la trayectoria en una trayectoria abstracta

File(String padre, String hijo)

Crea una nueva instancia a partir de una trayectoria padre y una trayectoria hijo

File(URI uri)

Crea una nueva instancia convirtiendo la URI en una trayectoria abstracta

Page 176: Java Básico Unidad II v2011

Algunos métodos de la Clase FileMétodo Uso

boolean canExcecute() Devuelve true si el archivo puede ejecutarse

boolean canRead() Devuelve true si el archico puede leerse

boolean canWrite() Devuelve true si el archivo puede ser modificado

boolean createNewFile() Crea un archivo vacío

boolean delete() Borra el archivo o directorio asociado al objeto

boolean equals(Object objeto)

Prueba si el archivo es igual al objeto pasado como argumento

boolean exists() Verifica la existencia del archivo o directorio

String get AbsolutePath() Devuelve una cadena con la trayectoria absoluta del archivo o directorio

long getFreeSpace() Devuelve el espacio disponible en la partición

String getName() Devuelve una cadena con el nombre del archivo o directorio

String getParent() Devuelve la trayectoria del directorio en que se encuentra el archivo o directorio

String getPath() Devuelve la trayectoria del archivo o directorio

long getTotalSpace() Devuelve el espacio total de la partición

Page 177: Java Básico Unidad II v2011

Algunos métodos de la Clase File

Método Uso

boolean isAbsolute() Regresa true si la trayectoria abstracta del objeto es absoluta

boolean isDirectory() Regresa true si el objeto referencia a un directorio

boolean isFile() Regresa true si el objeto referencia a un archivo

boolean isHide() Regresa true si se trata de una archivo/directorio oculto

long lastModified() Regresa el tiempo de la última modificación

long length() Regresa la longitud del archivo

String[] list() Regresa un arreglo con la lista de nombres de archivos contenidos en el directorio

boolean mkdir() Crea un directorio

boolean mkdirs() Crea un directorio y todos los directorios que le antecedan en la trayectoria y que no existan

boolean renameTo(File destino)

Renombra el archivo por el que se pase como argumento

Page 178: Java Básico Unidad II v2011

Algunos métodos de la Clase FileMétodo Uso

boolean setExcecutable(boolean permiso) Otorga/quita el permiso de ejecución a un archivo

boolean setLastModified(long tiempo) Establece la fecha de última modificación del archivo

boolean setReadable(boolean permiso) Otorga/quita el permiso de lectura a un archivo

boolean setReadOnly(boolean permiso) Otorga/quita el permiso de solo lectura a un archivo

boolean setWriteable(boolean permiso) Otorga/quita el permiso de escritura a un archivo

URI toURI() Regresa una URI que representa la trayectoria abstracta a la que refiere el objeto.

Page 179: Java Básico Unidad II v2011

Concepto de URI• URI (Uniform Resource Idenfificator): En español Identificador Uniforme de Recursos, es

una cadena de caracteres corta que identifica unívocamente un recurso (servicio, página, documento, archivo, directorio, dirección de correo, etc.) accesible a través de una red.

• Un URI consta de las siguientes partes:• Esquema: nombre que se refiere a una especificación para asignar los identificadores, e.g. urn:,

tag:, cid:. En algunos casos también identifica el protocolo de acceso al recurso, por ejemplo http:, mailto:, ftp:.

• Autoridad: elemento jerárquico que identifica la autoridad de nombres (por ejemplo //es.wikipedia.org).

• Ruta: Información usualmente organizada en forma jerárquica, que identifica al recurso en el ámbito del esquema URI y la autoridad de nombres (e.g. /wiki/Uniform_Resource_Identifier).

• Consulta: Información con estructura no jerárquica (usualmente pares "clave=valor") que identifica al recurso en el ámbito del esquema URI y la autoridad de nombres. El comienzo de este componente se indica mediante el carácter '?'.

• Fragmento: Permite identificar una parte del recurso principal, o vista de una representación del mismo. El comienzo de este componente se indica mediante el carácter '#'.

• Aunque se acostumbra llamar URL a todas las direcciones web, URI es un identificador más completo y por eso es recomendado su uso en lugar de la expresión URL.

• Un URI se diferencia de un URL en que permite incluir en la dirección una subdirección, determinada por el “fragmento”.

Page 180: Java Básico Unidad II v2011

Ejemplo de Uso de la Clase File

• import java.io.*;• import java.util.Scanner;• import java.util.Date;• public class EjemploFile {

• public static void main(String[] args) {• String nombre; • Scanner teclado=new Scanner(System.in);• Date fecha=new Date();• System.out.print("Proporcione el nombre de un

archivo/directorio (incluya su ruta completa): ");• nombre=teclado.nextLine(); • File archivo=new File(nombre);• if (archivo.exists()) {• System.out.println("Nombre: “

+archivo.getName());• System.out.println("Nombre completo: “

+archivo.getAbsolutePath());• System.out.println("URI:

"+archivo.toURI().toString());• fecha.setTime(archivo.lastModified());• System.out.println("Última modificación: “

+fecha.toString());• if (archivo.isDirectory()) {

• System.out.println("Es un directorio");• System.out.println("Contiene “

+archivo.list().length+" entradas (archivos o directorios)");

• } • if (archivo.isFile()) {• System.out.println("Es un archivo");• System.out.println("Tamaño: “ +archivo.length()

+" bytes");• • } • if (archivo.canExecute())• System.out.println("Tiene permisos de

ejecución");• if (archivo.canRead())• System.out.println("Tiene permisos de

lectura");• if (archivo.canWrite())• System.out.println("Tiene permisos de

escritura"); • } else {• System.out.println("El archivo no existe");• } • }• }

• El siguiente programa solicita un nombre de un archivo o directorio y proporciona su información básica

Page 181: Java Básico Unidad II v2011

Acceso Secuencial a Archivos• Un archivo abierto para acceso secuencial es aquel que

puede almacenar registros de diferentes longitudes• El acceso secuencial generalmente se utiliza para

archivos de texto ya que en ellos se escribe la información de inicio a fin y se lee en la misa secuencia

• No se recomienda usar archivos de texto para almacenar una gran cantidad de valores numéricos (por ejemplo los que representan imágenes, música, vídeos, programas compilados, etc.), en este caso se recomienda utilizar archivos de bytes, mejor conocidos como archivos binarios

Page 182: Java Básico Unidad II v2011

Comentarios Útiles para el Acceso Secuencial a Archivos• Cuando instanciamos un objeto de la clase FileWriter o de la clase

FileOutputStream pasamos como parámetro el nombre del archivo con toda su trayectoria. Al crear el archivo puede generarse una excepción si hay alguna condición por la que esto no pueda realizarse. Debemos estar preparados con un try-catch para manejar una excepción del tipo IOException

• Aunque no se crea un archivo cuando instanciamos un objeto de la clase FileReader o FileInputStream si se abre para lectura y puede ocurrir una excepción del tipo IOException que debemos manejar

• Para escribir un registro en un archivo utilizamos el método write()• Un registro puede contener cualquier cadena de texto, pero también

puede contener algún dato de un tipo primitivo• Para leer un registro de un archivo utilizamos el método read()• El método read() nos devuelve el resultado en un arreglo de bytes o de

chars que se pasa como argumento. Esto lo hace para podernos devolver como resultado un entero con la cantidad de bytes/chars que leyó

• Podemos saber que llegamos al final de un archivo cuando la cantidad de bytes/chars leídos es cero

Page 183: Java Básico Unidad II v2011

Ejemplo de creación de archivos de texto en Javaimport java.util.Scanner;

import java.io.*;

public class EscribeArchivoTexto {

public static void main(String[] args) {

String nombre, entrada="";

Scanner teclado=new Scanner(System.in);

System.out.print("Nombre del archivo: ");

FileWriter archivo;

nombre=teclado.nextLine();

try {

archivo=new FileWriter(nombre);

System.out.println("Teclee <salir> para terminar");

do {

entrada=teclado.nextLine();

if (!entrada.toLowerCase().equals("<salir>"))

archivo.write(entrada+"\r\n");

} while (!entrada.toLowerCase().equals("<salir>"));

archivo.flush();

archivo.close();

} catch (IOException e) {

System.out.println("Error al crear archivo");

}

}

}

Page 184: Java Básico Unidad II v2011

Ejemplo de lectura de archivos de texto en Java import java.util.Scanner;

import java.io.*;

import java.util.Arrays;

public class LeeArchivoTexto {

public static void main(String[] args) {

String nombre, entrada="";

int leidos;

char memoria[]=new char[32768];

Scanner teclado=new Scanner(System.in);

System.out.print("Nombre del archivo: ");

FileReader archivo;

nombre=teclado.nextLine();

try {

archivo=new FileReader(nombre);

do {

Arrays.asList(memoria,"");

leidos=archivo.read(memoria);

entrada=new String(memoria);

System.out.println(entrada);

} while (leidos>0);

archivo.close();

} catch (IOException e) {

System.out.println("Error archivo no localizado");

}

}

}

Page 185: Java Básico Unidad II v2011

Archivos de Datos• Un archivo es una colección de datos interrelacionados.• Cada una de las filas de un archivo se conoce como

registro.• Los registros agrupan los datos de una instancia particular

de algo que queremos describir (una persona, un auto, un estudiante, una cuenta bancaria, etc.). A cada dato que forma parte de un registro se le conoce como campo.

• Entonces un conjunto de campos interrelacionados forma un registro.

• En un archivo de datos por lo general vamos a guardar estructuras homogéneas; es decir, todos los registros de un archivo particular tienen los mismos campos (en la misma cantidad y orden) ya que describen el mismo tipo de objetos.

• Un archivo de datos es muy similar a un arreglo cuyo tipo es una clase.

Page 186: Java Básico Unidad II v2011

Descripción Gráfica de un Archivo de Datos

Nombre Apellido Paterno

Apellido Materno

Teléfono Edad

José Pérez Martínez 9101010 22

Mariana Mendoza Rodríguez 9171819 21

Arturo Suárez Tapia 9123654 23

C:\Datos\Agenda.Dat Nombre del Archivo

Campos

Registros

Los nombres de los campos por lo general no se guardan dentro del archivo pero es necesario saber que estructura tienen para poder interpretarlos correctamente. A la descripción de los campos que contiene el archivo se le conoce como File Header (Encabezado de Archivo). La longitud de un registro es el tamaño en bytes que tiene el registroEn Java al File Header la vamos a establecer en una clase.

class Persona implements Serializable {String nombre;String app;String apm;String telefono;int edad;

}

Encabezado del Archivo

Page 187: Java Básico Unidad II v2011

Seriación (Serialización)• La seriación es el proceso por el que se convierte una

estructura de datos o el estado de un objeto en un formato que pueda ser almacenado y recuperado posteriormente

• Al proceso de seriación también se le conoce como desinflado (deflating) o clasificación (marshalling)

• Seriar un objeto consiste en convertir su estado en un flujo (Stream) de bytes de forma tal que el flujo pueda ser convertido nuevamente en una copia del objeto

• Para poder almacenar un objeto en un archivo es necesario que la clase a la que pertenece sea seriable (Serializable).

• La interface java.io.Serializable al ser implementada por una clase permite que pueda seriarse

• La interface Serializable no contienen ningún método.• Los miembros que son heredados de una clase que no

implementa Serializable no pueden seriarse por lo que se inicializan en base al constructor por defecto de la clase que se derivan

Page 188: Java Básico Unidad II v2011

Proceso de Seriación y Deseriación

Programa

ObjetoObjectOutputStream FileOutputStream

Archivo en DiscoPrograma

Objeto ObjectInputStream FileInputStream

Seriación

Deseriación

Page 189: Java Básico Unidad II v2011

Comentarios Sobre el Proceso de Seriación/Deseriación• Un objeto se escribe con el método writeObject() de la clase

ObjectOutputStream• Un objeto se lee con el método readObject() de la clase

ObjectInputStream• Como el método readObject() regresa un objeto de tipo Object,

es necesario hacer un cast para precisar de que clase es realmente el objeto que estamos leyendo

• Al leer el archivo puede ocurrir un error si no se encuentra el objeto que se espera en el cast, hay que capturar la excepción del tipo ClassNotFoundException

• Para saber si un archivo contiene más objetos que leer (no hemos llegado al final del archivo), utilizamos el método available(). Conviene usar el que está ligado al archivo (al objeto FileInputStream) y no al objeto seriado (ObjectInputStream)

• Si tratamos de leer más registros de los que tenemos en el archivo entonces ocurrirá una excepción del tipo EOFException

Page 190: Java Básico Unidad II v2011

Ejemplo de Declaración de una Clase Seriable• import java.io.Serializable;• public class Persona implements Serializable{• private String nombre;• private String apellidoPaterno;• private String apellidoMaterno;• private String telefono;• private int edad;

• public Persona(String nom, String app, String apm, String tel, int ed ) {

• nombre=nom;• apellidoPaterno=app;• apellidoMaterno=apm;• telefono=tel;• edad=ed;• }• public void setNombre(String nom, String app, String apm)

{• nombre=nom;• apellidoPaterno=app;• apellidoMaterno=apm;• }• public void setTelefono(String tel) {• telefono=tel;• }• public void setEdad(int ed) {• edad=ed;• }• public String getNombreCompleto() {• return nombre+" "+apellidoPaterno+"

"+apellidoMaterno;• }• public String getApellidosNombre() {• return apellidoPaterno+" "+apellidoMaterno+",

"+nombre;• }• public String getNombre() {• return nombre;• } • public String getApellidos() {• return apellidoPaterno+" "+apellidoMaterno;• }• public String getApellidoPaterno() {• return apellidoPaterno;• }• public String getApellidoMaterno() {• return apellidoMaterno;• }• public String getTelefono() {• return telefono;• }• public int getEdad() {• return edad;• }• public String getDatos() {• return nombre+" "+apellidoPaterno+" "+apellidoMaterno• +"\t "+telefono+"\t "+edad;• }• }

Page 191: Java Básico Unidad II v2011

Ejemplo de Escritura de Objetos en un Archivo (seriación)• import java.io.*;• import java.util.Scanner;

• public class Seriacion {

• public static void main(String[] args) {• Persona datos;• Scanner teclado=new Scanner(System.in);• String nom, app, apm, tel;• int edad;• try {• FileOutputStream archivo=new

FileOutputStream("agenda.obj");• ObjectOutputStream registro=new

ObjectOutputStream(archivo);• String otro="";• do {• System.out.print("Nombre: ");• nom=teclado.next();• System.out.print("Apellido Paterno: ");• app=teclado.next();• System.out.print("Apellido materno: ");• apm=teclado.next();

• System.out.print("Teléfono: ");• tel=teclado.next();• System.out.print("Edad: ");• edad=teclado.nextInt();• datos=new Persona(nom, app, apm,

tel, edad);• registro.writeObject(datos);• System.out.print("Desea agregar otro

registro (S/N)?");• otro=teclado.next();• } while (!otro.toUpperCase().equals("N")

&&• !otro.toUpperCase().equals("NO"));

• registro.close();• archivo.close();• } catch (IOException e) {• System.out.println("El archivo no pudo

ser creado");• }• }• }

Page 192: Java Básico Unidad II v2011

Ejemplo de Lectura de Objetos en un Archivo (deseriación)

• import java.io.*;

• public class Deseriacion {• public static void main(String[] args) {• Persona datos;• FileInputStream archivo=null;• ObjectInputStream registro=null;• try {• archivo=new

FileInputStream("agenda.obj");• registro=new

ObjectInputStream(archivo);• String otro="";• do { • datos=(Persona)

registro.readObject(); • if (datos!=null) {•

System.out.println(datos.getDatos());• } • } while (archivo.available()>0);

• registro.close();• archivo.close(); • } catch (ClassNotFoundException

e) {• System.out.println("Archivo

incompatible");• } catch (EOFException e) {• System.out.println("Fin de

archivo");• } catch (IOException e) { • System.out.println("El archivo

no pudo ser leído"+e.getMessage());• } • }• }

Page 193: Java Básico Unidad II v2011

Acceso Aleatorio a Archivos• Dentro de java.io se encuentra la clase

RandomAccessFile que permite acceder directamente a un registro sin importar en que posición se encuentre

• Un flujo de la clase RandomAccessFile se puede abrir en modo de lectura (r), de escritura (w) o ambos (rw), es decir lectura y escritura

• Esta clase provee dos interfaces DataInput y DataOutput, las cuales permiten leer y escribir datos de tipo primitivo y mediante los métodos readUTF() y writeUTF() podemos leer y escribir Strings;

• No es posible seriar objetos al utilizar esta clase

Page 194: Java Básico Unidad II v2011

Algunos Métodos para Manejo de Archivos Aleatorios

• En la clase RandomAccesFile, además de otros métodos que ya conocemos para el manejo de flujos se cuenta con:• long getFilePointer() Regresa la posición en bytes dentro del

archivo• long length() Devuelve la longitud del archivo en bytes• void seek(long pos) Se desplaza tantos bytes como le indique

pos a partir del inicio del archivo• void setLength(long tam) Establece el tamaño en bytes para el

archivo• skipBytes(int n) Se desplaza n bytes a partir de la posición

actual

Page 195: Java Básico Unidad II v2011

Operaciones Básicas con Archivos de Datos

• Las operaciones básicas sobre un archivo de datos son:• Agregar un registro (Alta)• Eliminar un registro (Baja)• Modificar un registro –uno o varios campos (Cambio)• Consultar un registro (Consulta o Despliegue)• Hacer el desplegado del contenido del archivo –con o sin filtro (Listado)

• Estas operaciones son muy comunes y es común que llamemos a los sistemas que manejan estas operaciones como sistemas “ABC” (por la realización de Altas, Bajas, Consultas…) o sistemas de mantenimiento a archivos

Page 196: Java Básico Unidad II v2011

Ejemplo de Operaciones Básicas con Archivos de Datos• Este ejemplo sirve para presentar las operaciones básicas

para el manejo de archivos• El programa trata de simular las operaciones sobre cuentas

bancarias:• Crear cuentas (alta)• Eliminar cuentas (baja)• Hacer cargos y abonos a una cuenta (cambios)• Localizar los datos de una cuenta (consulta)• Obtener el listado de cuentas y el saldo total (listados)

• El archivo se accederá de manera aleatoria • El programa se compone de 3 clases:

• Banco: Es el programa principal que lleva el control del menú• Ventanilla: Es la clase que realiza las operaciones sobre las cuentas• Cuenta: Es la clase que contiene los datos de cada cuenta

Page 197: Java Básico Unidad II v2011

Clase Banco• import java.util.Scanner;• import java.sql.Date;• public class Banco { • /**• * @param args the command line

arguments• */ • • public static void main(String[] args) {• Scanner teclado=new

Scanner(System.in);• teclado.useDelimiter("\n");• int opcion=0;• long numCta;• float cantidad;• Cuenta datos;• Date hoy=new Date(new

java.util.Date().getTime()); • Ventanilla caja1=new Ventanilla();• do {• System.out.println("Seleccione su

opción: ");• System.out.println("1. Crear

cuenta");• System.out.println("2. Eliminar

cuenta");• System.out.println("3. Hacer un

cargo");• System.out.println("4. Hacer un

abono");• System.out.println("5. Consultar una

cuenta");

• System.out.println("6. Listar las cuentas");

• System.out.println("9. Salir");• System.out.print("Opción elegida?

");• opcion=teclado.nextInt();• switch (opcion) {• case 1: • datos=new Cuenta();

• System.out.print("Nombre del

titular: ");• datos.titular=teclado.next();• System.out.print("Saldo inicial:

");•

datos.saldo=teclado.nextFloat();•

datos.fechaApertura=hoy.toString();•

System.out.println(datos.fechaApertura);• caja1.apertura(datos);• break;• case 2:• System.out.print("Proporcione

el número de cuenta: ");• numCta=teclado.nextLong();• caja1.cierre(numCta);• break;• case 3: • System.out.print("Proporcione

el número de cuenta: ");

• numCta=teclado.nextLong();• System.out.print("Cantidad del

cargo: ");• cantidad=teclado.nextFloat();• caja1.cargo(numCta,

cantidad); • break;• case 4: • System.out.print("Proporcione

el número de cuenta: ");• numCta=teclado.nextLong();• System.out.print("Cantidad a

retirar: ");• cantidad=teclado.nextFloat();• caja1.abono(numCta,

cantidad); • break; • case 5:• System.out.print("Proporcione

el número de cuenta: ");• numCta=teclado.nextLong();• caja1.consulta(numCta);• break; • case 6:• caja1.listado();• }• } while (opcion!=9);• }• }

Page 198: Java Básico Unidad II v2011

Clase Cuenta• import java.sql.Date;• public class Cuenta {• long numero;• String titular;• float saldo;• String fechaApertura;• public Cuenta() {• Date hoy=new Date(new

java.util.Date().getTime()); • fechaApertura=hoy.toString();• }• public Cuenta(Date fecha) {• fechaApertura=fecha.toString();

• } • public long getNumero() {• return numero;• }

• public String getTitular() {• return titular;• }• public float getSaldo() {• return saldo;• }• public String getFechaApertura() {• return fechaApertura;• }• public long getTamañoReal() {• return

8+titular.length()*2+4+fechaApertura.length()*2;

• }• public long getTamañoRegistro() {• return 1012;• }• }

Page 199: Java Básico Unidad II v2011

Clase Ventanilla• import java.io.RandomAccessFile;• import java.io.IOException;• import java.util.Scanner;

• public class Ventanilla { • public void apertura(Cuenta datos) {• long longitud;• try { • RandomAccessFile archivo=new

RandomAccessFile("Cuentas.dat", "rw");• if (archivo.length()>0) • longitud=archivo.length() /

datos.getTamañoRegistro() + 1; • else• longitud=0;•

archivo.seek(longitud*datos.getTamañoRegistro());

• datos.numero=longitud;•

archivo.writeLong(datos.getNumero());• archivo.writeUTF(datos.getTitular());• archivo.writeFloat(datos.getSaldo());•

archivo.writeUTF(datos.getFechaApertura());• System.out.println("Número asignado

a la cuenta: "+datos.getNumero());• archivo.close();• } catch (IOException e) {• System.out.println("No pudo crearse

la cuenta");• } • }

• public void cierre(long numCta) {• long longitud=0, posicion;• Cuenta datos=new Cuenta();• Scanner teclado=new

Scanner(System.in);• teclado.useDelimiter("\n");• String confirmar="";• try { • RandomAccessFile archivo=new

RandomAccessFile("Cuentas.dat", "rw");

• if (archivo.length()==0)• System.out.println("Lo sentimos, no

hay cuentas registradas");• else { • longitud=archivo.length() /

datos.getTamañoRegistro() + 1;• if ((numCta<0)||(numCta>longitud))• System.out.println("Número de

cuenta no válido");• else {•

posicion=numCta*datos.getTamañoRegistro();

• archivo.seek(posicion);•

datos.numero=archivo.readLong();• datos.titular=archivo.readUTF();• datos.saldo=archivo.readFloat();•

datos.fechaApertura=archivo.readUTF();• if (datos.numero >=0) {• System.out.println("Número

de cuenta: "+datos.getNumero());

• System.out.println("Titular: "+datos.getTitular());

• System.out.println("Saldo: "+datos.getSaldo());

• System.out.println("Fecha de apertura: "+datos.getFechaApertura());

• System.out.print("Confirmar baja (S/N)?");

• confirmar=teclado.next().toUpperCase();

• if (confirmar.equals("S")|| confirmar.contains("SI")) {

• datos.numero=-1;• archivo.seek(posicion);•

archivo.writeLong(datos.getNumero());• } else•

System.out.println("Operación cancelada");

• } else• if (datos.numero==-1)• System.out.println("La

cuenta no se encuentra activa");• • }• archivo.close();• } • } catch (IOException e) {• System.out.println("No pudo

localizarse la cuenta");• } • }•

Page 200: Java Básico Unidad II v2011

Clase Ventanilla• • public void cargo(long numCta, float cantidad) {• long longitud=0, posicion;• Cuenta datos=new Cuenta();• Scanner teclado=new Scanner(System.in);• teclado.useDelimiter("\n");• String confirmar="";• try { • RandomAccessFile archivo=new

RandomAccessFile("Cuentas.dat", "rw"); • if (archivo.length()==0)• System.out.println("Lo sentimos, no hay cuentas

registradas");• else { • longitud=archivo.length() / datos.getTamañoRegistro() +

1;• if ((numCta<0)||(numCta>longitud))• System.out.println("Número de cuenta no válido");• else {• posicion=numCta*datos.getTamañoRegistro();• archivo.seek(posicion);• datos.numero=archivo.readLong();• datos.titular=archivo.readUTF();• datos.saldo=archivo.readFloat();• datos.fechaApertura=archivo.readUTF();• if (datos.numero >=0) {• System.out.println("Número de cuenta:

"+datos.getNumero());• System.out.println("Titular: "+datos.getTitular());• System.out.println("Saldo: "+datos.getSaldo());

• System.out.println("Fecha de apertura: "+datos.getFechaApertura());

• System.out.print("Confirmar cargo (S/N)?");• confirmar=teclado.next().toUpperCase();• if (confirmar.equals("S")|| confirmar.contains("SI")) {• datos.saldo=datos.getSaldo()+cantidad;• System.out.println("Nuevo saldo:

"+datos.getSaldo());• archivo.seek(posicion);• archivo.writeLong(datos.getNumero());• archivo.writeUTF(datos.getTitular());• archivo.writeFloat(datos.getSaldo());• archivo.writeUTF(datos.getFechaApertura());

• } else• System.out.println("Operación cancelada");

• } else• if (datos.numero==-1)• System.out.println("La cuenta no se encuentra

activa");• • }• } • archivo.close();• } catch (IOException e) {• System.out.println("No pudo localizarse la cuenta");• }• • }•

Page 201: Java Básico Unidad II v2011

Clase Ventanilla• public void abono(long numCta, float cantidad) {• long longitud=0, posicion;• Cuenta datos=new Cuenta();• Scanner teclado=new Scanner(System.in);• teclado.useDelimiter("\n");• String confirmar="";• try { • RandomAccessFile archivo=new

RandomAccessFile("Cuentas.dat", "rw"); • if (archivo.length()==0)• System.out.println("Lo sentimos, no hay cuentas

registradas");• else { • longitud=archivo.length() / datos.getTamañoRegistro() + 1;• if ((numCta<0)||(numCta>longitud))• System.out.println("Número de cuenta no válido");• else {• posicion=numCta*datos.getTamañoRegistro();• archivo.seek(posicion);• datos.numero=archivo.readLong();• datos.titular=archivo.readUTF();• datos.saldo=archivo.readFloat();• datos.fechaApertura=archivo.readUTF();• if ((datos.numero >=0) && (cantidad<=datos.getSaldo())) {• System.out.println("Número de cuenta:

"+datos.getNumero());• System.out.println("Titular: "+datos.getTitular());• System.out.println("Saldo: "+datos.getSaldo());• System.out.println("Fecha de apertura:

"+datos.getFechaApertura());• System.out.print("Confirmar abono (S/N)?");• confirmar=teclado.next().toUpperCase();

• if (confirmar.equals("S")|| confirmar.contains("SI")) {• datos.saldo=datos.getSaldo()-cantidad;• System.out.println("Nuevo saldo:

"+datos.getSaldo());• archivo.seek(posicion);• archivo.writeLong(datos.getNumero());• archivo.writeUTF(datos.getTitular());• archivo.writeFloat(datos.getSaldo());• archivo.writeUTF(datos.getFechaApertura());

• } else• System.out.println("Operación cancelada");

• } else• if (datos.numero==-1)• System.out.println("La cuenta no se encuentra

activa");• else if (cantidad>datos.getSaldo()) {• System.out.println("No se cuenta con fondos

suficientes para ese retiro"); • System.out.println("Saldo actual:"+datos.getSaldo());• }• }• } • archivo.close();• } catch (IOException e) {• System.out.println("No pudo localizarse la cuenta");• }• • }•

Page 202: Java Básico Unidad II v2011

Clase Ventanilla• • public void consulta(long numCta) {• long longitud=0, posicion;• Cuenta datos=new Cuenta();• Scanner teclado=new Scanner(System.in);• teclado.useDelimiter("\n");• String confirmar="";• try { • RandomAccessFile archivo=new

RandomAccessFile("Cuentas.dat", "r"); • if (archivo.length()==0)• System.out.println("Lo sentimos, no

hay cuentas registradas");• else { • longitud=archivo.length() /

datos.getTamañoRegistro() + 1;• if ((numCta<0)||(numCta>longitud))• System.out.println("Número de

cuenta no válido");• else {•

posicion=numCta*datos.getTamañoRegistro();• archivo.seek(posicion);• datos.numero=archivo.readLong();• datos.titular=archivo.readUTF();• datos.saldo=archivo.readFloat();•

datos.fechaApertura=archivo.readUTF();• if (datos.numero >=0) {• System.out.println("Número de

cuenta: "+datos.getNumero());• System.out.println("Titular:

"+datos.getTitular());• System.out.println("Saldo:

"+datos.getSaldo());

• System.out.println("Fecha de apertura: "+datos.getFechaApertura());

• System.out.print("Continuar <C>");

• do {•

confirmar=teclado.next().toUpperCase();• } while (!

confirmar.toUpperCase().equals("C"));

• } else• if (datos.numero==-1)• System.out.println("La cuenta

no se encuentra activa");• • }• } • archivo.close();• } catch (IOException e) {• System.out.println("No pudo localizarse

la cuenta");• } • }• • public void listado() {• long longitud=0, posicion;• Cuenta datos=new Cuenta();• Scanner teclado=new Scanner(System.in);• teclado.useDelimiter("\n");• String confirmar="";• try { • RandomAccessFile archivo=new

RandomAccessFile("Cuentas.dat", "r"); • if (archivo.length()==0)

• System.out.println("Lo sentimos, no hay cuentas registradas");

• else { • longitud=archivo.length() /

datos.getTamañoRegistro() + 1;• for (int r=0;r<longitud;r++) { •

posicion=r*datos.getTamañoRegistro();• archivo.seek(posicion);• datos.numero=archivo.readLong();• datos.titular=archivo.readUTF();• datos.saldo=archivo.readFloat();•

datos.fechaApertura=archivo.readUTF();• if ((datos.numero >=0)) {• System.out.print("Número de

cuenta: "+datos.getNumero()+"\t");• System.out.print("Titular:

"+datos.getTitular()+"\t\t");• System.out.print("Saldo:

"+datos.getSaldo()+"\t");• System.out.println("Fecha de

apertura: "+datos.getFechaApertura());• } • } • }• archivo.close();• } catch(IOException e) {• System.out.println("Error al tratar de

abrir el archivo");• } • }• }

Page 203: Java Básico Unidad II v2011

Proyecto Final• A los juegos del proyecto de medio termino agregar los siguientes:

1. Juego de la oca, el ganador se lleva 50 puntos, el último lugar pierde 20 puntos

2. Juego del memorama, el tablero podrá ser de 6x6, 10x10 o 12x12 dependiendo de la dificultad (fácil, medio difícil). Para el juego fácil se podrán tener hasta 27 fallos antes de perder, para el juego medio se podrán tener hasta 60 fallos antes de perder y para el juego difícil se podrán tener hasta 48 fallos antes de perder. Al ganar se otorgarán 20, 40 y 80 puntos dependiendo la dificultad y al perder se descontarán 10, 20 y 30 puntos también dependiendo de la dificultad

3. Juego del ahorcado, el programa deberá de tener al menos una cantidad de 200 palabras entre las cuales seleccione una al azar para adivinar. Se darán 100 puntos si se adivina con una letra, 75 puntos si adivina con dos letras, 50 puntos si adivina con tres letras, 25 puntos si adivina con cuatro letras, 10 puntos si adivina con cinco letras y se restarán 20 puntos si no se adivina

4. Juego de lotería mexicana, los cartones se generan al azar. Mismas reglas en cuanto a apuestas que para proyecto de medio termino

5. Juego adivina quien, se tienen hasta 6 preguntas, si se adivina al personaje se darán 80 puntos y si no se adivina se pierden 40 puntos

Punto extra sobre parte práctica: manejar archivos para que las partidas se puedan guardar para continuar posteriormente y para guardar los records máximos de puntos totales ganados

Punto equivalente a pesos o la unidad de moneda que hayan utilizado en el proyecto de medio termino

Sigue las mismas reglas que el proyecto de medio termino