Está en la página 1de 7

Entrada de datos

H. Tejeda

Febrero 2016

1. Clase Scanner para entrada desde el teclado

Se pueden asignar valores a las variables al ser declaradas, pero los programas son mas utiles
cuando el usuario puede dar valores diferentes a las variables cada vez que el programa se ejecuta.
Para crear programas interactivos que acepten la entrada de un usuario, se puede usar System.in,
la cual se refiere al dispositivo de entrada estandar (el teclado).

El objeto System.in no es tan flexible como los metodos println() o print(), los cuales
pueden mostrar diferentes tipos de datos (double, int, o String). System.in esta disenado solo
para leer bytes, pero usando conjuntamente la clase Scanner se hace mas flexible.

Para crear un objeto Scanner y conectarlo con el objeto System.in, se escribe una sentencia
como la siguiente:

Scanner dispositivoEntrada = new Scanner(System.in);

En esta sentencia se declara un objeto de tipo Scanner con el nombre dispositivoEntrada y


se le asigna el objeto creado Scanner. El objeto Scanner esta conectado al dispositivo de entrada
por defecto.La palabra clave new se requiere siempre que se crean objetos a diferencia de cuando
se usan tipos primitivos.

La clase Scanner contiene metodos que recuperan valores de un dispositivo de entrada. Cada
valor recuperado es un token, el cual es un conjunto de caracteres que esta separado del siguiente
conjunto por un blanco. Frecuentemente esto significa que el dato es aceptado cuando el usuario
presiona la tecla Intro, pero podra significar tambien que el token sea aceptado despues del espacio
o el tabulador. El cuadro 1 resume algunos de los metodos mas utiles que leen diferentes tipos de
datos desde el dispositivo de entrada por default.

La clase Scanner no tiene un metodo nextChar(). Para recuperar el primer caracter desde el
teclado, usar nextLine().charAt(0).

El codigo 1 usa dos metodos de la clase Scanner. El programa lee una cadena y un entero desde
el teclado y los muestra. La clase Scanner esta involucrada en:

Lnea 1 La sentencia importa la clase Scanner del paquete java.util y es requerida para poder
usar la clase.
Lnea 6 Declara y crea un objeto Scanner.

1
Metodo Descripcion
next() Recupera el siguiente token completo como un String.
nextBoolean() Recupera la entrada como un boolean.
nextByte() Recupera la entrada como un byte.
nextDouble() Recupera la entrada como un double.
nextFloat() Recupera la entrada como un float.
nextInt() Recupera la entrada como un int.
nextLine() Recupera la siguiente lnea de datos y la regresa como un String.
nextLong() Recupera la entrada como un long.
nextShort() Recupera la entrada como un short.

Cuadro 1: metodos utiles de la clase Scanner

Lnea 8 Usa el metodo nextLine() para recuperar una lnea de texto desde el teclado y lo guarda
en la variable nom.

Lnea 10 Usa el metodo nextInt() para recuperar un entero desde el teclado y lo guarda en la
variable edad.

1 import j a v a . u t i l . Scanner ;
2 public c l a s s O b t e n e r I n f o U s u a r i o {
3 public s t a t i c void main ( S t r i n g [ ] a r g s ) {
4 S t r i n g nom ;
5 int edad ;
6 Scanner d i s p E n t r = new Scanner ( System . i n ) ;
7 System . out . p r i n t ( I n g r e s a tu nombre : ) ;
8 nom = d i s p E n t r . n e x t L i n e ( ) ;
9 System . out . p r i n t ( I n g r e s a tu edad : ) ;
10 edad = d i s p E n t r . n e x t I n t ( ) ;
11 System . out . p r i n t l n ( Tu nombre e s + nom +
12 y t i e n e s + edad + an o s . ) ;
13 }
14 }

Codigo 1: clase ObtenerInfoUsuario

Si se usa algun metodo de la clase Scanner y el siguiente token no puede ser convertido, se
recibe un mensaje de error.

Actividad 1. Ejecutar el codigo 1 y cuando pida la edad ingresar un valor que no sea entero.
Anotar el mensaje de error obtenido.

