datoscomputo.fismat.umich.mx/computacion/computacion1/... · 2016. 11. 14. · ocho tipos...

21
Datos H. Tejeda Noviembre 2016 ´ Indice 1. Declaraci´ on y uso de constantes y variables 1 2. Tipos de datos enteros 7 3. Tipo de dato boolean 8 4. Tipos de datos de punto flotante 9 5. Tipo de dato char 10 6. Clase Scanner para entrada desde el teclado 12 7. Uso de la clase JOptionPane para entrada desde la GUI 15 8. Aritm´ etica 17 9. Conversi´on de tipos 18 1. Declaraci´ on y uso de constantes y variables Un elemento de datos es constante cuando su valor no puede ser cambiado durante la ejecuci´ on de un progroma. Por ejemplo, cuando se incluye la siguiente sentencia en una clase Java, el n´ umero 1234 es una constante: 1

Upload: others

Post on 22-Jan-2021

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Datoscomputo.fismat.umich.mx/computacion/computacion1/... · 2016. 11. 14. · ocho tipos primitivos de datos. Un tipo primitivo es el tipo de dato m as simple. Enseguida se describen

Datos

H. Tejeda

Noviembre 2016

Indice

1. Declaracion y uso de constantes y variables 1

2. Tipos de datos enteros 7

3. Tipo de dato boolean 8

4. Tipos de datos de punto flotante 9

5. Tipo de dato char 10

6. Clase Scanner para entrada desde el teclado 12

7. Uso de la clase JOptionPane para entrada desde la GUI 15

8. Aritmetica 17

9. Conversion de tipos 18

1. Declaracion y uso de constantes y variables

Un elemento de datos es constante cuando su valor no puede ser cambiado durante laejecucion de un progroma. Por ejemplo, cuando se incluye la siguiente sentencia en una claseJava, el numero 1234 es una constante:

1

Page 2: Datoscomputo.fismat.umich.mx/computacion/computacion1/... · 2016. 11. 14. · ocho tipos primitivos de datos. Un tipo primitivo es el tipo de dato m as simple. Enseguida se describen

System.out.println(1234);

Cada vez que la aplicacion sea ejecutada el valor 1234 es mostrado. Los programadores serefieren al 1234 como constante literal porque su valor es tomado literalmente en cadauso. El numero 1234 es tambien llamado una constante numerica como opuesto a unaconstante caracter o cadena. Ademas, es una constante sin nombre como opuesta a unacon nombre, porque no hay un identificador asociado con esta.

Se puede configurar un elemento de datos para ser variable. Una variable es una localidadde memoria que puede guardar un valor. Una variable puede tener solo un valor a la vez,pero el valor que tiene puede cambiar.

Ya sea que el elemento de datos sea variable o constante, en Java este siempre tiene un tipo dedato. El tipo de dato de un elemento indica el tipo de dato que puede ser guardado, cuantamemoria ocupa, y que tipos de operaciones pueden hacerse con el dato. Java proporcionaocho tipos primitivos de datos. Un tipo primitivo es el tipo de dato mas simple. Enseguidase describen los ocho tipos:

Palabra Descripcionreservada

byte entero tamano byteshort entero cortoint entero (defecto)long entero largofloat punto flotante, precision simpledouble punto flotante, precision doble (defecto)char un solo caracter

boolean un valor boolean (true o false)

Los tipos primitivos tambien sirven como ladrillos para tipos de datos mas complejos, lla-mados tipos referencia, los cuales guardan direcciones de memoria. Las clases que serancreadas son ejemplos de tipos de referencias, como la clase Scanner que es revisada masadelante.

1.1. Declaracion de variables

Una declaracion de variable es una sentencia que reserva una localidad nombrada dememoria e tiene lo siguiente:

Un tipo de dato que identifica el tipo de dato que la variable guardara.

Una identificador que es el nombre de la variable.

2

Page 3: Datoscomputo.fismat.umich.mx/computacion/computacion1/... · 2016. 11. 14. · ocho tipos primitivos de datos. Un tipo primitivo es el tipo de dato m as simple. Enseguida se describen

Un operador de asignacion opcional y un valor asignado, si se quiere que la variablecontenga un valor inicial.

Un punto y coma como terminador.

Los nombres de variables observan las mismas reglas para nombrar identificadores legales declase, esto es, inician con una letra y no pueden ser una palabra reservada. Se debe declararuna variable antes de poder usarla. Se puede declarar una variable en cualquier punto antesde usarla, pero es una practica declarar primero las variables en un metodo y luego ponerlas sentencias ejecutables. Java es un lenguaje fuertemente tipado, o uno en el cual cadavariable tiene un tipo de dato bien definido que limita las operaciones que se pueden realizarcon este: esto tambien ımplica que todas las variables deben ser declaradas antes de quepuedan usarse.

Por convencion los nombres de la variables inician con letras minusculas para distinguirlasde los nombres de las clases. Se emplea tambien el estilo caja camello superior donde sepone se capitalizan las siguientes palabras del identificador.