Las cadenas literales contenidas en las sentencias print() que aparecen antes de cada sentencia
de entrada son ejemplos de prompts (mensajes). Un prompt es un mensaje mostrado para el
usuario que pide y describe la entrada. No son necesarios pero hacen la aplicacion amigable.

Se puede escribir un solo prompt que pida multiples valores de entrada por ejemplo, Por favor
ingresa tu edad, peso, codigo postal. El usuario debera entonces ingresar tres valores separados
con espacios, tabuladores o presionando la tecla Intro. Nota: pidiendo al usuario que ingrese valores
multiples hace que se cometan errores. Es una mejor practica separar cada prompt por cada valor
de entrada pedido.

2
Actividad 2. Escribir la aplicacion TresDatos donde un prompt pide 3 valores (edad, peso,
codigo postal) y muestra los valores ingresados por el usuario. Los 3 valores seran enteros, excepto
para el peso que sera tipo punto flotante simple (float).

1.1. nextLine() despues de otros metodos de Scanner

Se puede presentar un problema cuando se usa alguno de los metodos de recuperacion de tipo
numerico de Scanner antes del metodo nextLine().

Actividad 3. Modificar el codigo 1 para que pida primero la edad y despues el nombre. Ejecutar
el programa y anotar la salida.

Cuando se ingresan caracteres usando el teclado, estos son guardados temporalmente en una
localidad de memoria llamada el bufer del teclado, tambien se le conoce como bufer adelantado.
Todas las teclas presionadas son guardadas en el bufer, incluyendo la tecla Intro. La forma como
los metodos de recuperacion de la clase Scanner difieren entre ellos son:

Los metodos, como next(), nextInt(), y nextDouble() recuperan el siguiente token en el


bufer hasta antes del siguiente blanco, el cual puede ser un espacio, tabulador, o Intro.
El metodo nextLine() lee todos los datos incluyendo el caracter de la tecla Intro.

Por lo anterior, cuando se pide al usuario un entero, y este ingresa 28 e Intro. La llamada del
metodo nextInt() recupera el 28 y deja el Intro en el bufer del teclado. Si enseguida se pide una
cadena y se llama al metodo nextLine() se recupera el Intro que estaba en el bufer, y entonces
el usuario ya no puede ingresar nada (observaste que esto paso al ejecutar la aplicacion de la
actividad 3? )

Para arreglar la situacion descrita, despues de cada llamada a next(), nextInt(), o nextDouble()
se puede agregar una llamada al metodo nextLine() que recupere el Intro que se quedo en el bufer
del teclado.

Actividad 4. Modificar el codigo de la actividad 3 agregando despues de la llamada del metodo


nextInt() una llamada al metodo nextLine() (no es necesario asignar a alguna variable lo que
recupera la llamada que se agrego).

Actividad 5. Escribir una aplicacion que pida los 6 tipos primitivos numericos y el tipo
boolean.

2. Uso de la clase JOptionPane para entrada desde la GUI

Se puede aceptar entrada en un cuadro de dialogo GUI (Graphical User Interface interfaz grafica
de usuario) usando la clase JOptionPane.

Los dos cuadros de dialogo que pueden ser usados para aceptar la entrada del usuario son:

InputDialog pide al usuario un texto de entrada.

3
ConfirmDialog pide al usuario responder una pregunta usando botones (Si, No, Cancelar)
para responder.

2.1. Cuadros de dialogo de entrada

Un cuadro de dialogo de entrada hace una pregunta y proporciona un campo de texto para que
el usuario pueda dar su respuesta. Se crean los cuadros de dialogo de entrada usando el metodo
showInputDialog(). Hay seis versiones disponibles de este metodo, pero la version mas simple usa
un solo argumento que es el mensaje que se quiere mostrar dentro del cuadro de dialogo.

Por ejemplo, el codigo 2 es una aplicacion que crea un cuadro de dialogo de entrada con un
mensaje para pedir el nombre. Despues de que el usuario ingresa el nombre y pulsa el boton Aceptar
o la tecla Intro, se concatena un saludo con el nombre y se muestra en cuadro de dialogo.

Actividad 6. Ejecutar la aplicacion del codigo2 y dibujar los cuadros que se muestren.
1 import j a v a x . swing . JOptionPane ;
2 public c l a s s DialogoHolaNombre {
3 public s t a t i c void main ( S t r i n g [ ] a r g s ) {
4 String resultado ;
5 r e s u l t a d o = JOptionPane . s ho wI np ut Di al og ( null , Como t e l l a m a s ? ) ;
6 JOptionPane . showMessageDialog ( null , Hola , + r e s u l t a d o + ! ) ;
7 }
8 }
Codigo 2: clase DialogoHolaNombre

Una version del metodo showInputDialog() permite controlar la apariencia del cuadro de
dialogo de entrada. Esta version es la que requiere cuatro argumentos, y son para lo siguiente:

El componente padre, el cual es el componente pantalla, como una ventana, en frente del cual
aparecera el cuadro de dialogo. Si este argumento es null, el cuadro de dialogo estara centrado
en la pantalla.

El mensaje que se muestra al usuario usando un String pero puede ser cualquier tipo de
objeto.

El ttulo que sera mostrado en la barra de ttulo del cuadro de dialogo de entrada.

Un campo de clase describiendo el tipo de cuadro de dialogo; pudiendo ser alguno de los
siguientes: ERROR MESSAGE, INFORMATION MESSAGE, PLAIN MESSAGE, QUESTION MESSAGE, y
WARNING MESSAGE,

El codigo 3 muestra el uso del cuadro de dialogo con cuatro argumentos.


1 JOptionPane . sh ow In pu tDi al og ( null ,
2 Que edad t i e n e s ? ,
3 I n f o r m a c i on p e r s o n a l ,
4 JOptionPane .QUESTION MESSAGE ) ;
Codigo 3: cuadro de dialogo con 4 argumentos

4
Actividad 7. Modificar el codigo 2 para reemplazar el metodo showInputDialog() con el
codigo 3. Ejecutar y dibujar el cuadro de dialogo de entrada.

Los cuadros de dialogo de entrada regresan un objeto String. Si se quiere usar el valor que
el usuario ingreso como un numero, entonces el String debera ser convertido. Para convertir un
String a un tipo int o double, se deben usar metodos de las clases Integer y Double. Estas dos
ultimas clases son llamadas type-wrapper (tipo envoltura). Para obtener un valor double se usa el
metodo Double.parseDouble(String), y para obtener un int el metodo Integer.parseInt(String).

Actividad 8. Escribir una aplicacion que pida al usuario su edad usando un cuadro de dialogo
de entrada y en otro cuadro de dialogo muestre la edad del usuario multiplicada por dos. No olvidar
que la cadena que devuelve el cuadro de dialogo de entrada debe ser convertida a un tipo int y
que el operador para multiplicar es * (ver seccion 3).

2.2. Cuadros de dialogo de confirmacion

Si se quiere que la entrada del usuario no sea con el teclado, se pueden presentar botones para
que el usuario pulse sobre alguno de estos para confirmar una opcion. Un cuadro de dialogo de
confirmacion presenta los botones Si , No , y Cancelar , el cual puede ser creado usando algunas
de las cuatro versiones del metodo showConfirmDialog() de la clase JoptionPane. Este metodo
devuelve un entero siendo alguno de los siguientes tres valores posibles: JOptionPane.YES OPTION,
JOptionPane.NO OPTION, o JOptionPane.CANCEL OPTION. El codigo 4 muestra una aplicacion que
pide al usuario contestar una pregunta. La sentencia que inicia en la lnea 6 y termina en la lnea
7 muestra el cuadro de dialogo. La respuesta del usuario se guarda en la variable entera llamada
seleccion.
1 import j a v a x . swing . JOptionPane ;
2 public c l a s s D i a l o g o A e r o l i n e a {
3 public s t a t i c void main ( S t r i n g [ ] a r g s ) {
4 int s e l e c c i o n ;
5 boolean e s S i ;
6 s e l e c c i o n = JOptionPane . showConfirmDialog ( null ,
7 Desea a s c e n d e r a p r i m e r a c l a s e ? ) ;
8 e s S i = ( s e l e c c i o n == JOptionPane . YES\ OPTION ) ;
9 JOptionPane . showMessageDialog ( null ,
10 Usted r e s p o n d i o + e s S i ) ;
11 }
12 }