El siguiente ejemplo declara una tipo de variable int llamado miEdad y le asigna un valorinicial de 18:

int miEdad = 18;

Esta declaracion es una sentencia completa y ejecutable, por lo que termina con punto ycoma. El sımbolo de igual (=) es el operador de asignacion. Cualquier valor a la derechadel signo de igual es asignado a la variable a la izquierda del signo igual. Una asignacionhecha cuando se declara una variable es una inicializacion; darle el valor despues es solouna asignacion. Para el siguiente codigo, la primera sentencia es una inicializacion, y lasegunda es una asignacion:

int miEdad = 18;

miEdad = 21;

Se declara una variable una sola vez, pero se le podrıan asignar valores nuevos las veces quese requiera.

Observar que una expresion con una literal a la izquierda del operador de asignacion, como en21 = miEdad, es ilegal. El operador de asignacion tiene una asociatividad derecha-izquierda.La asociatividad indica el orden en el cual los operadores son usados con operadores. Laasociatividad puede ser derecha-izquierda o izquierda-derecha. Un identificador que puedeaparecer en el lado izquierdo de un operador de asignacion en ocasiones es referido como unlvalue . Una constante numerica como 18 no es un lvalue; solo es un rvalue , o un dato quepuede aparecer solo en el lado derecho de un operador de asignacion. Una variable puede serusada como un lvalue o un rvalue.

3

Page 4: Datoscomputo.fismat.umich.mx/computacion/computacion1/... · 2016. 11. 14. · ocho tipos primitivos de datos. Un tipo primitivo es el tipo de dato m as simple. Enseguida se describen

Cuando se declara una variable dentro de un metodo pero no se le asigna valor, es unavariable no inicializada, Por ejemplo, la siguiente declaracion de variable indica un tipoint con el nombre miEdad, pero no hay valor asignado al momento de su creacion:

int miEdad;

Una variable no inicializada contiene un valor desconocido llamado un valor basura. Javaprotege de usar inadvertidamente el valor basura que esta guardado en una variable noinicializada, ya que se recibe, al compilar, un error indicando que la variable podrıa no estarinicializada.

Nota. Las variables declaradas en una clase, fuera de cualquier metodo, son inicializadas

automaticamente.

Se pueden declarar variables multiples del mismo tipo en sentencias separadas. Tambiense puede declarar dos, o mas, variables del mismo tipo en una sola sentencia separando ladeclaraciones de variable con una coma, como se muestra enseguida:

int miEdad = 18, tuEdad = 15;

Por convencion, los programadores declaran la mayorıa de las variables en variables separa-das. Se deberıan declarar variables multiples en la misma sentencia solo si estan relacionadasestrechamente.

En el caso de que se quieran declarar variables de tipos diferentes, se debe usar una sentenciaseparada para cada tipo.

1.2. Constantes con nombre

Una variable es una localidad nombrada de memoria para la cual el contenido puede cambiar.Si un valor de una localidad no deberıa cambiar en la ejecucion de un programa, esta puedeser creada para ser una constante con nombre. Tambien es conocida com una constantesimbolica. Una constante con nombre es parecida a una variable en cuanto a que tiene untipo de dato, un nombre y un valor. Una constante con nombre difiere de una variable en:

En la sentencia de declaracion, el tipo de dato de una constante con nombre es precedidapor la palabra reservada final.

A una constante con nombre solo se le puede asignar un valor una sola vez, y luego estenunca puede ser cambiado. Se inicializa la constante con nombre usualmente cuandose declara, si no se hace, se le conoce como final blanco, y se puede asignar un valordespues, pero antes de ser usada.

4

Page 5: Datoscomputo.fismat.umich.mx/computacion/computacion1/... · 2016. 11. 14. · ocho tipos primitivos de datos. Un tipo primitivo es el tipo de dato m as simple. Enseguida se describen

Por convencion los identificadores de las constantes con nombres usan solo mayusculas,y los guiones bajos se usan para separar palabras, como en el siguiente ejemplo.

final int CANT_DE_SALONES = 20;

final double PI = 3.14159;

final double IMPUESTO = 0.15;

final string UNIVERSIDAD = "UMSNH";

Las razones para usar una constante con nombre en vez de una literal son:

Usar constantes con nombre hace la lectura y la comprension de los programas masfacil.

Es mas facil cambiar solo el valor de una constante con nombre que un conjunto deliterales que aparezcan en un programa.

El uso de constantes con nombre reduce la cantidad de errores tipograficos.

Cuando se usa una constante con nombre en una expresion, esta destaca de una varia-ble.

1.3. Alcance de variables y constantes

El alcance de un elemento de datos es el area en el cual es visible a un programa y en elcual se puede referir a este usando un identificador simple. Una variable o constante esta enel alcance desde el lugar donde esta declarado hasta el final del bloque de codigo en la cualla declaracion se encuentra. Un bloque de codigo es el codigo contenido entre un conjuntode llaves. Ası, si se declara una variable o constante dentro de un metodo, este puede serusado desde su declaracion hasta el final del metodo, no importando que el metodo contengoconjuntos multiples de llaves. Entonces, un elemento de datos es usable solo hasta el finaldel bloque que tiene la declaracion.

1.4. Concatenar cadenas a variables y constantes

Se puede mostrar una variable o una cadena en una sentencia print() o println() sola oen combinacion con una cadena. Por ejemplo, la clase MostrarNumeros, codigo 1, declaraun entero diaDeCorte, inicializado a 5 en la lınea 3, luego este es enviado solo al metodoprint() en la lınea 5; en las lıneas 7-8 es combinado, o concatenado, a un String. EnJava, cuando una variable numerica es concantenada a un String con el sımbolo mas, laexpresion completa es convertida a una String

5

Page 6: Datoscomputo.fismat.umich.mx/computacion/computacion1/... · 2016. 11. 14. · ocho tipos primitivos de datos. Un tipo primitivo es el tipo de dato m as simple. Enseguida se describen

1 public class MostrarNumeros {2 public stat ic void main ( St r ing [ ] a rgs ) {3 int diaDeCorte = 5 ;4 System . out . p r i n t ( ”Las f a c t u r a s son mandadas e l dıa ” ) ;5 System . out . p r i n t ( diaDeCorte ) ;6 System . out . p r i n t l n ( ” de l mes” ) ;7 System . out . p r i n t l n ( ” S i g u i e n t e f a c t u r a : d ic iembre ” +8 diaDeCorte ) ;9 }

10 }

Codigo 1: clase MostrarNumeros

La salida del codigo anterior debe mostrar algo como lo siguiente:

Las facturas son mandadas el dıa 5 del mes

Siguiente factura: diciembre 5

Cuando se concatena un String con numeros, la expresion entera es un String. Por lotanto la expresion "A" + 3 + 4 da el String "A34". Si la intencion es crear el String A7,entonces se deben agregar parentesis para escribir "A" + (3 + 4).

La clase DialogoNumeros, codigo 2, usa el metodo showMessageDialog() dos veces paramostrar un entero declarado como diasCredito e inicializada a 30. En cada sentencia delas lıneas 5 y 6, la variable numerica es concatenada a un String, haciendo que el segundoargumento un String. En la lınea 5, el String concatenado es un String vacıo, o String

null, creado con un conjunto de comillas dobles sin nada dentro de estas. El primer cuadrode dialogo solo muestra el valor 30, y el segundo muestra la concatenacion con cadenas nonulas.

1 import javax . swing . JOptionPane ;2 public class DialogoNumeros {3 public stat ic void main ( St r ing [ ] a rgs ) {4 int d ia sCred i to = 30 ;5 JOptionPane . showMessageDialog (null , ”” + d ia sCred i to ) ;6 JOptionPane . showMessageDialog7 (null , ”Cada f a c t u r a es por ” + d ia sCred i to + ” d ia s ” ) ;8 }9 }

Codigo 2: clase DialogoNumeros

1.5. Error al intercambiar valores

Cada constante solo puede tener un valor en la duracion del programa; cada variable puedetener solo un valor a la vez. En el siguiente extracto de codigo, se tiene en cuenta lo anterior,

6

Page 7: Datoscomputo.fismat.umich.mx/computacion/computacion1/... · 2016. 11. 14. · ocho tipos primitivos de datos. Un tipo primitivo es el tipo de dato m as simple. Enseguida se describen

para intercambiar los valores que tienen las variables x e y, usando como variable auxiliar az.

int x = 2, y = 10, z;

z = x;

x = y;

y = z;

2. Tipos de datos enteros

Se pueden usar variables de tipo byte, short, int, y long para guardar enteros en Java; unentero puede representar un subconjunto finito de los numeros enteros.

El tipo de dato int es el tipo de entero mas usado. Una variable de tipo int puede contenercualquier valor entero desde -2,147,483,648 hasta +2,147,483,647. Cuando se asigna un valora una variable int, no se ponen comas ni puntos, se ponen solo dıgitos y un signo mas omenos opcional para indicar o entero positivo y negativo.

Nota. Los valores enteros legales estan de −231 hasta 231 − 1. Estos son los valores mas

grandes y mas bajos que se pueden guardar en cuatro bytes de memoria,el cual es el tamano

de una variable int.

Los tipos byte, short, y long son variaciones del tipo entero. Los tipos byte y short ocupanmenos memoria y puede contener solo valores pequenos; el tipo long ocupa mas memoria ypuede manejar valores mas grandes. La siguiente tabla muestra el lımite superior e inferiorde estos tipos.

Tipo Valor Valor TamanoMınimo Maximo en bytes

byte -128 127 1short -32,768 32,767 2int −2,147,483,648 2,147,483,647 4long −9,223,372,036,854,775,808 −9,223,372,036,854,775,807 8