Codigo 4: cuadro de dialogo con 4 argumentos

Actividad 9. Ejecutar la aplicacion del codigo 4 y dibujar el cuadro de dialogo de confirmacion.

3. Aritmetica

El cuadro 2 describe los cinco operadores aritmeticos estandar que se usan para realizar calculos
con valores. Un valor usado en cada lado de un operador es un operando. Los operadores mostrados
son operadores binarios.

5
Operador Descripcion Ejemplo
+ Suma 17 + 3, el resultado es 20
- Resta 17 3, el resultado es 14
* Producto 17 3, el resultado es 51
/ Division 17.0/3, el resultado es 5.666667
17/3, el resultado es 5
% Residuo 17 %3, el resultado es 2

Cuadro 2: operadores aritmeticos

Las operaciones son hechas siempre por Java con operandos del mismo tipo y el resultado es
del mismo tipo de los operandos. Por ejemplo, 17/3 es 5 porque se realiza una division entera (sin
ninguna parte fraccional), y 17.0/3 antes de que sea realizada, Java ajusta la precision a la del
operando de mayor precision, de esta forma se hace 17.0/3.0 y devuelve 5.6666667.

Actividad 10. Escribir la aplicacion SeisOperacionesBinarias para obtener los valores que
son mostrados en el cuadro 2

3.1. Asociatividad y precedencia

La asociatividad de los operadores aritmeticos con la misma precedencia es de izquierda a


derecha. En la sentencia respuesta = x + y + z; la x e y son sumados primero, obteniendo un
resultado temporal, que despues es agregado a z, y esta suma es la que se asigna a respuesta.

La precedencia del operador se refiere al orden en el cual partes de la expresion matematica son
evaluadas. La multiplicacion, la division, y el residuo tienen la misma precedencia, y su precedencia
es mayor que la suma y la resta. La suma y la resta tienen la misma precedencia. La precedencia
se puede modificar usando parentesis, es decir, tienen el mismo uso que en las matematicas.

Actividad 11. Escribir la aplicacion Operaciones para que se obtenga el resultado de las si-
guientes operaciones. Justificar los resultados obtenidos de acuerdo a la asociatividad y precedencia
de los operadores.

2+3*4
(2+3)*4
2*(3+(4*5))
25/8*3

3.2. Imprecision de los numeros flotantes

Los valores enteros en Java son exactos, pero los numeros de punto flotante frecuentemente son
solo aproximaciones ya que no pueden ser representados de forma precisa en formato binario en los
sistemas de computo. Estas imprecisiones llevan a varios problemas:

Cuando se genera salida de punto flotante, no podra ser lo que se esperara ver.

6
Cuando se hacen comparaciones con numeros de punto flotante, no podran ser lo que se
esperara obtener.

1 public c l a s s DemoImprecision {
2
3 public s t a t i c void main ( S t r i n g [ ] a r g s ) {
4 double r e s p u e s t a = 2 . 2 0 2 . 0 0 ;
5 boolean e s I g u a l = r e s p u e s t a == 0 . 2 0 ;
6 System . out . p r i n t l n ( r e s p u e s t a e s + r e s p u e s t a ) ;
7 System . out . p r i n t l n ( e s I g u a l e s + e s I g u a l ) ;
8 }
9 }

Codigo 5: Programa DemoImprecision

Actividad 12. Ejecutar el programa del codigo 5 y justificar la razon del mensaje en la salida
estandar esIgual es false.

Actividad 13. Escribir una aplicacion que pida al usuario dos numeros punto flotante de doble
precision y promedie estos dos valores. Ejecutar esta aplicacion con 15.5 y 3.4, y despues con 16.4
y 2.2. Que promedios son obtenidos? Obtener el promedio con una calculadora y comentar los
resultados de la aplicacion contra los de la calculadora.

También podría gustarte