Se debe escoger apropiadamente los tipos para las variables que seran usadas en una apli-cacion. Si se intenta asignar un valor que mas grande para el tipo de dato de la variable, elcompilador emite un mensaje de error, por lo que la aplicacion no se ejecuta. Si se escogeun tipo de dato que es mayor que el que se ocupa, se desperdicia memoria. Por ejemplo,una aplicacion personal podrıa usar una variable byte para la cantidad de dependientes, unshort para las horas trabajadas en un mes, 127 no es suficiente, y un int para un salarioanual.

7

Page 8: Datoscomputo.fismat.umich.mx/computacion/computacion1/... · 2016. 11. 14. · ocho tipos primitivos de datos. Un tipo primitivo es el tipo de dato m as simple. Enseguida se describen

Si una aplicacion usa un entero constante literal, como 987, el numero es un int por defecto.Si se necesita usar una constante mayor que 2,147,483,647, o menor que -2,147,483,648, sedebe seguir el numero con la letra L, o l, para indicar tipo long. Se prefiere L para evitarconfusion con el dıgito 1. Por ejemplo, la siguiente sentencia guarda un numero que es mayorque el lımite maximo para el tipo int.

long mosquitosEnBosquesDelNorte = 2444555999L;

No se requiere algun caracter para guardar una constante numerica en un int, byte, o short.

3. Tipo de dato boolean

La logica de Boole o booleana esta basada en comparaciones falso-verdadero. Una variablebooleana puede contener solo uno de dos valores, true o false. Las siguientes sentenciasdeclaran y asignan valores apropiados a variables booleanas:

boolean esDıaDePago = false;

boolean estasQuebrado = true;

Tambien se pueden asignar valores obtenidos de comparaciones a variables booleanas. Sesoportan seis operadores relacionales en Java para realizar comparaciones. Un operadorrelacional compara dos elementos; es tambien llamado a veces operador de comparacion.Una expresion que contenga un operador relacional da un valor booleano. En la siguientetabla se describen los operadores relacionales.

Operador Descripcion Ejemplo Ejemploverdadero falso

< menor que 1 < 2 2 < 1> mayor que 10 > 3 3 > 10

== igual a 5 == 5 5 == 6<= menor que o igual a 7 <= 7 9 <= 8>= mayor que o igual a 7 >= 4 1 >= 3! = diferente a 5!=6 5 == 5

Cuando se usa alguno de los operadores relacionales con dos sımbolos, como ==, <=, >=, o !=,no se puede poner ningun espacio blanco entre los dos sımbolos. Tampoco se puede invertirel orden de los sımbolos, ası =<, => y =! no son operadores validos.

Sentencias validas de declaracion podrıan incluir expresiones con operadores relacionales:

8

Page 9: Datoscomputo.fismat.umich.mx/computacion/computacion1/... · 2016. 11. 14. · ocho tipos primitivos de datos. Un tipo primitivo es el tipo de dato m as simple. Enseguida se describen

boolean esCincoMenorOIgual = (5 <= 3);

// valor guardado sera false

Las expresiones booleanas tienen mas sentido cuando variables, a las cuales se le han asignadovalores, son usadas en las comparaciones, como en los siguientes ejemplos.

boolean esHorasExtras = (horas > 40);

boolean esLimiteSuperiorImpuesto = (ingreso > 1000000);

boolean esPrimerPuntuacionMayor = (puntuacion1 > puntuacion2);

4. Tipos de datos de punto flotante

Un numero punto flotante contiene posiciones decimales. Java soporta dos tipos de datopunto flotante: float y double. Un tipo de dato float puede guardar valores punto flotantehasta con una precision de 6 o 7 dıgitos significativos. Un tipo de dato double requiere masmemoria que un float y puede contener de 14 a 15 dıgitos significativos de precision. Eltermino dıgitos significativos se refiere a la precision matematica de un valor. Por ejemplo,un float dado con el valor de 0.324516789 es mostrado como 0.324517 porque el valor espreciso solo hasta la sexta posicion decimal. El valor maximo para un double es 3.4x1038.

Nota. Un float dado con el valor 324516789 es mostrado como 3.24617e+008, lo cual

es 324517000. La e en el valor mostrado es para el exponente; el +008 indica que el punto

decimal esta ocho posiciones a la derecha de donde fue muestrado. En caso de ser negativo

indica que el punto decimal esta a la izquierda, indicando un numero muy pequeno. Este

formato es llamado notacion cientıfica.

Nota. Un programador podrıa escoger guardar un valor como float en vez de double

para ahorrar memoria. Sin embargo, si niveles altos de precision son necesarios, se deberıa

escoger double.

Una constante punto flotante, como 15.67, es un double por defecto. Para indicar que unaconstante numerica punto flotante es un float, se puede poner la letra F, o f, despues delnumero, como en:

float monedero = 23.50F;

Se puede tambien poner D o d despues de una constante de punto flotante para indicarque es un double, pero como es el tipo por defecto en puntos flotantes, si no se poneası sera guardada.

9

Page 10: Datoscomputo.fismat.umich.mx/computacion/computacion1/... · 2016. 11. 14. · ocho tipos primitivos de datos. Un tipo primitivo es el tipo de dato m as simple. Enseguida se describen

5. Tipo de dato char

Se usa el tipo de dato char para guardar un solo caracter cualquiera. Se encierran losvalores de caracteres constantes entre comillas simples. Las siguientes son declaraciones decaracteres:

char inicialPaterno = ’L’;

char calificacionComputacionI = ’A’;

char unaEstrella = ’*’;

Un caracter puede ser cualquier letra, signo de puntuacion, o dıgito. Un caracter que es undıgito es guardado en la memoria de forma diferente a un valor numerico que represente elmismo dıgito. Por ejemplo, las siguientes dos sentencias son legales:

char unValorChar = ’7’;

int unValorInt = 7;

Si se muestran cada uno de estos valores usando el metodo println(), se vera un 7. Pero,solo el valor numerico, unValorInt, puede ser usado para representar el valor 9 en sentenciasaritmeticas.

Una constante numerica puede ser guardada en una variable caracter y un caracter querepresente un numero puede ser guardado en una variable numerica. Las siguientes dossentencias son legales, pero al menos que se entienda su significado, podrıan dar resultadosno deseados:

char unValorChar = 7;

int unValorInt = ’7’;

Si estas variables son mostradas con println(), entonces el resultado de la salida sera unblanco para unValorChar y el numero 55 para unValorInt. El sistema operativo Linuxguarda cada caracter como un numero o codigo; a cada caracter se le asigna un codigonumerico unico usando Unicode. Por ejemplo, el caracter A es guardado usando el valor 65,y B con el valor 66.

Una variable de tipo char puede guardar solo un caracter. Para guardar un cadena decaracteres, tales como el nombre de una persona, se debe usar una estructura de datosllamada String. En Java, String es una clase incorporada que da los medios para guardary manipular cadenas de caracteres. Las constantes String son escritas entre comillas dobles.Por ejemplo, la expresion que guarda el nombre Miguel como una cada en una variablellamada primerNombre es:

String primerNombre = "Miguel";

10

Page 11: Datoscomputo.fismat.umich.mx/computacion/computacion1/... · 2016. 11. 14. · ocho tipos primitivos de datos. Un tipo primitivo es el tipo de dato m as simple. Enseguida se describen

Tambien se puede guardar caracteres no imprimibles, como retroceso o tabulador, en unavariable char. Para estos caracteres se tiene que usar una secuencia de escape, la cualinicia con una diagonal invertida seguida por un caracter, ası la pareja representa un solocaracter. El siguiente codigo guarda un caracter de nueva lınea y de tabulador:

char unCarNuevaLınea = ’\n’;

char unCarTabulador = ’\t’;

En la siguiente tabla se describe algunas secuencias de escape comunes que se pueden usaren la salida de la ventana de comandos en Java.

Secuenciade escape Descripcion

\b Retroceso; mueve el cursor un espacio a la izquierda\t Tabulador; mueve el cursor a la siguiente parada de tabulacion\n Nueva lınea; mueve el cursor al inicio de la siguiente lınea\r Retorno de carro; mueve el cursor al inicio de la lınea actual\" Comillas dobles; muestra el sımbolo de comillas dobles\’ Comilla simple, muestra el sımbolo de comilla simple\\ Diagonal invertida; muestra el caracter diagonal invertida

Nota. Cuando se muestran valores con cuadros de dialogo JOptionPane en vez de la

ventana de comandos, la secuencias de escape nueva lınea, comillas dobles y diagonal

invertida funcionan como se espera, pero retroceso, tabulador, y retorno de carro no lo

hacen.

Cuando se quieren generar salida en lıneas multiples en la ventana de comandos, se puedehacer de dos formas. Se puede usar la secuencia de escape nueva lınea, o se puede usar elmetodo println() varias veces. Las siguientes dos clases producen el mismo resultado.

public class HolaMundoNuevaLinea {

public static void main(String[] args) {

System.out.println("Hola\nmundo");

}

}

public class HolaMundoDosPrintln {

public static void main(String[] args) {

System.out.println("Hola");

System.out.println("mundo");

}

}

11

Page 12: Datoscomputo.fismat.umich.mx/computacion/computacion1/... · 2016. 11. 14. · ocho tipos primitivos de datos. Un tipo primitivo es el tipo de dato m as simple. Enseguida se describen

De las dos clases anteriores, la clase HolaMundoNuevaLinea es mas eficiente, desde el puntode vista de tecleado de codigo, ya que el metodo System.out.println() aparece una solavez, y desde el punto de vista del compilador tambien porque el metodo es llamado una solavez. pero quizas la clase HolaMundoDosPrintln es mas facil de leer y entender.

Nota. El metodo println() usar el caracter terminador de lınea de la plataforma local, el

cual podrıa ser o no el caracter nueva lınea.

6. Clase Scanner para entrada desde el teclado

Se pueden asignar valores a las variables al ser declaradas, pero los programas son mas utilescuando el usuario puede dar valores diferentes a las variables cada vez que el programa seejecuta. Para crear programas interactivos que acepten la entrada de un usuario, se puedeusar 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 cualespueden mostrar diferentes tipos de datos (double, int, o String). System.in esta disenadosolo 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 sentenciacomo 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 deentrada por defecto.La palabra clave new se requiere siempre que se crean objetos a diferenciade 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 separadodel siguiente conjunto por un blanco. Frecuentemente esto significa que el dato es aceptadocuando el usuario presiona la tecla Intro, pero podrıa significar tambien que el token seaaceptado despues del espacio o el tabulador. La tabla siguiente resume algunos de los metodosmas utiles que leen diferentes tipos de datos desde el dispositivo de entrada por default.

12

Page 13: Datoscomputo.fismat.umich.mx/computacion/computacion1/... · 2016. 11. 14. · ocho tipos primitivos de datos. Un tipo primitivo es el tipo de dato m as simple. Enseguida se describen

Metodo Descripcionnext() 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 lınea de datos y la regresa como un String.nextLong() Recupera la entrada como un long.nextShort() Recupera la entrada como un short.

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

El codigo 3 de la clase ObtenerInfoUsuario usa dos metodos de la clase Scanner. El pro-grama lee una cadena y un entero desde el teclado y los muestra. La clase Scanner esta in-volucrada en:

Lınea 1 La sentencia importa la clase Scanner del paquete java.util y es requerida parapoder usar la clase.

Lınea 6 Declara y crea un objeto Scanner.

Lınea 8 Usa el metodo nextLine() para recuperar una lınea de texto desde el teclado y loguarda en la variable nom.

Lınea 10 Usa el metodo nextInt() para recuperar un entero desde el teclado y lo guardaen la variable edad.

1 import java . u t i l . Scanner ;2 public class ObtenerInfoUsuar io {3 public stat ic void main ( St r ing [ ] a rgs ) {4 St r ing nom ;5 int edad ;6 Scanner dispEntr = new Scanner ( System . in ) ;7 System . out . p r i n t ( ” Ingre sa tu nombre : ” ) ;8 nom = dispEntr . nextLine ( ) ;9 System . out . p r i n t ( ” Ingre sa tu edad : ” ) ;

10 edad = dispEntr . next Int ( ) ;11 System . out . p r i n t l n ( ”Tu nombre es ” + nom +12 ” y t i e n e s ” + edad + ” anos . ” ) ;13 }14 }

Codigo 3: clase ObtenerInfoUsuario

13

Page 14: Datoscomputo.fismat.umich.mx/computacion/computacion1/... · 2016. 11. 14. · ocho tipos primitivos de datos. Un tipo primitivo es el tipo de dato m as simple. Enseguida se describen

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

Las cadenas literales contenidas en las sentencias print() que aparecen antes de cada sen-tencia de entrada son ejemplos de prompts (mensajes). Un prompt es un mensaje mostradopara el usuario que pide y describe la entrada. No son necesarios pero hacen la aplicacionamigable.

Se puede escribir un solo prompt que pida multiples valores de entrada —por ejemplo, “Porfavor ingresa tu edad, peso, codigo postal”. El usuario debera entonces ingresar tres valoresseparados 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.

6.1. nextLine() despues de otros metodos de Scanner

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

Cuando se ingresan caracteres usando el teclado, estos son guardados temporalmente enuna localidad de memoria llamada el bufer del teclado, tambien se le conoce como buferadelantado. 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 tokenen el bufer hasta antes del siguiente blanco, el cual puede ser un espacio, tabulador, oIntro.

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 llamadadel metodo nextInt() recupera el 28 y deja el Intro en el bufer del teclado. Si enseguidase pide una cadena y se llama al metodo nextLine() se recupera el Intro que estaba en elbufer, y entonces el usuario ya no puede ingresar nada.

Para arreglar la situacion descrita, despues de cada llamada a next(), nextInt(), o next-

Double() se puede agregar una llamada al metodo nextLine() que recupere el Intro que sequedo en el bufer del teclado.

14

Page 15: Datoscomputo.fismat.umich.mx/computacion/computacion1/... · 2016. 11. 14. · ocho tipos primitivos de datos. Un tipo primitivo es el tipo de dato m as simple. Enseguida se describen

7. Uso de la clase JOptionPane para entrada desde la

GUI

Se puede aceptar entrada en un cuadro de dialogo GUI (Graphical User Interface) interfazgrafica 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.

ConfirmDialog pide al usuario responder una pregunta usando botones (Si, No, Can-celar) para responder.

7.1. Cuadros de dialogo de entrada

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

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

1 import javax . swing . JOptionPane ;2 public class DialogoHolaNombre {3 public stat ic void main ( St r ing [ ] a rgs ) {4 St r ing r e s u l t a d o ;5 r e s u l t a d o = JOptionPane . showInputDialog (null , ”¿Como te l lamas ?” ) ;6 JOptionPane . showMessageDialog (null , ”Hola , ¡” + r e s u l t a d o +” ! ” ) ;7 }8 }

Codigo 4: clase DialogoHolaNombre

Una version del metodo showInputDialog() permite controlar la apariencia del cuadro dedialogo 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 frentedel cual aparecera el cuadro de dialogo. Si este argumento es null, el cuadro de dialogoestara centrado en la pantalla.

15

Page 16: Datoscomputo.fismat.umich.mx/computacion/computacion1/... · 2016. 11. 14. · ocho tipos primitivos de datos. Un tipo primitivo es el tipo de dato m as simple. Enseguida se describen

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

El tıtulo que sera mostrado en la barra de tıtulo del cuadro de dialogo de entrada.

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

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

1 JOptionPane . showInputDialog (null ,2 ”¿Que edad t i e n e s ?” ,3 ” In formac i on pe r sona l ” ,4 JOptionPane .QUESTION MESSAGE) ;

Codigo 5: cuadro de dialogo con 4 argumentos

Los cuadros de dialogo de entrada regresan un objeto String. Si se quiere usar el valor queel usuario ingreso como un numero, entonces el String debera ser convertido. Para convertirun 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 valordouble se usa el metodo Double.parseDouble(String), y para obtener un int el metodoInteger.parseInt(String).

7.2. Cuadros de dialogo de confirmacion

Si se quiere que la entrada del usuario no sea con el teclado, se pueden presentar boto-nes para que el usuario pulse sobre alguno de estos para confirmar una opcion. Un cuadrode dialogo de confirmacion presenta los botones Si , No , y Cancelar , el cual puede sercreado usando algunas de las cuatro versiones del metodo showConfirmDialog() de la claseJoptionPane. Este metodo devuelve un entero siendo alguno de los siguientes tres valores po-sibles: JOptionPane.YES OPTION, JOptionPane.NO OPTION, o JOptionPane.CANCEL OPTION.El codigo 6 de la clase DialogoAerolinea muestra una aplicacion que pide al usuario contes-tar una pregunta. La sentencia que inicia en la lınea 6 y termina en la lınea 7 muestra el cuadrode dialogo. La respuesta del usuario se guarda en la variable entera llamada seleccion.

16

Page 17: Datoscomputo.fismat.umich.mx/computacion/computacion1/... · 2016. 11. 14. · ocho tipos primitivos de datos. Un tipo primitivo es el tipo de dato m as simple. Enseguida se describen

1 import javax . swing . JOptionPane ;2 public class Dia logoAero l inea {3 public stat ic void main ( St r ing [ ] a rgs ) {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 ascender a primera 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 respond i o ” + e s S i ) ;11 }12 }

Codigo 6: cuadro de dialogo con 4 argumentos

8. Aritmetica

La tabla siguiente describe los cinco operadores aritmeticos estandar que se usan para realizarcalculos con valores. Un valor usado en cada lado de un operador es un operando. Losoperadores mostrados son operadores binarios.

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

Las operaciones son hechas siempre por Java con operandos del mismo tipo y el resultado esdel 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 precisiona la del operando de mayor precision, de esta forma se hace 17.0/3.0 y devuelve 5.6666667.

8.1. Asociatividad y precedencia

La asociatividad de los operadores aritmeticos con la misma precedencia es de izquierda aderecha. En la sentencia respuesta = x + y + z; la x e y son sumados primero, obteniendoun resultado temporal, que despues es agregado a z, y esta suma es la que se asigna arespuesta.

La precedencia del operador se refiere al orden en el cual partes de la expresion matematicason evaluadas. La multiplicacion, la division, y el residuo tienen la misma precedencia, y su

17

Page 18: Datoscomputo.fismat.umich.mx/computacion/computacion1/... · 2016. 11. 14. · ocho tipos primitivos de datos. Un tipo primitivo es el tipo de dato m as simple. Enseguida se describen

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 enlas matematicas.

2+3*4

(2+3)*4

2*(3+(4*5))

25/8*3

8.2. Imprecision de los numeros flotantes

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

Cuando se genera salida de punto flotante, no podrıa ser lo que se esperarıa ver.

Cuando se hacen comparaciones con numeros de punto flotante, no podrıan ser lo quese esperarıa obtener.

Por ejemplo, el codigo 7 de la clase DemoImprecision muestra un respuesta cuando es calcula-do 2.20 - 2.00. El resultado matematico debe ser 0.20, pero la salida es 0.20000000000000018.Si se quieren eliminar las imprecisiones se pueden usar algunas de las varias tecnicas pararedondear valores.

1 public class DemoImprecision {2

3 public stat ic void main ( St r ing [ ] a rgs ) {4 double r e spue s ta = 2.20 − 2 . 0 0 ;5 boolean e s I g u a l = re spue s ta == 0 . 2 0 ;6 System . out . p r i n t l n ( ” r e spue s ta es ” + re spue s ta ) ;7 System . out . p r i n t l n ( ” e s I g u a l es ” + e s I g u a l ) ;8 }9 }

Codigo 7: Programa DemoImprecision

9. Conversion de tipos

Cuando se realiza aritmetica con variables y constantes del mismo tipo, el resultado de laoperacion retiene el mismo tipo. Frecuentemente se quiere realizar operaciones matematicascon operandos de tipos diferentes. El proceso de convertir de un tipo de datos a otro es la

18

Page 19: Datoscomputo.fismat.umich.mx/computacion/computacion1/... · 2016. 11. 14. · ocho tipos primitivos de datos. Un tipo primitivo es el tipo de dato m as simple. Enseguida se describen

conversion de tipo. Java realiza algunas conversiones automaticamente o implıcitamente,pero otras conversiones deben ser pedidas explıcitamente por el programador.

9.1. Conversion automatica de tipo

Al realizar operaciones aritmeticas con operando de tipos diferentes, Java escoge un tipounificado para el resultado. El tipo unificado es el tipo para el cual todos los operandosen una expresion son convertidos para que estos sean compatibles con el resto. Java realizauna conversion implıcita, es decir, Java convierte automaticamentee operandos diferentesal tipo unificado. Las conversiones implıcitas son tambien llamadas promociones. En lasiguiente tabla se muestra el orden o rango para establecer tipos unificados entre valores. Lostipos short y byte son convertidos automaticamente a int cuando son usados en expresiones.

double Mas altofloat ^

long |

int Mas bajo

Cuando dos tipos diferentes son usados en una expresion, el tipo unificado es aquel queeste mas alto en la tabla, es decir, cuando un operando que es un tipo menor en la lista escombinado con un tipo que es mayor, el operando tipo menor es convertido al mayor. Porejemplo, la suma de un double y un int da un double, y la resta de un long de un float

da un float.

Nota. Los valores booleanos no pueden ser convertidos a otro tipo.

El resultado de la multiplicacion, en el siguiente codigo, es un double porque un double yun int son multiplicados, el int es promovido al tipo unificador de rango mas alto (double).Por lo que la asignacion del resultado a pagoBruto es legal.

int horasTrabajadas = 36;

double pagoHora = 234.56;

double pagoBruto = horasTrabajadas * pagoHora;

El siguiente extracto de codigo no compilara porque horasTrabajadas por pagoHora esun double, y Java no permite la perdida de precision que ocurre si se intenta guardar elresultado double calculado en un int.

int horasTrabajadas = 36;

double pagoHora = 234.56;

int pagoBruto = horasTrabajadas * pagoHora;

19

Page 20: Datoscomputo.fismat.umich.mx/computacion/computacion1/... · 2016. 11. 14. · ocho tipos primitivos de datos. Un tipo primitivo es el tipo de dato m as simple. Enseguida se describen

Los tipos de dato char, short, y byte son promovidos a int cuando se usan en sentenciascon tipos diferentes, por lo que un calculo que incluya cualquier combinacion de los tiposanteriores dara un resultado int por defecto.

9.2. Conversiones explıcitas

Se puede anular a proposito el tipo unificado impuesto por Java haciendo una conversion detipo. La conversion de tipo forza un valor de un tipo de dato para ser usado como un valorde otro tipo. Para realizar lo anterior se usa el operador de conversion, el cual es creadoponiendo el tipo del resultado deseado entre parentesis. Usando un operador de conversion esuna operacion explıcitia. El operador de conversion es seguido por la constante, variableo expresion a ser convertida. En el siguiente codigo un conversion de tipo es hecha:

double saldoBancario = 12345.67;

float presupuestoSemanal = (float) (saldoBancario / 4);

Sin la conversion, la sentencia que asigna el resultado a presupuestoSemanal no compilarıa.

Nota. El operador de conversion es tambien llamado completamente operador de con-

version unario. Este operador solo usa un operando, que es el que sigue al operador de

conversion.

En el siguiente codigo ocurre una conversion de float a int:

float miDinero = 543.21f;

int pesos = (int) miDinero;

Es facil perder datos cuando se realiza una conversion. Por ejemplo, el valor byte masgrande es 127 y el valor int mas grande es 2,147,483,647 ası que las siguientes sentencias daresultados distorsionados;

int unEnteroCorrecto = 200;

byte unMalByte = (byte)unEnteroCorrecto;

Un tipo byte esta formado por ocho valores uno o cero, o dıgitos binarios. El primer dıgitobinario, o bit, guarda un 0 o un 1 para indicar positivo o negativo respectivamente. Los sietebits restantes guardan el valor actual. Cuando el valor entero 200 es guardado en la variablebyte, su valor mas gran consume el octavo bit, poniendo un 1, y forzando a la variableunMalByte para que guarde el valor -72, el cual es inexacto y enganoso.

No es necesario realizar una operacion de conversion cuando se asigna un valor a un tipounificador mayor. En la siguiente sentencia Java automaticamente promueve la constanteentera 123 a un double para que pueda ser guardada en la variable pagoHora:

20

Page 21: Datoscomputo.fismat.umich.mx/computacion/computacion1/... · 2016. 11. 14. · ocho tipos primitivos de datos. Un tipo primitivo es el tipo de dato m as simple. Enseguida se describen

double pagoHora = 123;

Sin embargo, por claridad, para una asignacion como la anterior, se podrıa preferir escribirlo siguiente:

double pagoHora = 123.0;

21