• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Hq como programar java, 9na edicion (Libro equivalente al impreso  )
 

Hq como programar java, 9na edicion (Libro equivalente al impreso )

on

  • 1,637 views

 

Statistics

Views

Total Views
1,637
Views on SlideShare
1,636
Embed Views
1

Actions

Likes
2
Downloads
1,883
Comments
0

1 Embed 1

http://www.slideee.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Hq como programar java, 9na edicion (Libro equivalente al impreso  ) Hq como programar java, 9na edicion (Libro equivalente al impreso ) Document Transcript

    • C O M O P R O G R A M A R PAUL DEITEL HARVEY DEITEL A L W A Y S L E A R N I N G PEARSONwww.FreeLibros.me
    • ACCESO A LOS CAPÍTULOS ADICIONALES DEL LIBRO Para acceder a los capítulos 12 a 19 (en español), 20 a 31 y Apéndices M a Q (en inglés) mencionados en el texto, visite el sitio Web de este libro: www.pearsonenespafiol.coin/deitel Utilice una moneda para descubrir el código de acceso. (No use objetos filosos porque podría dañarlo). IMPORTANTE: £Este código de acceso tiene vigencia de 2 días! Asegúrese que el código no aparezca dañado ya que sólo puede usarse una vez y no será reemplazado en ningún caso. www.FreeLibros.me
    • www.FreeLibros.me
    • www.FreeLibros.me
    • P R O G I s g M A R N O V E N A E D I C l d ^ Paul Deítel Deitel&Associates, Inc. Harvey Deítel Deitel&Associates, Inc. Traductor Alfonso Vidal Romero Elizondo Ingeniero en SistemasElectrónicos ITESM, CampusMonterrey Revisión técnica Roberto Martínez Román Departamento de Tecnología de Informacióny Computación ITESM, CampusEstado deMéxico Domingo Acosta Infante Departamento de Ingeniería en Informática Instituto Tecnológico deMorelia PEARSON www.FreeLibros.me
    • DEITEL, PAUL y HARVEY DEITEL Cómo programar en Java Novena edición PEARSON EDUCACIÓN, México, 2012 ISBN: 978-607-32-1150-5 Área: Computación Formato: 20 X 25.5 cm Páginas: 616 Authorized translation from the English language edition entitledJAVAHOW TOPROGRAM, 9thEdition, by PaulDeitel &HarveyDeitel,publishedbyPearsonEducation, Inc., publishing asPrentice Hall, Copyright© 2012. Allrights reserved. ISBN9780132575669 Traducción autorizada de la edición en idioma inglés titulada JAVAHOW TOPROGRAM,9a. edición por PaulDeitely HarveyDeitel,publicada porPearson Education,Inc., publicadacomo Prentice Hall, Copyright ©2012.Todoslosderechos reservados. Estaediciónen españoles la única autorizada. Edidón enespañol DirecciónEducación Superior: EditorSponsor: Editorde Desarrollo: Supervisorde Producdón: Gerente EditorialEducación SuperiorLatinoamérica: NOVENAEDICIÓN, 2012 D.R. © 2012por Pearson Educaciónde México, S.A. de C.V. Atlacomulco 500-5o. piso Col. Industrial Atoto 53519, Naucalpande Juárez, Estado de México Cámara Nacionalde la Industria Editorial Mexicana. Reg. núm. 1031. Reservados todos losderechos. Ni la totalidad ni partede esta publicación pueden reproducirse, registrarseo transmitirse, porun sistema de recuperación de información, en ninguna forma ni por ningún medio, sea electrónico, mecánico, foto- químico, magnético o electroóptico, por fotocopia, grabacióno cualquierotro, sinpermiso previo porescrito deleditor. Elpréstamo, alquilero cualquierotra formade cesiónde uso de este ejemplarrequerirá también la autorizacióndeleditor 0de sus representantes. ISBNVERSIÓN IMPRESA: 978-607-32-1150-5 ISBNVERSIÓNE-BOOK: 978-607-32-1151-2 ISBN E-CHAPTER: 978-607-32-1152-9 Impreso en México. Printed in México. 12 34567890- 15 14 13 12 Mario Contreras LuisMiguel CruzCastillo e-mail: hiis.cruz@pearson.com Bernardino GutiérrezHernández José D. Hernández Garduño Marisade Anta PEARSON www.FreeLibros.me
    • En memoriadeísargentoShriver, 'ElprimerdirectordelCuerpodeTazyfundador denumerosasorganizacionessociales: Toruna vida demarcaríadiferencia. Pauly Harvey Deitel www.FreeLibros.me
    • www.FreeLibros.me
    • Contenido Prefacio Antes de empezar 1 Introducción a las computadoras y a Java 1.1 Introducción 1.2 Computadoras: hardwarey software 1.3 Jerarquía de datos 1.4 Organización de una computadora 1.5 Lenguajes máquina, lenguajes ensambladores y lenguajes de alto nivel 1.6 Introducción a latecnologíade los objetos 1.7 Sistemas operativos 1.8 Lenguajesde programación 1.9 Javay un típico entorno de desarrollo enJava 1.10 Prueba de una aplicación enJava 1.11 Web 2.0: Las redessociales 1.12 Tecnologías de software 1.13 Cómo estar al día con lastecnologías de información 1.14 Conclusión 2 Introducción a las aplicaciones en Java 2.1 Introducción 2.2 Su primer programa enJava: imprimir una línea de texto 2.3 Modificación de nuestro primer programa enJava 2.4 Cómo mostrar texto con pri ntf 2.5 Otra aplicación enJava: suma de enteros 2.6 Conceptos acercade la memoria 2.7 Aritmética 2.8 Toma de decisiones: operadores de igualdad y relaciónales 2.9 Conclusión 3 Introducción a las clases, objetos, métodos ycadenas 3.1 Introducción 3.2 Declaración de una clasecon un método e instanciamiento de un objeto de una clase 3-3 Declaración de un método con un parámetro 3.4 Variables de instancia, métodos establecery métodos obtener 3.5 Comparación entre tipos primitivos y tipos por referencia 3.6 Inicialización de objetos mediante constructores xxiii xxxiii 1 2 5 6 8 10 11 13 16 18 22 26 29 31 32 37 38 38 44 46 47 52 53 56 60 71 72 72 76 79 84 85 www.FreeLibros.me
    • 88 92 95 102 103 103 104 104 107 107 112 113 118 125 130 130 134 134 138 151 152 152 154 158 162 164 172 173 179 184 187 197 198 198 200 202 205 206 207 208 210 214 214 215 219 222 224 227 Contenido 3.7 Los números de punto flotantey el tipo double 3.8 (Opcional) Caso de estudio de GUI y gráficos: uso de cuadros de diálogo 3.9 Conclusión 4 Instrucciones de control: Parte I 4.1 Introducción 4.2 Algoritmos 4.3 Seudocódigo 4.4 Estructuras de control 4.5 Instrucción i f de selección simple 4.6 Instrucción i f . .. el se de selección doble 4.7 Instrucción de repetición whi1e 4.8 Cómo formular algoritmos: repeticióncontroladapor un contador 4.9 Cómo formular algoritmos: repeticióncontroladapor un centinela 4.10 Cómo formular algoritmos: instrucciones de control anidadas 4.11 Operadores de asignación compuestos 4.12 Operadores de incremento y decremento 4.13 Tipos primitivos 4.14 (Opcional) Caso de estudio de GUI y gráficos: creación de dibujos simples 4.15 Conclusión 5 Instrucciones de control: Parte 2 5.1 Introducción 5.2 Fundamentos de la repetición controlada por contador 5.3 Instrucción de repetición for 5.4 Ejemplossobre el uso de la instrucción for 5.5 Instrucción de repetición do... whi1e 5.6 Instrucción de selección múltiple switch 5.7 Instrucciones break y continué 5.8 Operadores lógicos 5.9 Resumen sobre programación estructurada 5.10 (Opcional) Caso de estudio de GUI y gráficos: dibujo de rectángulosy óvalos 5.11 Conclusión 6 Métodos: un análisis más detallado 6.1 Introducción 6.2 Módulos de programas enJava 6.3 Métodos st a t i c,campos st a t i cy laclaseMath 6.4 Declaración de métodos con múltiples parámetros 6.5 Notas acerca de cómo declarar y utilizar los métodos 6.6 La pilade llamadasa los métodosy losregistros de activación 6.7 Promoción yconversión de argumentos 6.8 Paquetesde laAPI deJava 6.9 Caso de estudio: generación de números aleatorios 6.9.1 Escalamiento y desplazamiento generalizados de números aleatorios 6.9.2 Repetitividad de números aleatorios para prueba y depuración 6.10 Caso de estudio: un juego deprobabilidad (introducción a las enumeraciones) 6.11 Alcance de las declaraciones 6.12 Sobrecarga de métodos 6.13 (Opcional) Caso de estudio de GUI y gráficos: coloresy figuras rellenas 6.14 Conclusión www.FreeLibros.me
    • Contenido ix 7 Arreglos y objetos ArrayList 7.1 Introducción 7.2 Arreglos 7.3 Declaración y creación de arreglos 7.4 Ejemplos acercadel uso de los arreglos 7.5 Caso de estudio:simulación para barajar y repartir cartas 7.6 Instrucción for mejorada 7.7 Pasode arreglosa los métodos 7.8 Caso de estudio: laclase L i broCal i f i ca ci ones que usa un arreglo paraalmacenar las calificaciones 7.9 Arreglos multidimensionales 7.10 Caso de estudio: la clase Libro C al ific a c io n e s que usa un arreglo bidimensional 7.11 Listas de argumentos de longitud variable 7.12 Uso de argumentos de línea de comandos 7.13 LaclaseArrays 7.14 Introducción a lascolecciones y laclaseA rrayLi st 7.15 (Opcional) Caso de estudio de GUI y gráficos: dibujo de arcos 7.16 Conclusión 8 Clases y objetos: un análisis más detallado 8.1 Introducción 8.2 Caso de estudio de la claseTiempo 8.3 Control del accesoa los miembros 8.4 Referencias a los miembros delobjeto actual mediante this 8.5 Caso de estudio de la claseTiempo: constructoressobrecargados 8.6 Constructores predeterminados y sin argumentos 8.7 Observaciones acercade los métodosEstablecery Obtener 8.8 Composición 8.9 Enumeraciones 8.10 Recolección de basuray elmétodo fi nali ze 8.11 Miembros de clase s t a t i c 8.12 Declaración static import 8.13 Variables de instancia fi nal 8.14 Caso de estudio de la claseT i empo: creación de paquetes 8.15 Accesoa paquetes 8.16 (Opcional) Caso de estudio de GUI y gráficos: uso de objetos con gráficos 8.17 Conclusión 9 Programación orientada a objetos: herencia 9.1 Introducción 9.2 Superclasesy subclases 9.3 Miembros protected 9.4 Relación entre las superclases y las subclases 9.4.1 Creacióny uso de una clase Empl eadoPorComi s i on 9.4.2 Creación y uso de una clase Empl eadoBaseMasComi si on 9.4.3 Creación de una jerarquía de herencia Empl eadoPorComi s i on- Empl eadoBaseMasComi sion 9.4.4 Lajerarquía de herencia Empl eadoPorComi si on-Empl eadoBaseMasComi sion mediante el uso de variablesde instancia protected 9.4.5 Lajerarquía de herencia Empl eadoPorComi si on-Empl eadoBaseMasComi sion mediante el uso de variablesde instancia pri vate 240 241 242 243 244 254 258 259 262 268 271 278 279 281 284 286 289 311 312 312 316 317 320 326 326 328 331 333 334 338 339 340 345 347 351 359 360 361 363 364 364 370 375 377 380 www.FreeLibros.me
    • x Contenido 9.5 Los constructores en lassubclases 9.6 Ingenieríade software mediante la herencia 9.7 La clase Obj e ct 9.8 (Opcional) Caso de estudio de GUI y gráfieos: mostartexto e imágenes usando etiquetas 9.9 Conclusión 10 Programación orientada a objetos: polimorfismo 10.1 Introducción 10.2 Ejemplos delpolimorfismo 10.3 Demostración del comportamiento polimórfico 10.4 Clases y métodos abstractos 10.5 Caso de estudio: sistema de nómina utilizando polimorfismo 10.5.1 Lasuperclase abstracta Empleado 10.5.2 Lasubclase concreta EmpleadoAsalari ado 10.5.3 Lasubclase concreta Empl eadoPorHoras 10.5.4 Lasubclase concreta Empl eadoPo rComi si on 10.5.5 Lasubclase concreta indirecta Empl eadoBaseMasComi sion 10.5.6 El procesamiento polimórfico, el operador i nstanceof y laconversión descendente 10.5.7 Resumen de lasasignaciones permitidas entre variables de lasuperclase yde lasubclase 10.6 Métodos y clases fi nal 10.7 Caso de estudio: creación y uso de interfaces 10.7.1 Desarrollo de una jerarquía PorPagar 10.7.2 La interfaz PorPagar 10.7.3 Laclase Factu ra 10.7.4 Modificación de la clase Empleado para implementar la interfaz PorPagar 10.7.5 Modificación de laclase Empl eadoAsal a ri ado para usarla en la jerarquía PorPagar 10.7.6 Uso de la ¡nterfaz PorPagar para procesar objetos Factura y Empleado mediante el polimorfismo 10.7.7 Interfaces comunes de laAPI deJava 10.8 (Opcional) Caso de estudio de GUI y gráficos: realizar dibujos usando polimorfismo 10.9 Conclusión I I Manejo de excepciones: un análisis más profundo 11.1 Introducción 11.2 Ejemplo: división entre cero sin manejo de excepciones 11.3 Ejemplo: manejo deexcepciones tipo A ritm eticException elnputMismatchException 11.4 Cuándo utilizar el manejo deexcepciones 11.5 Jerarquía de excepcionesenJava 11.6 Bloque finally 11.7 Limpieza de la pilay obtención de información de un objeto excepción 11.8 Excepciones encadenadas 11.9 Declaración de nuevos tipos de excepciones 11.10 Precondicionesy poscondiciones 11.11 Aserciones 11.12 (Nuevo enJava SE 7): Cláusula catch múltiple: atrapar varias excepciones en un catch 11.13 (Nuevo enJava SE 7): Cláusulat rycon recursos (t ry-with-resources): desasignación automática de recursos 11.14 Conclusión 385 386 387 388 391 394 395 397 398 400 403 404 407 408 410 412 413 418 418 419 421 422 422 425 427 428 430 431 433 438 439 439 442 447 447 450 454 457 459 460 461 462 463 463 www.FreeLibros.me
    • Contenido x i A Tabla de precedencia de operadores B Conjunto de caracteres ASCII C Palabras clave y palabras reservadas D Tipos primitivos E Uso de la documentación de la API deJava E.1 Introducción E.2 Navegación por laAPI deJava F Uso del depurador E1 Introducción E2 Los puntos de interrupción y los comandos run, stop, cont y pri nt F.3 Los comandos pri nt y set E4 Cómo controlar laejecución mediante los comandos step, step upy next F.5 El comando watch F.6 El comando clear F.7 Conclusión G Salida con formato G.l Introducción G.2 Flujos G.3 Aplicación de formato a lasalidacon pri ntf G.4 Impresión de enteros G.5 Impresión de números de punto flotante G.6 Impresión de cadenasy caracteres G.7 Impresión de fechas y horas G.8 Otros caracteres de conversión G.9 Impresión con anchuras de campo y precisiones G.10 Uso de banderas en lacadena de formato de pri ntf G.11 Impresión con índices como argumentos G.12 Impresión de literalesy secuencias de escape G.13 Aplicación deformato a lasalida con laclase Formatte r G.l4 Conclusión H Sistemas numéricos H.l Introducción H.2 Abreviaturade los números binarioscomo númerosoctales y hexadecimales H.3 Conversión de númerosoctales y hexadecimales a binarios H.4 Conversión de un número binario,octal o hexadecimal adecimal H.5 Conversión de un número decimala binario, octalo hexadecimal H.6 Números binarios negativos: notación de complemento a dos A-l A-3 A-4 A-5 A-6 A-6 A-6 A-14 A-15 A-15 A-19 A-21 A-24 A-27 A-29 A-31 A-32 A-32 A-32 A-33 A-34 A-36 A-37 A-39 A-41 A-43 A-47 A-47 A-48 A-49 A-54 A-55 A-58 A-59 A-59 A-60 A-62 www.FreeLibros.me
    • x ii Contenido I GroupLayout 1.1 Introducción 1.2 Fundamentos de GroupLayout 1.3 Creación de unobjeto SelectorColores 1.4 RecursosWebsobre GroupLayout J Componentes de integración Java Desktop J.l Introducción J.2 Pantallas deinicio J.3 LaclaseDesktop J.4 Iconos de la bandeja K Mashups K.l Introducción K.2 Mashups populares K.3 AlgunasAPI de uso común en mashups K.4 Centrode recursosDeitelsobre mashups K.5 Centrode recursosDeitelsobre RSS K.6 Cuestiones de rendimiento y confiabilidad de los mashups L Unicode® L.l Introducción L2 Formatosde transformación de Unicode L.3 Caracteresy glifos L.4 Ventajas/Desventajasde Unicode L5 Uso de Unicode L.6 Rangos de caracteres índice Los capítulos 12a 19 se encuentran en español en el sitio Web del libro 12 Caso de estudio del ATM, Parte I : Diseño orientado a objetos con UML 12.1 Introducción alcaso deestudio 12.2 Análisis del documento de requerimientos 12.3 Cómo identificar lasclases en un documento de requerimientos 12.4 Cómo identificar los atributos de las clases 12.5 Cómo identificar los estadosy actividades de losobjetos 12.6 Cómo identificar lasoperaciones de lasclases 12.7 Cómo indicar lacolaboración entreobjetos 12.8 Conclusión 469 470 470 478 484 489 493 499 506 A-67 A-67 A-67 A-68 A-78 A-79 A-79 A-79 A-81 A-83 A-85 A-85 A-85 A-86 A-86 A-87 A-87 A-88 A-88 A-89 A-90 A-90 A-91 A-93 I- l www.FreeLibros.me
    • Contenido x¡¡¡ 13 Caso de estudio del ATM, Parte 2: Implementaciói de un diseño orientado a objetos 13.1 Introducción 13.2 Inicio de laprogramación de lasclases delsistemaATM 13.3 Incorporación de laherenciay el polimorfismo en el sistemaATM 13.4 Implementación delcaso deestudio delATM 13.4.1 Laclase ATM 13.4.2 Laclase P a n ta lla 13.4.3 LaclaseTeclado 13.4.4 Laclase Di spensadorEf e c ti vo 13.4.5 Laclase RanuraDeposito 13.4.6 Laclase Cuenta 13.4.7 Laclase BaseDatos Banco 13.4.8 Laclase Transacció n 13.4.9 Laclase Sol i citud Sal do 13.4.10 Laclase R eti ro 13.4.11 Laclase Depos i to 13.4.12 LaclaseCasoEstudioATM 13-5 Conclusión 14 Componentes de la GUI: Parte I 14.1 Introducción 14.2 NuevaaparienciavisualNimbus deJava 14.3 Entrada/salidasimple basadaen GUI con JOptionPane 14.4 Generalidades de los componentes de Swing 14.5 Mostrartexto e imágenes en unaventana 14.6 Campos detexto y unaintroducción al manejo deeventos con clases anidadas 14.7 Tipos deeventos comunes de laGUI e interfaces de escucha 14.8 Cómo funciona el manejo deeventos 14.9 JButton 14.10 Botones que mantienen elestado 14.10.1 JCheckBox 14.10.2 JRadioButton 14.11 JComboBox: uso de una clase interna anónima para el manejo de eventos 14.12 J L is t 14.13 Listas de selección múltiple 14.14 Manejo de eventos de ratón 14.15 Clases adaptadoras 14.16 Subclase de JPanel paradibujarcon el ratón 14.17 Manejode eventos de teclas 14.18 Introducción a los administradores de esquemas 14.18.1 FlowLayout 14.18.2 BorderLayout 14.18.3 G rid Layou t 14.19 Uso de panelesparaadministraresquemasmás complejos 14.20 JTextA rea 14.21 Conclusión 510 511 511 516 522 523 528 529 530 531 532 534 537 538 539 543 546 546 549 550 551 552 555 557 561 567 569 571 574 574 577 580 584 586 589 594 597 601 604 605 608 611 613 615 618 www.FreeLibros.me
    • xiv Contenido 15 Gráficos y Java 2D 15.1 Introducción 15.2 Contextosy objetos degráficos 15-3 Control de colores 15.4 Manipulación de tipos de letra 15.5 Dibujo de líneas, rectángulosy óvalos 15.6 Dibujo de arcos 15.7 Dibujo de polígonos y polilíneas 15.8 LaAPI Java 2D 15.9 Conclusión 16 Cadenas, caracteres y expresiones regulares 16.1 Introducción 16.2 Fundamentos de los caracteres y las cadenas 16.3 Laclase String 16.3.1 Constructores de Stri ng 16.3.2 Métodos 1ength, charAt ygetChars de S trin g 16.3.3 Comparación entre cadenas 16.3.4 Localización de caracteres y subcadenas en las cadenas 16.3.5 Extracción de subcadenas de lascadenas 16.3.6 Concatenación de cadenas 16.3.7 Métodos varios de Stri ng 16.3.8 Método valueOf de Stri ng 16.4 Laclase Stri ngBui lder 16.4.1 Constructores de Stri ngBuilder 16.4.2 Métodos 1ength, capacity, setLengthy ensureCapaci ty de S tri ngBui ld er 16.4.3 Métodos charAt, setCharAt, getChars y reverse de S tri ngBui ld e r 16.4.4 Métodos append de Stri ngBuilder 16.4.5 Métodos de inserción y eliminación de Stri ngBui lder 16.5 LaclaseCharacter 16.6 Divisiónde objetos Stri ngen tokens 16.7 Expresiones regulares, laclase Pattern y laclase Matcher 16.8 Conclusión 17 Archivos, flujos y señalización de objetos 17.1 Introducción 17.2 Archivosy flujos 17.3 Laclase File 17.4 Archivos de texto de acceso secuencial 17.4.1 Creación de un archivo de texto de acceso secuencial 17.4.2 Cómo leerdatos de un archivo de texto de acceso secuencial 17.4.3 Caso deestudio: un programade solicitud de crédito 17.4.4 Actualización de archivos de acceso secuencial 17.5 Señalización deobjetos 17.5.1 Creación de un archivo de acceso secuencial mediante el uso de laseñalización deobjetos 17.5.2 Lecturay deserialización de datos de un archivo de acceso secuencial 17.6 Clases adicionales de java, io 17.6.1 Interfaces y clases para entrada y salida basadaen bytes 17.6.2 Interfaces y clases para entrada y salida basadaen caracteres 632 634 635 642 647 651 654 657 664 672 673 673 674 674 675 676 681 683 684 684 686 687 688 688 690 691 693 694 699 700 708 719 720 720 722 726 726 733 736 741 742 743 749 751 751 753 631 www.FreeLibros.me
    • Contenido x v 17.7 Abrir archivos con JFileChooser 17.8 Conclusión 18 Recursividad 18.1 Introducción 18.2 Conceptosde recursividad 18.3 Ejemplo de uso de recursividad: factoriales 18.4 Ejemplo de uso de recursividad: serie de Fibonacci 18.5 Larecursividad y la pila de llamadas a métodos 18.6 Comparación entre recursividade iteración 18.7 Lastorres de Hanoi 18.8 Fractales 18.9 “Vueltaatrás” recursiva (backtracking) 18.10 Conclusión 19 Búsqueda, ordenamiento y Big O 19.1 Introducción 19.2 Algoritmos de búsqueda 19.2.1 Búsqueda lineal 19.2.2 Búsqueda binaria 19.3 Algoritmos de ordenamiento 19.3.1 Ordenamiento por selección 19.3.2 Ordenamiento por inserción 19.3.3 Ordenamiento por combinación 19.4 Conclusión Los capítulos 20 a 3 1se encuentran en inglés en el sitio Web del libro 20 Generic Collections 20.1 Introduction 20.2 Collections Overview 20.3 Type-Wrapper Classesfor PrimitiveTypes 20.4 Autoboxing and Auto-Unboxing 20.5 Interface Col 1ect i on and Class C o ll e ctio n s 20.6 Lists 20.6.1 A r ra y L is t and Ite r a to r 20.6.2 L in k e d L is t 20.7 Collections Methods 20.7.1 Method s o rt 20.7.2 Method s h u ffie 20.7.3 Methods re ve rse , f i 11, copy, max and mi n 20.7.4 Method binarySearch 20.7.5 MethodsaddAll, frequency and d is jo in t 20.8 Stack Class ofPackage java, útil 20.9 Class PriorityQueueand Interface Queue 20.10 Sets 20.11 Maps 754 757 765 766 767 768 771 774 776 777 779 790 790 798 799 800 800 804 809 810 814 817 824 829 830 830 831 832 832 833 834 836 841 842 845 847 849 851 853 855 856 859 www.FreeLibros.me
    • xv¡ Contenido 20.12 Properties Class 20.13 Synchronized Collections 20.14 Unmodifiable Collections 20.15 Abstract Implementations 20.16 Wrap-Up 2 1 GenericClasses andMethods 21.1 Introduction 21.2 Motivation for Generic Methods 21.3 Generic Methods: Implementation and Compile-TimeTranslation 21.4 Additional Compile-TimeTranslation Issues: MethodsThat Use a Type Parameter asthe Return Type 21.5 Overloading Generic Methods 21.6 Generic Classes 21.7 RawTypes 21.8 Wildcards in MethodsThat AcceptType Parameters 21.9 Generics and Inheritance: Notes 21.10 Wrap-Up 22 CustomGeneric DataStructures 22.1 Introduction 22.2 Self-Referential Classes 22.3 Dynamic Memory Allocation 22.4 Linked Lists 22.5 Stacks 22.6 Queues 22.7 Trees 22.8 Wrap-Up 23 Applets andJavaWebStart 23-1 Introduction 23.2 SampleApplets Provided with theJDK 23-3 SimpleJavaApplet: Drawing a String 23-3.1 Executing WelcomeAppl et in the appletviewer 23-3.2 Executing an Applet in aWeb Browser 23.4 Applet Life-Cycle Methods 23-5 Initialization with Method i nit 23.6 Sandbox Security Model 23.7 JavaWeb Start and theJava Network Launch Protocol (JNLP) 23.7.1 Packaging the DrawTest Appletfor Usewith JavaWeb Start 23.7.2 JNLP Document for the DrawTest Applet 23.8 Wrap-Up 24 Multimedia: Applets andApplications 24.1 Introduction 24.2 Loading, Displaying and Scaling Images 24.3 Animaring a Series ofImages 24.4 Image Maps 863 866 866 867 867 873 874 874 877 880 883 883 891 895 899 900 904 905 905 906 907 917 921 924 930 941 942 943 947 949 951 951 952 954 956 956 957 961 967 968 969 975 982 www.FreeLibros.me
    • Contenido x v ii 24.5 Loading and PlayingAudio Clips 24.6 PlayingVideo and Other Media withJava Media Framework 24.7 Wrap-Up 24.8 Web Resources 2 5 GUI Components: Part 2 25-1 Introduction 25.2 JS Iid e r 25-3 Windows: Additional Notes 25.4 Using Menus with Frames 25-5 JPopupMenu 25.6 Pluggable Look-and-Feel 25.7 JDesktopPane and JlnternalFrame 25.8 JTabbedPane 25.9 Layout Managers: BoxLayout and GridBagLayout 25.10 Wrap-Up 2 6 Multithreading 26.1 Introduction 26.2 Thread States: Life Cycle ofaThread 26.3 Creating and ExecutingThreads with Executor Framework 26.4 Thread Synchronization 26.4.1 Unsynchronized Data Sharing 26.4.2 Synchronized Data Sharing—Making Operations Atomic 26.5 Producer/Consumer Relationship without Synchronization 26.6 Producer/Consumer Relationship: ArrayBlocki ngQueue 26.7 Producer/Consumer Relationship with Synchronization 26.8 Producer/Consumer Relationship: Bounded Buffers 26.9 Producer/Consumer Relationship: The Lock and Condi t i on Interfaces 26.10 Concurrent Collections Overview 26.11 Multithreadingwith GUI 26.11.1 Performing Computations in aWorkerThread 26.11.2 Processing Intermedíate Results with Swi ngWorker 26.12 Interfaces Caliabl e and Futu re 26.13 Java SE 7: Fork/Join Framework 26.14 Wrap-Up 2 7 Networking 27.1 Introduction 27.2 Manipulating URLs 27.3 Reading a Fileon aWeb Server 27.4 Establishing a SimpleServer Using Stream Sockets 27.5 Establishing a Simple Client Using Stream Sockets 27.6 Client/Server Interaction with Stream Socket Connections 27.7 Datagrams: Connectionless Client/ServerInteraction 27.8 Client/ServerTic-Tac-Toe Usinga Multithreaded Server 27.9 [Web Bonus] Case Study: DeitelMessenger 27.10 Wrap-Up 985 988 992 992 1000 1001 1001 1005 1006 1014 1017 1022 1026 1028 1040 1045 1046 1048 1051 1054 1055 1059 1062 1070 1073 1079 1086 1093 1095 1096 1102 1109 1109 1110 I 118 1119 1120 1125 1128 1130 1130 1142 1150 1165 1165 www.FreeLibros.me
    • x v ¡¡¡ Contenido 28 Accessing Databases with JDBC 28.1 Introduction 28.2 Relational Databases 28.3 Relational Database Overview: The books Database 28.4 SQL 28.4.1 Basic SELECT Query 28.4.2 WHERE Clause 28.4.3 ORDER BY Clause 28.4.4 Merging Data from MúltipleTables: INNER JOIN 28.4.5 I NSERT Statement 28.4.6 UPDATE Statement 28.4.7 DELETE Statement 28.5 Instructions for Installing MySQL and MySQL Connector/J 28.6 Instructions forSetring Up a MySQL UserAccount 28.7 Creating Database books in MySQL 28.8 Manipularing Databaseswith JDBC 28.8.1 Connecring to and Querying a Database 28.8.2 Querying the books Database 28.9 RowSet Interface 28.10 Java DB/Apache Derby 28.11 P repa redStatem ents 28.12 Stored Procedures 28.13 Transaction Processing 28.14 Wrap-Up 28.15 Web Resources 29 JavaServer™ Faces Web Apps: Part I 29.1 Introduction 29.2 HyperTextTransfer Protocol (HTTP) Transacrions 29.3 MultirierApplication Architecture 29.4 YourFirstJSF Web App 29.4.1 The Default i ndex .xhtml Document: Introducing Facelets 29.4.2 Examining the WebTimeBean Class 29.4.3 Building theWebTi meJSF Web App in NetBeans 29.5 Model-View-ControllerArchitecture ofJSF Apps 29.6 CommonJSF Components 29.7 ValidationUsing JSF StandardValidators 29.8 SessionTracking 29.8.1 Cookies 29.8.2 SessionTracking with @Sessi onScoped Beans 29.9 Wrap-Up 30 JavaServer™ Faces Web Apps: Part 2 30.1 Introduction 30.2 Accessing Databases in Web Apps 30.2.1 Setring Up the Database 30.2.2 @ManagedBean ClassAddressBean 30.2.3 i ndex.xhtml Facelets Page 30.2.4 addent r y . xhtml Facelets Page 1172 1173 1174 1177 1178 1179 1181 1182 1184 1185 1186 1186 1187 1188 1189 1189 1194 1207 1209 1211 1226 1227 1227 1228 1235 1236 1237 1240 1241 1242 1244 1246 1250 1250 1254 1261 1262 1263 1269 1276 1277 1277 1279 1282 1286 1288 I 171 www.FreeLibros.me
    • Contenido x íx 30.3 Ajax 30.4 AddingAjax Functionality to theValidation App 30.5 Wrap-Up 3 1 Web Services 31.1 Introduction 31.2 Web Service Basics 31.3 Simple ObjectAccess Protocol (SOAP) 31.4 Representational StateTransfer (REST) 31.5 JavaScript Object Notation (JSON) 31.6 Publishing and Consuming SOAP-BasedWeb Services 31.6.1 Creating aWeb Application Project and Adding aWeb Service Class in NetBeans 31.6.2 Defining the Wel comeSOAP Web Service in NetBeans 31.6.3 Publishing the Wel comeSOAPWeb Service from NetBeans 31.6.4 Testing the Wel comeSOAPWeb Service with GlassFish Application Server’sTesterWeb Page 1308 31.6.5 Describing aWeb Service with theWeb ServiceDescription Language (WSDL) 31.6.6 Creating a Clientto Consume the Wel comeSOAPWeb Service 31.6.7 Consuming the Wel comeSOAPWeb Service 31.7 Publishing and Consuming REST-BasedXML Web Services 31.7.1 Creating a REST-Based XMLWeb Service 31.7.2 Consuming a REST-BasedXMLWeb Service 31.8 Publishing and Consuming REST-BasedJSON Web Services 31.8.1 Creating a REST-BasedJSON Web Service 31.8.2 Consuming a REST-BasedJSON Web Service 31.9 SessionTrackingin a SOAPWeb Service 31.9.1 Creating a B lackjack Web Service 31.9.2 Consuming the BI ackj ackWeb Service 31.10 Consuming a Database-Driven SOAP Web Service 31.10.1 Creating the Reservati onDatabase 31.10.2 Creating aWeb Application to Interactwith the Reservation Service 1343 31.11 Equation Generator: Returning User-Defmed Types 31.11.1 Creating the EquationGeneratorXML Web Service 31.11.2 Consuming the EquationGeneratorXM L Web Service 31.11.3 Creating the EquationGeneratorJSONWeb Service 31.11.4 Consuming the EquationGeneratorJSONWeb Service 31.12 Wrap-Up 1290 1292 1295 1299 1300 1302 1302 1302 1303 1303 1303 1304 1307 1309 1310 1312 1315 1315 1318 1320 1320 1322 1324 1325 1328 1339 1340 1346 1349 1350 1354 1354 1357 www.FreeLibros.me
    • X X Contenido Los apéndices M a Q se encuentran en inglés en el sitio Web del libro M Creating Documentation with javadoc M. 1 Introduction M.2 Documentation Comments M.3 DocumentingJava Source Code M .4 javadoc M.5 Files Produced by javadoc N Bit Manipulation N.l Introduction N.2 Bit Manipulation and the Bitwise Operators N.3 B itS et Class O Labeled break and conti nue Statements 0.1 Introduction 0.2 Labeled break Statement 0.3 Labeled continue Statement P UML 2: Additional Diagram Types P.1 Introduction P.2 Additional Diagram Types Q Design Patterns Q.l Introduction Q.2 Creational, Structural and Behavioral Design Patterns Q.2.1 Creational Design Patterns Q.2.2 Structural Design Patterns Q.2.3 Behavioral Design Patterns Q.2.4 Conclusión Q.3 Design Patterns in Packages java.awt and javax.swing Q.3.1 Creational Design Patterns Q.3.2 Structural Design Patterns Q.3.3 Behavioral Design Patterns Q.3.4 Conclusión Q.4 Concurrency Design Patterns Q.5 Design Patterns Used in Packages java, io and java, net Q.5.1 Creational Design Patterns Q.5.2 Structural Design Patterns Q.5.3 ArchitecturaJ Patterns Q.5.4 Conclusión Q.6 Design Patterns Used in Package java.uti 1 Q.6.1 Creational Design Patterns Q.6.2 Behavioral Design Patterns Q.7 Wrap-Up M-i M-l M-l M-l M-8 M-9 N-l N-l N-l N -ll 0 - 1 o - i o - i 0-2 P-l P-l P-l Q-i Q -l Q-2 Q-3 Q-5 Q-6 Q-7 Q-7 Q-7 Q-8 Q-l0 Q-13 Q-14 Q-i5 Q-i5 Q-15 Q-16 Q-19 Q-19 Q-19 Q-19 Q-20 www.FreeLibros.me
    • Prefacio Novivas másenfragmentos, conéctate. —EdgarMorgan Foster Bienvenido a CómoprogramarenJava,novenaedición. Este libro presentalas tecnologías de vanguardia paraestudiantes, profesoresy desarroliadores desoftware. El nuevo capítulo 1 atrae la atención de los estudiantes con hechos y cifras fascinantes, para que encuentren más emocionante el hecho de estudiar sobre las computadoras y la programación. Ofrece los siguiente: una tabla sobre algunos proyectos de investigación que se hacen posibles gracias a las computadoras; un análisis sobre el hardware y las tendencias tecnológicas actuales; jerarquía de datos; unatabladeplataformasdeaplicacionesmóvilesyde Internet; unanuevasecciónsobreredessociales; una introducción aAndróid; una tabla de los servicios Web más populares; una tabla de las publicaciones tecnológicasy de negocios, además de lossiriosWeb que le ayudaránaestar aldíacon las noticias y ten­ dencias más recientes sobre tecnología;y ejercicios actualizados. El libro es apropiado para secuencias de cursos introductorios apoyados en las recomendaciones curriculares de ACM/IEEE y sirve como preparación para el examen de Colocación avanzada (AP) de cienciascomputaciónales. Nosenfocamosenlasmejoresprácticasde ingenieríadesoftware. Labasedellibroesnuestroreconocido “método de código activo”:los conceptosse presentanen el contextode programas funcionales completos, en lugar de hacerlo a travésde fragmentos separados de código. Cada ejemplo de código completo viene acompañadodeejemplosdeejecucionesactuales.Todoelcódigofuenteestádisponibleenwww.deite l.com/ books/jhtp9/ (eninglés)yen elsirioWebdeestelibrowww.pearsonenespañol.com/deitel (enespañol). Sisurgealgunadudaopreguntamientrasleeestelibro,envíeuncorreoelectrónicoadeitel@deite l.com; leresponderemosalabrevedad. Paraobteneractualizacionessobreeste libro,visitevavw.deite l.com/books/ jhtp9/, síganosenFacebook (vmm deite l.com/deitel fan)yTwitter(@deitel). Tambiénpuedesuscribirse alboletíndecorreoelectrónico DeitePBuzzOnline(vom.deite l.com/newsletter/subscri be.html). Características nuevas y mejoradas He aquí las actualizaciones que realizamosala9aedición: Java StandardEdition (SE) 7 • Fácil de usar como libro para Java SE 6 y Java SE 7. Hay unas cuantas características de Java StandardEdition (SE) 7que afectan aloscursosde cienciascomputacionales CS 1yCS 2. Cubrimos esas características en secciones modulares opcionales que se pueden incluir u omitir con facilidad. He aquí una parte de la nueva funcionalidad: objetos Stri ng en instrucciones switch, la instruc­ ción try con recursos (try-with-resources) paraadministrarobjetosAutoClosabl e,multi-catch para definir un solo manejador de excepciones en sustitución de varios que realizan la misma tarea, las API del sistema de archivos NIO y la inferencia de tipos de objetos genéricos a partir de lavariable alaque están asignados, mediante el uso de lanotación o . También veremos las generalidades sobre las nuevas características de laAPI concurrente. www.FreeLibros.me
    • x x ü Prefacio • Nuevas API del sistema de archivos de Java SE 7. Ofrecemos una versión en línea alternativa (en inglés) del capítulo 17, Archivos, flujos y señalización de objetos, que se volvió a implementar con las nuevasAPI del sistemade archivosdeJava SE 7. • VersionesAutoClosable de Connection, Statem enty ResultSetdeJava SE 7. Con elcódigo fuen­ te para el capítulo 28 (en inglés), proporcionamos unaversión del primer ejemplo del capítulo que se implementó mediante el uso de lasversiones AutoClosable de Connection, Statementy ResultSet. Los objetos AutoClosable reducen la probabilidad de fugas de recursos cuando se utilizan con la instrucción try con recursos (try-with-resources) de Java SE 7, la cual cierra de manera automática los objetos AutoClosabl e que se asignan en los paréntesis después de la palabra clave try. Característicaspedagógicas • Mejoramoselconjunto deejerciciosMarcarla diferencia* Lealentamosautilizarlascomputadoras e Internet para investigar y resolver problemas sociales relevantes. Estos ejercicios están diseñados para aumentar la conciencia y el análisis en torno a los problemas importantes a los que se enfrenta el mundo. Esperamos que usted los aborde con sus propios valores, políticas y creencias. Dé un vis­ tazo a nuestro nuevo Centro de recursos para marcar una diferencia (en inglés) en www.dei te l.com/ MakingADif ference, en dondeobtendrá ideas adicionales que tal vezdesee investigar más a fondo. • Númerosdepáginapara lostérminos claveen losresúmenesde cada capitulo. En lalistade térmi­ nos claveque aparece en el resumen de cada capítulo incluimos el número de páginadonde se define el término. • Comentarios en video. En el sitio Webde este libro encontrará comentarios en video (VideoNotes), en inglés, en las que el coautor Paul Deitel explica con detalle la mayoría de los programas de los capítulos básicos. Los profesores nos han dicho que estos comentariosconstituyen un recurso valioso parasus estudiantes. Tecnología de objetos • Programación y diseño orientados a objetos. En el capítulo 1 presentamos la terminología y los conceptos básicos de latecnologíadeobjetos. En el capítulo 3 losestudiantes desarrollansusprimeras clases y objetos personalizados. Al presentar los objetos y las clases en los primeros capítulos hace­ mos que los estudiantes de inmediato “piensen en objetos”y dominen estos conceptos [en los cursos que requieren una metodología en la que se presenten los objetos en capítulos posteriores, le reco­ mendamos el libro Java How to Program, Late Objects Versión, 8aedition (en inglés), el cual presenta en los primeros seis capítulos los fundamentos de la programación (incluyendo dos sobre instruc­ ciones de control) y continúa con varios capítulos que introducen los conceptos de programación orientada aobjetos en forma gradual]. • Manejo de excepciones. Integramos el manejo básico de excepciones en los primeros capítulos del libro; además los profesores pueden extraer con facilidad más material del capítulo 11, Manejo de excepciones: un análisis más detallado, para mostrarlo con anticipación. • Las clases Arraysy ArrayList. El capítulo 7 cubre la clase Arrays —que contiene métodos para realizar manipulaciones comunes de arreglos— y la clase ArrayList —que implementa una estruc­ tura de datos tipo arreglo, cuyo tamaño se puede ajustar en forma dinámica. Esto va de acuerdo con nuestra filosofía de obtener mucha práctica al utilizar las clases existentes, al tiempo que el estudiante aprendea definirsuspropias clases. • Casos de estudio orientados a objetos (OO). La presentación de las clases y los objetos en los pri­ meros capítulos del libro aportan casos de estudio de Tiempo, Empleado y LibroCali ficaciones, que se entretejen a través varias secciones y capítulos, e introducen conceptos de OO cada vez más profundos. www.FreeLibros.me
    • Prefacio x x ü i • Ejemplopráctico opcional: uso de UMLpara desarrollar un diseño orientado a objetosy una implementación en Java de un cajero automático (ATM). El UML™ (Lenguaje Unificado de Modelado™) es el lenguaje gráfico estándar en la industria para modelar sistemas orientados a ob­ jetos. Los capítulos 12 y 13 (en el sitio Web) contienen un Ejemplo práctico opcionalsobre diseño orientado a objetos mediante el uso de UML. Diseñamos e implementamos el software para un cajero automático (ATM) simple. Analizamos un documento de requerimientos típico, el cual espe­ cificaelsistemaquesevaaconstruir.Determinamos lasclasesnecesarias paraimplementáresesistema, los atributos que deben tener esas clases, los comportamientos que necesitan exhibir, y especificamos cómo deben interactuar las clases entre sí para cumplir con los requerimientos del sistema. A partir del diseño creamos una implementación completa en Java. A menudo los estudiantes informan que pasan por un “momento de revelación”:el Ejemplo práctico les ayuda a “atar cabos” y comprender enverdad laorientación a objetos. • Se reordenó lapresentación de estructuras de datos. Empezamos con la clase genérica ArrayList en el capítulo 7. Como los estudiantes comprenderán los conceptos básicos sobre losgenéricos en lospri­ meros capítulos del libro,nuestros análisis posteriores sobre lasestructuras de datos ofrecen un trata­ miento más detallado de las colecciones de genéricos, puesto que enseñan a utilizar las colecciones integradas de laAPI deJava. Luego mostramoscómo implementar losmétodos y las clases genéricas. Por último, mostraremos cómo crearestructuras de datos genéricas personalizadas. Desarrollo Weby de basesde datos (materialen inglésen elsitio Web dellibro) • JDBC 4. Elcapítulo 28, trata sobre JDBC 4; aquíse utilizan lossistemas de administración de bases de datos Java DB/Apache Derby y MySQL. El capítulo contiene un Ejemplo práctico de OO sobre cómo desarrollar una libreta de direcciones controlada por una base de datos; en este ejemplo se de­ muestran lasinstrucciones preparadasy el descubrimiento automático de controladores de JDBC 4. • Java Server Faces (JSF) 2.0. Los capítulos 29 y 30 se actualizaron para introducir la tecnología JavaServer Faces (JSF) 2.0, que simplifica en gran medida la creación de aplicaciones Web con JSF. El capítulo 29 presenta ejemplos sobre la creación de interfaces GUI de aplicaciones Web, la vali­ dación de formularios y el rastreo de sesiones. El capítulo 30 habla sobre las aplicaciones JSF con­ troladas por datos y habilitadas para Ajax. Este capítulo cuenta con una libreta de direcciones Web muldnivel controlada por una base de datos, la cual permite a los usuarios agregar contactos y bus­ carlos. Esta aplicación habilitada para Ajax proporciona al lector una sensación real del desarrollo desoftwareWeb 2.0. • Servicios Web. Elcapítulo 31, Web Services, demuestra cómo crear y consumir servicios Web basa­ dosen SOAP^REST. Los Ejemplos prácticos presentan eldesarrollo de losserviciosWebdeljuego de blackjacky un sistemade reservaciones de una aerolínea. • Java WebStarty elProtocolo delanzamiento de reddeJava (JNLP). PresentamosJavaWeb Start y JNLP, que permiten lanzar applets aplicaciones a través de un navegador Web. Los usuarios pueden instalar estos applets y aplicaciones en forma local para ejecutarlos después. Los progra­ mas también pueden solicitar permiso al usuario para acceder a los recursos locales del sistema y a los archivos: con lo cual usted podrá desarrollar applets y aplicaciones más robustas que se ejecuten en forma segura mediante el modelo de seguridad de caja de arena (sandbox) de Java, el cual se aplica al código descargado. Multihilos (en inglésen elsitio Web) • Multihilos. Rediseñamos por completo el capítulo 26, Multithreading [con agradecimiento especial a laorientaciónde Brian GoetzyJoseph Bowbeer,dos de loscoautores deJava Concurrencyin Practi- ce,Addison-Wesley, 2006]. • La clase SwingWorker. Utilizamos laclase SwingWorker para crearinterfacesde usuario multihilos. www.FreeLibros.me
    • x x iv Prefacio GUIy gráficos • Presentación escalable de GUIy gráficos. Los profesores que impartan cursos introductorios tie­ nen una amplia gama de dónde elegir en cuanto a la cantidad de GUI y gráficos por cubrir: desde cero hasta una secuencia introductoria de 10 secciones breves, las cuales se entrelazan con los pri­ meros capítulos hasta llegar a un análisis detallado en los capítulos 14, 15 y 25 y en el apéndice I (este último y el apéndice, en inglés en el sitio Web). • Administrador de esquemas GroupLayout. Analizamos el administrador de esquemas GroupLayout dentro del contexto de la herramienta de diseño de GUI en elentorno de desarrollo integrado (IDE) NetBeans. • Herramientas de ordenamientoy filtrado de JTable. Elcapítulo 28 (en inglés en elsitio Web) uti­ liza estas herramientas para reordenar los datos en un objeto JTable y filtrarlos mediante expresio­ nes regulares. Otrascaracterísticas • Android Debido alenorme interésen los teléfonos inteligentesy tabletas basadasen Android, hemos integrado unaintroducciónde trescapítulos paraeldesarrollo de aplicaciones deAndroid (losencon­ trará en inglés en elsitio Web del libro). Estos capítulos son de nuestro nuevo libro Androidfor Pro- grammers:AnApp-DrivenApproach delaserieDeitelDeveloper. Una vez que aprendaJava, descubrirá que es bastante simple desarrollary ejecutar aplicaciones Android en elemulador gratuito que puede descargar de developer.android.com. • Conceptos comunes de ingeniería de software. Analizamos el desarrollo ágil de software, la refac- torización, los patrones de diseño, LAMP, SaaS (Software as a Service), PaaS (Platform as a Service), lacomputación en la nube, elsoftware de código abierto y muchos conceptos más. Gráfico de dependencias El gráfico de la siguiente página muestra las dependencias entre los capítulos para ayudar a los profe­ sores a planear su programa de estudios. Cómoprogramar enJava 9aedición es un libro extenso, apro­ piado para una gran variedad de cursos de programación en distintos niveles, en especial CS 1 y CS 2, además de las secuencias de cursos de introducción en disciplinas relacionadas. El libro tiene una organización modular, claramente delineada. Los capítulos 1 a 11 y 14 a 17 forman una secuencia de programación elemental accesible, con una sólida introducción a la programación orientada a objetos. Los capítulos opcionales 12 y 13 constituyen una introducción accesible al diseño orientado a obje­ tos con UML. Tanto la trayectoria de GUI y gráficos como los capítulos 14, 15, 23, 24 y 25 forman una secuencia sustancial de GUI, gráficos y multimedia. Los capítulos 18 a 22 forman una excelente cadena de estructuras de datos. Los capítulos 26 y 27 constituyen una sólida introducción a los con­ ceptosde multihilos yel trabajo en red através de Internet. Loscapítulos 28 a31 forman una secuencia enriquecida de desarrollo Web con uso intensivo de bases de datos. Métodos de enseñanza CómoprogramarenJava 9a ediciónoontiene cientos de ejemplos funcionales completos. Hacemos hin­ capié en la claridad de los programasy nos concentramos encrear software bien diseñado. www.FreeLibros.me
    • Prefacio x x v Gráfico de dependencias de capítulos y módulos [Nota: las flechas que apuntan hada un capítulo indican las dependencias de éste. Algunos capítulos tienen varias dependencias]. Programación orientada a objetos 8 Clases y objetos:-*— iri análisis más detallado í 9 Programadón orientada a objetos: herencia I • 10 Programadón orientada aobjetos: polimorfismo II Manejo de excepciones Diseño orientado a objetos con UML 12 (Opcional) Diseño orientado aobjetos con UML I 13 (Opcional) Implementación de un diseño orientado a objetos /^Éstructuras de datos 18 Recursividad1 19 Búsqueda, ordenamiento y Big O 20 Generic Collections — 21 Generic Classes and Methods 22Custom Generic Data Structures I . El capítulo 18 depende de los capítulos 14 y 15 para la GUI y los gráficos que se utilizan en un ejemplo. Introducción I Introducción a las computadoras ya Java Introducciónalaprogramación, lasclasesylosobjetos 2 Introducción a lasapfcacionesenJava- 3 Introducción a lascbses. objetos, métodosycadenas Instruccionesdecontrol, métodosy arreglos 4 Instrucciones de control: Parte I 5 Instrucciones de control: Parte 2 I 6 Métodos: un análisis más detallado . 7 Arreglos y objetos A rra y L i s t V Cadenas y archivos ► 16Cadenas, caracteres y expresiones regulares -► 17Archivos, flujos y serializadón de objetos Multihilos y redes 26 Multithreading2 27 Networking3 Diseño de aplicaciones de escritorio y Web controladas por bases de datos ► 28 JDBC4 ------------- 29JSF Web Apps: Part I 30 JSF Web Apps: Part 2 31 Web Services (Opcional) Trayectoria de GUI y gráficos 3.8 Uso de cuadros de diálogo 4.14 Creación de dibujos simples 5.10 Dibujo de rectángulos yóvalos I 6.13 Cobres y figuras rellenas 7.15 Dibujo de arcos 8.16Uso de objetos con gráficos 9.8 Mostrartexto e imág»nes usando etiquetas i10.8 Realizar dibujos usando polimorfismo GUI, gráficos, applets y multimedia 14Componentes de GUI: Parte I 15 Gráficos y Java2D • - * • 23 Applets and Java Web Start5 I 24 Multimedia: Applets and Applications I25GUIComponents: Rart 2 2. El capítulo 26depende del capítulo 14 para la GUI que se utiliza en un ejemplo yde los capítulos 20-21para otro ejemplo. 3. El capítulo 27depende del capítulo 23 para un ejemplo que utiliza un applet. El Ejemplo práctico extenso (en Web) depende del capítulo 25 para la GUI y del capítulo 26 para los multihilos. 4. El capítulo 28dependedel capítulo 14 para la GUI que se utiliza en un ejemplo. 5. En los capítulos 24y27se cubren más applets. www.FreeLibros.me
    • x x v i Prefacio Resaltado de código. Colocamos rectángulos de color gris alrededor de los segmentos de código clave en cada programa. Uso defuentespara dar énfasis. Resaltamos en negritas, dentro del texto, y en el índice, los térmi­ nos claveen los lugaresdonde se define. Enfatizamos los componentes en pantalla en la fuente Helvética en negritas (por ejemplo, el menú Archivo) y enfatizamos el texto del programa en la fuente Lucida (por ejemplo, int x = 5;). Acceso Web. Todo elcódigo fuenteutilizado eneste libro se puede descargar de: Capítulos 2 a 19 (en español): www.pearsonenespañol .com/deitel Capítulos2 a31 (en inglés): www.deitel .com/books/jhtp9 Objetivos. Las citas de aperturavan seguidas de una lista de objetivos del capítulo. Ilustraciones/figuras. Integramos una gran cantidad de tablas, dibujos lineales, diagramas UML, pro­ gramas ysalidas de programa. lips deprogramación. Incluimos tips de programación para ayudarle a enfocarse en los aspectos im­ portantes del desarrollo de programas. Estos tips y prácticas representan lo mejor que hemos podido recabar a lo largo de siete décadas combinadas de experienciaen la programación y laenseñanza. Buenas prácticas de programación LasBuenas prácticas de programación sontécnicasque leayudarán aproducirprogra­ masmásclaros,comprensiblesyfácilesdemantener. Errores comunes de programación AlponeratenciónenestosErrores comunes de programación sereducelaprobabilidad dequeustedpuedacaerenellos. Tips para prevenir errores Estostips contienen sugerenciasparaexponer loserrores ogusanosinformáticosy elimi­ narlosde susprogramas; muchosde ellosdescriben aspectosdejava que evitan que en­ trensiquieraasusprogramas. Tips de rendimiento Estosrecuadrosresaltan lasoportunidadespara hacerque susprogramasseejecuten más rápidooparaminimizar lacantidaddememoriaqueocupan. Tips de portabilidad Los Tips de portabilidad le ayudan a escribir código que pueda ejecutarse en varias plataformas. Observaciones de ingeniería de software LasObservaciones de ingeniería de softwareresaltantemasdearquitecturay diseño, lo cualafectalaconstruccióndelossistemasdesofiware,especialmentelosdegranescala. * n i Observaciones de apariencia visual B5B Las Observaciones de apariencia visual resaltan lasconvencionesde la interfazgráfica tleusuario.Además,leayudanadiseñarinterfacesgráficasdeusuarioatractivasy amiga­ blesenconformidadconlasnormasdelaindustria. www.FreeLibros.me
    • Prefacio x x v ii Viñetas de resumen. Presentamos un resumen detallado del capítulo, estilo lista con viñetas, sección por sección. Para facilitar la referencia, incluimos dentro del texto el número de página donde aparecen bs términos clave. Ejercicios de autoevaluación y respuestas. Se proveen diversos ejercicios de autoevaluación con sus respuestas para que los estudiantes practiquen por su cuenta. Todos losejercicios en el Ejemplo práctico opcional sobre elATM están resueltosen su totalidad. Ejercicios. Los ejerciciosde los capítulos abarcan: • Recordatorio simple de laterminologíay los conceptos importantes. • ¿Cuál esel error eneste código? • ¿Qué haceeste código? • Escriturade instrucciones individuales y pequeñas porciones de métodos y clases. • Escriturade métodos, clases y programas completos. • Proyectos importantes. • En muchos capítulos, ejerciciosdel tipo Hacer ladiferencia. índice. Incluimos un índice extenso. Donde se definen los términos clave se resaltan con un número de página en negritas. Software utilizado en Cómo programarenJava 9aedición Podrá descargar todo elsoftware necesario paraeste libro sincosto a través deWeb. En lasección “Antes deempezar”,después deeste Prefacio, encontrará vínculos paracada descarga. Para escribir la mayoría de los ejemplos de este libro utilizamos el kit de desarrollo gratuito Java Standard Edition Development Kit (JDK) 6. Para los módulos opcionales de Java SE 7 utilizamos la ersión JDK 7 de acceso anticipado de OpenJDK. En los capítulos 29 a 31 también utilizamos el IDE Netbeans; en el capítulo 28 usamos MySQL y MySQL Connector/J. Encontrará recursos y descargas desoftware adicionales en nuestros Centros de recursos deJava, ubicados en: www.deitel.com/ResoureeCenters.html Suplementos para el profesor (en inglés) Lossiguientessuplementos estándisponiblessóloparaprofesoresatravés del Centro de recursos parael pro­ fesorde Pearson (www.pearsonenespañol.com/deitel): • Diapositivas de PowerPoint!®oon todo elcódigo y las figuras del texto, además de elementos enviñetasque sintetizan los puntos clave. • Test Item File (Archivo de pruebas) oon preguntas de opción múltiple (aproximadamente dos por cadasección del libro). • Manualdesolucionesconsoluciones para lagran mayoríade losejercicios definal de capítulo. El accesoa estos recursosestá limitado estrictamente aprofesores universitarios que impartan cla­ ses con base en el libro. Sólo ellospueden obtener acceso atravésde losrepresentantesde Pearson. No se proveen soluciones para los ejercicios de “proyectos”. Revise nuestro Centro de recursos de proyectos de programación (www.deitel .com/Programmi ngProjects/), en donde encontrará muchos ejerciciosadicionalesy proyectos nuevos. Si no es un miembro docente registrado, póngase encontacto con su representante de Pearson. www.FreeLibros.me
    • x x v iii Prefacio Reconocimientos Queremos agradeceraAbbeyDeitely BarbaraDeitelpor lasextensas horasque dedicaron aesteproyecto. Somos afortunados al haber trabajado en este proyecto con el dedicado equipo de editores profesionales de Pearson. Apreciamos laorientación, inteligenciay energíade Michael Hirsch, editor en jefe de Cien­ ciascomputacionales. CaroleSnyderreclutó alosrevisores dellibro ysehizo cargo delproceso de revisión. Bob Engelhardtsehizo cargo delaproducción dellibro. Revisores Queremos agradecer los esfuerzos de los revisores de laoctava y novenaediciones, quienes revisaron ex­ haustivamente el texto y los programas, y proporcionaron innumerables sugerencias para mejorar la presentación: LanceAndersen (Oracle),Soundararajan Angusamy (SunMicrosystems),Joseph Bowbeer (Consultor),WilliamE. Duncan (LouisianaState University),Diana Franklin (UniversityofCalifornia, Santa Barbara), Edward E Gehringer (North Carolina State University), Huiwei Guan (Northshore Community College), Ric Heishman (George Masón University), Dr. Heinz Kabutz (JavaSpecialists. eu), Patty Kraft (SanDiego StateUniversity), Lawrence Premkumar (SunMicrosystems),Tim Margush (University ofAkron), Sue McFarland Metzger (Villanova University), Shyamal Mitra (The University ofTexas at Austin), Peter Pilgrim (Consultor), Manjeet Rege, Ph.D. (Rochester Insritute of Techno­ logy), Manfred Riem (Java Champion, Consultor, Robert Half), Simón Ritter (Oracle), Susan Rodger (Duke University), Amr Sabry (Indiana University), José Antonio González Seco (Parlamento de Andalucía), Sang Shin (Sun Microsystems), S. Sivakumar (Astra Infotech Prívate Limited), Raghavan “Rags” Srinivas (Inmit), Monica Sweat (Georgia Tech), Vinod Varma (Astra Infotech Prívate Limited) yAlexander Zuev (Sun Microsystems). Bueno,¡ahílo tiene!A medida que leaellibro,apreciaremosconsinceridadsuscomentarios,críticas, correccionesy sugerencias para mejorarlo. Dirija todasu correspondencia a: d e ite l@ d e ite l. com Leresponderemos oportunamente. Esperamos quedisfrute el trabajo coneste libro. ¡Buenasuerte! Pauly Harvey Deitel Acerca de los autores Paul J. Deitel, CEO y Director Técnico de Deitel & Associates, Inc., es egresado del Sloan School of Management del MIT, en donde estudió Tecnología de la Información. A través de Deitel & Asso­ ciates, Inc., haimpartido cursos deJava, C, C++, C#,Visual Basicy programación en Internet aclientes de la industria, como: Cisco, IBM, Siemens, Sun Microsystems, Dell, Lucent Technologies, Fidelity, NASA en el Centro Espacial Kennedy, el National Severe Storm Laboratory, White Sands Missile Range, Rogue Wave Software, Boeing, SunGard Higher Education, Stratus, Cambridge Technology Partners, OneWave,Hyperion Software, AdraSystems, Entergy, CableData Systems, NortelNetworks, Puma, iRobot, Invensys y muchos más. Él y su coautor, el Dr. Harvey M. Deitel, son autores de los li­ bros de programación más vendidos en el mundo. Dr. Harvey M. Deitel, Presidente y Consejero de Estrategia de Deitel & Associates, Inc., tiene 50 años de experiencia en el campo de lacomputación. El Dr. Deitel obtuvo una licenciatura y una maes­ tría por el MIT y un doctorado de la Universidad de Boston. Tiene muchos años de experienciacomo profesor universitario, la cual incluye un puesto vitalicio y el haber sido presidente del Departamento de Ciencias de laComputación en Boston College antes de fundar, con su hijo PaulJ. Deitel, Deitel & Associates, Inc. Él y Paul son coautores de varias docenas de libros y paquetes multimedia LiveLessons, ypiensanescribir muchos más. Lostextosde losDeitelse han ganado elreconocimiento internacionaly han sido traducidos al japonés, alemán, ruso, chino, español, coreano, francés, polaco, italiano, portu­ gués, griego, urdti y turco. El Dr. Deitel ha impartido cientos de seminarios profesionales para grandes empresas, instituciones académicas, organizaciones gubernamentalesy diversos sectores del ejército. www.FreeLibros.me
    • Prefacio x x ix Capacitación corporativa de Deitel & Associates, Inc. Deitel & Associates, Inc., es una empresa reconocida a nivel mundial, dedicada al entrenamiento cor­ porativo y la creación de contenido. La empresa proporciona cursos impartidos por profesores en las instalaciones de sus clientes en todo el mundo, sobre la mayoría de los lenguajes y plataformas de programación, como Java™, C++, Visual C++®, C, Visual C#®, Visual Basic®,XML®, Python®, tec­ nología de objetos, programación en Internet y World Wide Web, desarrollo de aplicaciones para Android™ e ¡Phone®, y una lista cada vez mayor de cursos adicionales de programación y desarrollo desoftware. Los fundadores de Deitel & Associates, Inc. son Paul J. Deitel y el Dr. Harvey M. Deitel. Entre sus clientes están muchas de las empresas más grandes del mundo, agencias gubernamentales, sectores del ejército e instituciones académicas. A lo largo de su sociedad editorial de 35 años con Hentice Hall/Pearson, Deitel & Associates, Inc. ha publicado libros de texto de vanguardia sobre programación, libros profesionales, y cursos de video UveLessons con base en DVD y Web. Puede contactarse con Deitel & Associates, Inc. y con los autores por medio de correo electrónico: d e ite l© d e ite l. com Para conocer más acerca de Deitel & Associates, Inc., sus publicaciones y su currículum mundial de laSerie de Capacitación CorporativaDive Int<P,visite: w w w .d e ite l.co m /tra in in g / ysuscríbase al boletín gratuito de correo electrónico, DeitelBuzz Online,en: w w w .d eite l.co m /n e w sle tte r/su b scrib e .h tm l Además puedeseguiralosautoresen Facebook (www. dei t e l . com/dei te l f an) yTwitter (©dei t e l ). www.FreeLibros.me
    • www.FreeLibros.me
    • Antes de empezar Esta sección contiene información que debería revisar antes de usar este libro, además de las instruc­ ciones para asegurar que su computadora esté configurada de manera apropiada para utilizarla con el libro. Publicaremos las actualizaciones a la sección “Antes de empezar” (en caso de necesitarse) en el siguiente sitio Web: w w w .deitel.com /books/jhtp9/ Convenciones de fuentes y nomenclatura Utilizamos fuentes paradiferenciar los componentes en la pantalla (como los nombres de menús y sus elementos) y el código o los comandos enJava. Nuestra convención hace hincapié en los componentes en pantalla en una fuente Helvética sans-serifen negritas (por ejemplo, el menú Archivo) y enfatiza el código ylos comandos enJavaen una fuente Lucidasans-serif(por ejemplo, System.out.pri nt1n()). Software a utilizar con el libro Podrá descargartodo elsoftware necesario para este libro sin costo a través de Web. Kit de desarrollo de softwareJava SE (JDK) 6y 7 Para escribir la mayoría de los ejemplos de este libro manejamos el kit de desarrollo gratuito Java Stan­ dard Edition Development Kit (JDK) 6, que estádisponible en: www. o r a c le . com/tec hnetw ork/j a v a /j avase/down1oads/i nde x . html Para los módulos opcionales deJava SE 7, empleamos laversiónJDK 7 de acceso anticipado de Open- JDK, que estádisponible en: d ic . s un. com. edgesu i t e . n e t/jd k7 /b i na r i e s - / i ndex. html Java DB, MySQLy MySQL Connector/J En el capítulo 28 (en inglés en el sitio Web del libro) utilizamos los sistemas de administración de bases de datos Java DB y MySQL Community Edition. Java DB es parte de la instalación del JDK. Al momento de escribir este libro el instalador de 64 bits delJDK no instalabaJava DB en forma apro­ piada. Si usted utiliza laversión de 64 bits deJava, tal vez necesite instalarJava DB por separado. Puede descargarJava DB de: www. o r a c le . com/tec hnetwo r k / j ava/ j av adb/down1o ads/i nde x . html Al momento de escribir este libro, la versión más reciente de MySQL Community Edition era la 5-5.8. Para instalar MySQL Community Edition en Windows, Linux o Mac OS X, consulte las ge­ neralidadessobre la instalación parasu plataformaen: • Windows: dev.m ysql.com /doc/refm an/5.5/en/w in d o w s-in sta lla tio n .h tm l • Linux: dev.m ysql. com/doc/refman/5. 5 / e n / lin u x - in s ta l1atio n -rp m . html • Mac OSX: d ev.m ysq l.co m /d o c/refm an /5.5 /en /m aco sx-in stallatio n .h tm l www.FreeLibros.me
    • x x x ii Antes de empezar Sigacon cuidado lasinstrucciones paradescargar e instalar elsoftware en su plataforma, el cual está dis­ ponible en: dev.mysql.com/downloads/mysql/ También necesita instalar el MySQL Connector/J (laJ se refiere aJava), que permite a los progra­ mas usarJDBC parainteractuar con MySQL. Puede descargar el MySQL Connector/J de dev.mysql.com/down1oads/connector/j/ Al momento de escribir este libro, laversión disponible de MySQL Connector/J era la 5.1.14. La do­ cumentación de Connector/J se encuentra en dev.mysql.com/doc/refman/5.5/en/connector-j.html Rarainstalar MySQL Connector/J,sigacon cuidado las instrucciones deinstalación en: dev.mysql.com/doc/refman/5.5/en/connector-j-installi ng.html No le recomendamos modificar la variable de entorno CLASSPATHde su sistema, según se indica en las instrucciones de instalación. En cambio le enseñaremos a usar MySQL Connector/J especificándolo como una opción en la Enea de comandos alejecutar sus aplicaciones. Cómo obtener los ejemplos de código Los códigos de los ejemplosde este libro están disponibles para descargarlos en www.pearsonenespañol.com/deitel Si no está registrado aún en nuestro sitio Web (de los autores), vayaa www.deite l.comy haga clic en el vínculo Register debajo de nuestro logotipo en la esquina superior izquierda de la página. Escriba su información. El registro no tiene ningún costo y no compartiremos su información con nadie. Sólo le enviaremos correos electrónicos relacionados con laadministración de su cuenta. También puede regis­ trarse de manera independiente para recibir nuestro boletín gratuito de correo electrónico Deitel®Buzz Online en www.deitel .com/newsletter/subscribe .html. Una vez que se registre en el sitio, recibirá un correo electrónico de confirmación con su código de verificación. Haga clic en elvínculo del correo electrónicodeconfirmaciónpara completarsu registro. Configuresu cliente de correo electrónico de modo que permita los correos electrónicos provenientes de deitel .com, para asegurar que el correo electró­ nico de confirmación no se filtrecomo correo basura. Después vaya a www.deite l.come inicie sesión usando el vínculo Login debajo de nuestro logo­ tipo en la esquina superior izquierda de la página. Vaya a www.deitel .com/books/jhtp9. Encontrará elvínculo paradescargar los ejemplos bajo el encabezado Download Code Examples and Other Premium Contenífor Registered Users (Descargarejemplos decódigo ycontenido especial adicional parausuarios registrados). Anote la ubicación en donde eligió guardar el archivo ZIP en su computadora. En estelibro suponemosque losejemplosseencuentran eneldirectorio C: Ej emplos desucompu­ tadora. Extraiga el contenido del archivo Ejemplos.zip; utilice una herramienta como WinZip (www.winzi p.com)o las herramientas integradas de su sistemaoperativo. Cómo establecer la variable de entorno PATH La variable de entorno PATHen su computadora designa los directorios en los que la computadora debe buscar aplicaciones,como lasque le permiten compilary ejecutar sus aplicacionesdeJava (las cuales son javacy java,respectivamente). SigaconcuidadolasinstruccionesdeinstalaciónparaJavaensuplataforma, de modoqueseaseguredeestablecerde manera correcta la variabledeentorno PATH. www.FreeLibros.me
    • Antes de empezar x x x iii Si no establece la variable PATH de manera correcta, cuando utilice las herramientas del JDK reci­ birá un mensaje como éste: ‘ ja v a ’ no se reconoce como un comando in te rn o o extern o , programa o a rch iv o por lo te s e je c u ta b le . En este caso, regrese a las instrucciones de instalación para establecer la variable PATH y vuelva a com­ probar sus pasos. Si descargó una versión más reciente del JDK, tal vez tenga que cambiar el nombre deldirectorio de instalación delJDK en lavariable PATH. Cómo establecer la variable de entorno CLASSPATH Siintenta ejecutar un programadeJavay recibe un mensaje como éste: Exceptio n in thread “main” java.lan g .N o C lassD e fFo u n d Erro r: SuClase entonces su sistema tiene una variable de entorno CLASSPATH que debe modificar. Para corregir este error, siga los pasos para establecer lavariable de entorno PATH, localice lavariable CLASSPATH y modifi­ que su valor para que incluya el directorio local: que por lo general se representa como un punto (.). EnWindows agregue al principio del valor de CLASSPATH (sin espacios antes o después de esos caracteres). En otras plata­ formas, sustituya el punto y coma con los caracteres separadores de ruta apropiados: por lo general, el signo de dos puntos (:). Apariencia visual Nimbus de Java Java tiene una apariencia visual multiplataforma elegante, conocida como Nimbus. En los programas con interfaz gráfica de usuario, hemos configurado nuestros sistemas para usar Nimbus como la apa­ rienciavisual predeterminada. Para establecer Nimbus como la opción predeterminada para todas las aplicaciones de Java, debe crear un archivo de texto llamado sw ing. p ro p e rtie s en la carpeta l ib de las carpetas de instalación delJDK y delJRE. Coloque lasiguiente línea decódigo en elarchivo: swi n g . d e f a u lt i af=com . s u n . j a v a . swi n g . pl a f . ni mbus. NimbusLookAndFeel Para obtener más información sobre cómo localizar estas carpetas de instalación, visite j a va. s un. com/ javase/6/w ebnotes/i n s t a ll/ i ndex. htm l. [Nota: además del JRE individual hay un JRE anidado en su carpeta de instalación del JDK. Si utiliza un IDE que depende del JDK (como NetBeans), tal vez también tenga que colocar el archivo swi ng. prope r t i es en la carpeta 1i b de lacarpeta j re anidada]. Ahora está listo para empezar sus estudios de Java con el libro Cómoprogramar enJava, 9aedición. ¡Esperamos quedisfrute el libro! www.FreeLibros.me
    • www.FreeLibros.me
    • Introducción a las computadoras y aJava www.FreeLibros.me
    • Plangeneral 2 Capítulo I Introducción a las computadoras y a Java 1.1 Introducción 1.2 Computadoras: hardware y software 1.3 Jerarquía de datos 1.4 Organización de una computadora 1.5 Lenguajes máquina, lenguajes ensambladores y lenguajes de alto nivel 1.6 Introducción a la tecnología de los objetos 1.7 Sistemas operativos 1.8 Lenguajes de programación 1.9 Java y un típico entorno de desarrollo en Java 1. 10 Prueba de una aplicación en Java l.l I Web 2.0: Las redes sociales 1.12 Tecnologías de software 1.13 Cómo estar al día con las tecnologías de información 1.14 Conclusión Ejercicios de autoevaluación | Respuestasa los ejercicios de autoevaluación Ejercicios Marcar la diferencia Recursospara marcar la diferencia l.l Introducción Bienvenido aJava: el lenguaje de programación de computadoras más utilizado en el mundo. Usted ya está familiarizado con las poderosas tareas que realizan las computadoras. Mediante este libro de texto, ustedescribiráinstrucciones paraordenaralascomputadoras que realicenesostipos de tareas. El software (lasinstrucciones que usted escribe) controla elhardwarefas computadoras). Aprenderá sobre laprogramación orientada a objetos-, la metodología de programación clave de la actualidad. En este texto crearáy trabajarácon muchos objetosdesoftware. Javaesellenguajepreferido parasatisfacerlasnecesidadesde programaciónempresarialesde muchas organizaciones. También se ha convertido en el lenguaje de elección para implementar aplicaciones ba­ sadas en Internetysoftware paradispositivos que se comunican através de una red. Hoy en día hay en uso másde mil millones de computadoras de propósito general, además de miles de millones de teléfonos celulares, teléfonos inteligentes (smartphones) y dispositivos portátiles (como lascomputadoras tipo tableta) habilitados paraJava. De acuerdo con un estudio realizado poreMarketer, elnúmero deusuarios móvilesde Internet llegaráacercade 134 millones para2013.1Otros estudios han proyectado ventas de teléfonos inteligentes que sobrepasa a las ventas de computadoras personales en 20112yventasde tabletasque representarán cerca del20% de todas lasventasde computadoras persona­ lespara2015.3Para2014, seesperaqueel mercado delasaplicaciones deteléfonos inteligentesexcedalos $40 mil millones,4lo cual generará oportunidades importantes para la programación de aplicaciones móviles. EdicionesdeJava: SEyEEyME Java ha evolucionado con tanta rapidez que esta novena edición de Cómoprogramar enJava —basada enJavaStandard Edition 6 (JavaSE 6) con módulosopcionalessobre lasnuevascaracterísticasdeJava SE 7 —se publicó sólo 15 años después de la primera edición. Javase utiliza en un espectro tan amplio de aplicaciones, que cuenta con otras dos ediciones. Java Enterprise Edition (Java EE) está orientada hacia el desarrollo de aplicaciones de red distribuidas, de gran escala, y aplicaciones basadada en Web. 1 wttw.clrcleid.com/posts/mobile_internet_users_to_reach_134_jnil lion by_2013/. 2 v%vw.pcworld.com/article/171380/more smartphones_than_desktop_pcs_by_2011.html. 3 vwv.forrester.com/ER/Press/Release/0,1769,1340,00.html. 4 Inc. diciembrede 2010/enero de 2011, páginas 116-123. www.FreeLibros.me
    • l.l Introducción 3 En el pasado, la mayoría de las aplicaciones de computadora se ejecutaban en computadoras “indepen­ dientes” (que no estaban conectadas en red). En la actualidad, las aplicaciones se pueden escribir con miras a comunicarse entre computadoras en todo el mundo por medio de Internet y Web. Más adelante en este libro hablaremos sobre cómo crear dichas aplicaciones basadas en Web con Java. Java Micro Edition (Java ME) está orientada hacia el desarrollo de aplicaciones para pequeños dispositivos con memoria restringida, como los teléfonos inteligentes BlackBerry. El sistema operativo Android de Google — que se utiliza en muchos teléfonos inteligentes, tabletas (pequeñas computadoras ligeras y móviles con pantallas táctiles), lectores electrónicos y otros dispositivos— utiliza una versión personalizada de Javaque no se basa en Java ME. La computación en la industriay la investigación Estos son tiempos emocionantes en el campo de la computación. Muchas de lasempresas más influyen­ tes y exitosas de las últimas dos décadas son compañías de tecnología, como Apple, IBM, Hewlett Packard, Dell, Intel, Motorola, Cisco, Microsoft, Google,Amazon, Facebook,Twitter, Groupon, Fours- quare, Yahoo!,eBay y muchas más; que son fuentes de empleo importantes para las personas que estudian ciencias computacionales, sistemas de información o disciplinas relacionadas. Al momento de escribir este libro, Apple era la segunda compañía más valiosa del mundo, con la tecnología más preciada.5 Las computadoras también se utilizan mucho en la investigación académica e industrial. La figura 1.1 provee unos cuantos ejemplos de las increíbles formas en que se utilizan las computadoras, tanto en la investigación como en la industria. Nombre Descripción Internet Proyecto Genoma Humano Internet—una red globalde computadoras— se hizo posible graciasa la convergenciadelacomputacióny lascomunicaciones.Tiene sus raícesen ladécadade 1960; supatrocinio estuvoa cargodel Departamento de Defensa de EstadosUnidos. Diseñadaen un principio paraconectar lossistemas de cómputo principalesdealrededordeuna docena deuniversidades yorganiza­ ciones deinvestigación, en laactualidadson miles demillones de compu­ tadorasy dispositivoscontroladospor computadoraen todo el mundo losque utilizan Internet. Las computadoras descomponen las extensastransmisiones en paquetes en elextremo emisor,envían lospaquetesa losreceptores destinados yaseguran que sereciban en secuenciay sin errores en el extremo receptor. Deacuerdo con un estudio de Forrester Research, el consumidor estadounidense promedio invierteen laactualidad la misma cantidad de tiempo en líneaque elque pasaen latelevisión ( f o r r e s t e r . com/ rb / Research/unde rs ta n d i ng_changi n g _n e e d s_o f_u s_o n 1i ne_consum er/g/ id / 5 7 8 6 1 / t/2 ). El Proyecto GenomaHumano se fundó para identificaryanalizarlosmás de 20,000 genes en elADN humano. Elproyecto utilizó programas de computadora paraanalizardatos genéticoscomplejos, determinarlas secuenciasde losmilesde millonesde paresde bases químicas que componen elADN humano yalmacenarla información en bases de datosque sehan puesto a disposición delosinvestigadoresen muchos campos. Esta investiga­ ción haocasionado una tremenda innovación ycrecimiento en la industria dela biotecnología. Fig. l.l | Unos cuantos usos para las computadoras (parte I de 3). 5 w v w .zd n e t.co m /b lo g /a p p le /a p p le -b e co m e s-w o rld s-se co n d -m o st-va l uable-com pany/9047. www.FreeLibros.me
    • Capítulo I Introducción a las computadoras y a Java Nombre ReddelaComunidad Mundial Imágenespara diagnósticomédico GPS SYNC®deMicrosoft AMBER™ Alert Robots Descripción LaReddelaComunidad Mundial (wvwv.worldcoranunit y g r id .o r g ) esuna reddecomputaciónsinfinesde lucro. Laspersonasdetodoelmundodonan el poderde procesamientodecómputoqueno utilicen, mediantela instalacióndeun programadesoftwaresegurogratuito que permitealaRed delaComunidad Mundialaprovecharesepodersobrantecuando las computadorasestán inactivas. Elpoderdecómputo seutiliza en lugardelas supercomputadoraspararealizarproyectosdeinvestigacióncientíficosque están haciendoladiferencia,entreellos: eldesarrollodeenergíasolara un precioasequible,elsuministro deaguapotablealmundo endesarrollo, la luchacontraelcáncer, lacura deladistrofiamuscular,elhallazgode medicamentosantiviralescontralainfluenza,elcultivodearrozmás nutritivoparalasregionesquecombaten lahambruna yotrosmás. Lasexploracionesportomografía computarizada (CT) con rayosX,también conocidascomoCAT(tomografíaaxialcomputarizada), toman rayosXdel cuerpodesdecientosdeángulosdistintos.Seutilizancomputadoraspara ajustarlaintensidaddelrayoX,con locualseoptimizalaexploraciónpara cadatipo detejido,para despuéscombinartoda lainformaciónycrearuna imagen tridimensional (3D). LosdispositivosconSistemade posicionamientoglobal (GPS) utilizanuna reddesatélitesparaobtenerinformacióncon baseenlaubicación.Varios satélitesenvíanseñalesconetiquetasde tiempoaldispositivo GPS,elcual calculaladistancia haciacadasatélitecon baseenlahoraenquelaseñalsalió delsatéliteyserecibió. La ubicación decadasatéliteyladistanciahaciacada unodeellosseutilizanpara determinarlaubicaciónexactadel dispositivo. Segúnlaubicaciónen laqueustedseencuentre, losdispositivosGPSpueden proveerindicacionespasoapaso,ayudarleaencontrarcon facilidadnegocios cercanos(restaurantes,gasolineras,etcétera)ypuntos deinterés,oayudarlea encontrarasusamigos. AhoramuchosautosFordcuentancon la tecnologíaSYNCdeMicrosoft, la cual proveecapacidadesde reconocimientoysíntesisdevoz (paraleer mensajesdetextoa lospasajeros)que lepermiten usarcomandosdevozpara explorarmúsica,solicitaralertasdetráficoyotrascosasmás. ElSistema dealertaAMBER(DesaparecidosenAmérica: Sistemade TransmisióndeRespuestaaEmergencias) seutilizaparabuscarniños secuestrados. Lasautoridadesnotifican tantoalasdifusorasdeTVy radio comoalosfuncionariosdecarreterasestatales,quienesasu veztransmiten alertasenTV, radio,señalescomputarizadasenlascarreteras, Internetylos dispositivosinalámbricos.AMBERAlertseasociórecientementecon Facebook. Cuyosusuariospueden hacerdicen “Like”(“Megusta”)en las páginasdeAMBERAlertsegúnla ubicación, para recibiralertasensus transmisionesdenoticias. Losrobotssonmáquinascomputarizadasque puedenrealizartareas(como; trabajosfísicos),responderalosestímulosyotrascosasmás.Sepuedenutilizar paratareasdiarias(porejemplo, laaspiradoraRoombade¡Robot),deentreteni­ miento(comolasmascotasrobóticas),combatemilitar,exploraciónespacialy enlaprofundidaddelocéano, manufacturayotrasmás.En2004,eltrotamun­ dosmarcianodelaNASAacontrolremoto-queutilizabatecnologíaJava—ex­ plorólasuperficieparaaprendersobrelahistoriadelaguaenelplaneta. Fig. l . l | Unos cuantos usos para las computadoras (parte 2 de 3). www.FreeLibros.me
    • 1.2 Computadoras: hardware y software 5 Nombre Descripción Unalaptopporniño (OLPC) Programación dejuegos TV por Internet UnaLaptop PorNiño (OLPC)ofrecelaptopseconómicas, habilitadas para Internetyde bajoconsumodeenergíaparalosniñospobresentodoel mundo;graciasaellofomentan elaprendizajey reducen laseparacióndigital (one.1aptop.org ). Alproveerestosrecursoseducativos, OLPCaumenta las oportunidadesdequelosniñospobresaprendan yhagan ladiferenciaensus comunidades. Elnegociode losjuegosdecomputadoraesmás grandequeelde las películasdeestreno.Eldesarrollode losvideojuegosmássofisticados puede costarhasta $100 millones. Eljuego CaliofDuty2:ModernWarfarede Activision, lanzadoal públicoennoviembrede 2009, obtuvo $ 3 1 0 millones ensóloun díaen NorteaméricayelReinoUnido (n e w s.cn e t.c o m /8 301- 1 3 7 7 2 _3 -1 0 3 9 6 5 9 3 -5 2 .h tm l?tag -m n co l ;txt)! Losjuegossocialese.nlínea, quepermiten ausuariosde todoelmundocompetirentresí,estáncrecien­ docon rapidez. Zynga—creadorde juegosen línea populares,como FarmvilleyMafiaWars—sefundóen 2007 yyacuentacon másde215 millonesde usuariosmensuales. Paradarcabidaalaumentoen eltráfico, ¡Zyngaagregacasi 1 ,0 0 0 servidores porsemana (te c h c ru n c h . co m /2 0 10/09/22/zyn g a-m o ves-l- p e ta b y te - o f- d a ta - d a ily - a d d s - 1 0 0 0 -se rv e rs-a -w e e k /)! Lasconsolasde videojuegostambién seestán volviendocadavezmássofisticadas. ElcontrolremotodelWii utilizaun acelerómetro(paradetectarlainclinaciónylaaceleración)juntocon un sensorquedetermina haciadónde apuntaeldispositivo, locuallepermite responderalmovimiento.Alhacerademanescon elcontrolremotodelWii en lamano, usted puedecontrolarelvideojuegoen lapantalla. Con Kinect paraelXbox3 6 0 de Microsoft, usted—eljugador—seconvierteen el controlador. Kinect utilizaunacámara, un sensordeprofundidad y software sofisticado paraseguirelmovimientodesucuerpo, locuallepermite controlareljuego (e n .w ik i p e d ia .o r g / w ik i/ K in e c t ). Con losjuegosde Kinectpuede bailar, hacerejercicio, jugardeportes,entrenaranimales virtualesyvariasactividadesmás. LosreceptoresdeTV por Internet (comoAppleTVyGoogleTV) ledan accesoadiversos tiposdecontenido—comojuegos, noticias, películas, programasdetelevisiónymás—,con locual ustedpuedeaccederáunagran cantidaddecontenido bajodemanda;yano necesitadependerdelos proveedoresde televisiónporcableovíasatélitepararecibircontenido. F ig . l . l | Unos cuantos usos para las computadoras (parte 3 de 3). 1.2 Computadoras: hardware y software Unacomputadora esun dispositivo capazderealizarcálculosy tomardecisiones lógicascon unarapidez increíblemente mayor que los humanos. Muchas de las computadoras personales contemporáneas pue­ den realizar miles de millones de cálculos en un segundo —más de lo que un humano podría realizar en toda su vida. Las supercomputadorasya pueden realizar miles de billonesde instrucciones por segundo! Dicho de otra forma, una computadora de mil billones de instrucciones por segundo puede realizar en un segundo másde 100,000 cálculos¡paracadaunode loshabitantesdelplaneta!¡Yestos“límitessuperio­ res”están aumentando con rapidez! www.FreeLibros.me
    • 6 Capítulo I Introducción a las computadoras y a Java Las computadoras procesan datos bajo el control de conjuntos de instrucciones conocidas como programas de computadora. Los cuales guían a la computadora a través de conjuntos ordenados de acciones especificadas por gente conocida como programadores de computadoras. A los programas que se ejecutan en una computadora se les denomina software. En este libro aprenderá lametodología de programación clave de la actualidad que mejora la productividad del programador, con lo cual se reducen los costosde desarrollo del software:programación orientada a objetos. Una computadora consiste en varios dispositivos conocidos como hardware (teclado, pantalla, ra­ tón, discos duros, memoria, unidades de DVD y unidades de procesamiento). Los costos de las compu­ tadoras han disminuido enforma espectacular, debido a los rápidos desarrollos en las tecnologías de hardware y software. Las computadoras que ocupaban grandes habitaciones y que costaban millones dedólareshacealgunasdécadas, ahorapuedencolocarseen lassuperficiesdechipsdesiliciomáspequeños que una uña, y con un costo de quizá unos cuantos dólares cada uno. Aunque suene irónico, el silicio es uno de los materiales más abundantes en el planeta (es uno de los ingredientes de la arena común). La tecnología de los chips de silicio ha vuelto tan económica a la tecnología de lacomputación que hay más de mil millones de computadoras de uso general funcionando a nivel mundial, y se espera que esta cifrase dupliquesn lospróximos años. Los chips de computadora (microprocesadores) controlan innumerables dispositivos. Entre estos sistemas incrustadosestán: frenos antibloqueo en los autos, sistemas de navegación, electrodomésticos inteligentes, sistemas de seguridad en el hogar, teléfonos celulares y teléfonos inteligentes, robots, inter­ secciones de tráfico inteligentes (collision avoidance systems), controles de videojuegos y más. La gran mayoría de los microprocesadores que se producen cada año están incrustados en dispositivos que no soncomputadoras depropósito general.6 Ley de Moore Es probable que cada año, espere pagar por lo menos un poco más por la mayoría de los productos y servicios. En elcaso de los campos de lascomputadoras y las comunicaciones se ha dado lo opuesto, en especialcon relación aloscostosdelhardware quedasoporteaestas tecnologías. Loscostos del hardware han disminuido con rapidez durantevariasdécadas. Cada uno o dos años, lascapacidades de lascompu­ tadoras seduplican aproximadamentesin que el precio seincremente. Esta notableobservación secono­ ceen elámbito comúncomo laLeyde Moore, ydebesu nombre alapersonaque identificó esta tenden­ cia: Gordon Moore, cofundador de Intel, uno de los principales fabricantes de procesadores para las oomputadorasylossistemas incrustados de laactualidad. LaLeyde Mooreylasobservaciones relaciona­ das son especialmente ciertas en cuanto a la cantidad de memoria que tienen las computadoras para los programas, la cantidad de almacenamiento secundario (como el almacenamiento en disco) que tienen para guardar los programasy datos durante periodos extendidos de tiempo, y lasvelocidades de sus pro­ cesadores: las velocidades con que las computadoras ejecutan sus programas (realizan su trabajo). Se ha producido un crecimiento similar enel campo de las comunicaciones, endonde loscostossehan desplo­ mado a medida que la enorme demanda por el ancho de banda de las comunicaciones (la capacidad de transmisión de información) atrae una competencia intensa. No conocemos otros cambios en los que la tecnología mejore con tanta rapidez y los costos disminuyan de una manera tan drástica. Dicha mejora fenomenal está fomentando sin duda la Revolución dela información. 1.3 Jerarquía de datos Loselementosde datos que procesan lascomputadoras forman unajerarquíade datosque sevuelvecada vez más grande y compleja en estructura, a medida que progresamos primero a bits, luego a caracteres, despuésa camposy asíen losucesivo. La figura 1.2 ilustraunaporción delajerarquía dedatos. La figura 1.3 sintetiza los nivelesde lajerarquíade datos. 6 wtt%v. e e tira e s .c o m / e le c tro n ic s - b lo g s / in d u s tr i a l- c o n t r o l -d es i gnl i n e -b lo g /4027479/ Rea1-men- prog ram -i n-C? pageN umber-1. www.FreeLibros.me
    • 1.3 Jerarquía de datos 7 S a líy Negro Tom A zul 3udy Verde I r i s N ara n ja Randy Ro jo 3udy Verde í 3 u d y Campo t 00000000 01001010 Carácter Unicode 3 í 1 Bit Fig. 1.2 | Jerarquía de datos. Nivel Descripción Bits El elemento de datos más pequeño en una computadora puedeasumirelvalor0 o el valor 1.A dicho elemento dedatos se ledenomina bit (abreviación de “dígito binario”:un dígito que puedeasumir uno de dosvalores). Esnotable que lasimpresionantes funcionesque realizan lascomputadoras sólo impliquen lasmanipulaciones más simplesde Osy ls: examinarelvalordeunbit,establecer elvalordeunbiteinvertirelvalordeunbit(de 1a 0o de 0a l). Caracteres Estedioso para laspersonastrabajarcon datos en elformato de bajo nivelde los bits. En cambio, prefieren trabajar con dígitosdecimales(0-9), letras(A-Z ya-z) y símbolosespeciales(porejemplo, $, @, %, &, *, (,), +, “,?y /). Los dígitos, letras ysímbolos especialesseconocen como caracteres. El conjunto de caracteresde lacomputadora eselconjunto de todos los que seutilizan para escribirprogramas yrepresentarelementosde datos. Lascomputadorassólo procesan los 1ylos 0, por loque elconjunto decaracteresde una computadora representaa cada uno como un patrón de los 1ylos 0.Java usacaracteres Ltaicode®que están compuestos de dos bytes, cada uno delos cualesestá formado a su vez deocho bits. Unicodecontiene caracteres para muchosde losidiomas en el mundo. En el apéndiceLobtendrá másinformación sobreUnicode. En elapéndice Bconocerá másinformación sobreelconjunto de caracteresASCII (Código estándar estadounidense parael intercambio de información):el popular subconjunto de Unicodeque representa lasletrasmayúsculasyminúsculas, losdígitosy algunoscaracteresespecialescomunes. Archivo Registro Fig. 1.3 | Niveles de lajerarquía de datos (parte I de 2). www.FreeLibros.me
    • 8 Capítulo I Introducción a las computadoras y a Java Nivel Descripción Campos Asícomo loscaracteresestán compuestosde bits, loscampos loestán por caractereso bytes. Un campo esun grupo de caracteres o bytesque transmiten un significado. Porejemplo, un campo compuesto de letrasmayúsculasyminúsculas se puede usarpara representarel nombredeuna persona, yuno compuesto de dígitosdecimales podría representarsu edad. Registros Sepueden usarvarios camposrelacionadosparacomponerun registro (elcual se implementa como una elase enJava). Porejemplo, en un sistemadenómina, el registro deun empleado podría consistiren lossiguientescampos (los posibles tipospara éstos semuestran entre paréntesis): • Número de identificación del empleado (un número entero) • Nombre (una cadena decaracteres) • Dirección (una cadena de caracteres) • Salario por horas (un número con punto decimal) • Ingresosdelaño a lafecha (un número con punto decimal) • Monto de impuestosretenidos (un número con punto decimal) Así, un registro esun grupo de campos relacionados. En el ejemplo anterior, todos loscampos pertenecen al mismo empleado. Una compañía podría tenermuchos empleadosyun registrodenómina para cada uno. Archivos Un archivoes un grupo deregistrosrelacionados. [Nota:Dicho en formamás general, un archivocontienedatosarbitrariosen formatos arbitrarios. En algunos sistemasoperativos, un archivosevetan sólocomo unasecuenciadebytes:cualquier organización deesosbytes en un archivo, como cuando seorganizan losdatosen registros, es una vistacreada porel programadordelaaplicación].Es muycomún que una organización tengamuchosarchivos, algunos deloscualespueden contenermiles demillones, o incluso billones decaracteres deinformación. Fig. 1.3 | Niveles de lajerarquía de datos (parte 2 de 2). 1.4 Organización de una computadora Sinimportar lasdiferenciasen laaparienciafísica,esposiblepercibiralascomputadoras como siestuvie­ ran divididas en varias unidades lógicaso secciones (figura 1.4). Unidad lógica Descripción Unidad Esta sección “receptora”obtiene información (datos yprogramasdecómputo) de los deentrada dispositivosde entradayla pone a disposición de lasotras unidades paraque pueda procesarse. La mayorpartedela información se introducea travésde los teclados, pantallas táctilesyratones. La información también puedeintroducirse de muchas otras formas, como hablar con su computadora, digitalizarimágenes ycódigosde barras, leerdispositivos dealmacenamiento secundario (como discosduros, unidades de DVD, Blu-ray Disc™ y FlashUSB —también conocidascomo “unidadesde pulgar”o “memorysticks”), recibirvideo deuna cámara Web einformación en su computadora a travésde Internet (como cuando descarga videosdeYouTube™ o libroselectrónicosdeAmazon). Lasformas más recientesdeentrada son: leerlos datosde la posición a través deun dispositivo GPS, yla información sobre el movimiento ylaorientación mediante un acelerómetro en un teléfono inteligente o un controlador dejuegos. Fig. 1.4 | Unidades lógicas de una computadora (parte I de 2). www.FreeLibros.me
    • 1.4 Organización de una computadora 9 Unidad aritmética y lógica (ALU) Unidad central de procesamiento (CPU) Unidad de almacenamiento secundario Descripción Estasecciónde“embarque”toma informaciónque ya hasido procesadapor lacompu­ tadora ylacolocaen losdiferentesdispositivosde salida, paraque esté disponible fuerade lacomputadora. En laactualidad, lamayorparte dela informaciónde salida de lascomputadorassedespliegaen pantallas, seimprimeen papel, sereproducecomo audio o video en reproductores demedios portátiles (como lospopulares iPodde Apple)ypantallasgigantesen estadiosdeportivos, se transmitea travésde Internet 0 se utiliza paracontrolar otrosdispositivos, como robotsy aparatos “inteligentes”. Esta sección de “almacén” deacceso rápido, pero con relativabajacapacidad, retiene lainformación queseintroducea travésde la unidaddeentrada, paraqueesté disponibledemanera inmediata y se pueda procesarcuando seanecesario. La unidad de memoria también retiene la información procesada hasta que la unidad de salida pueda colocarlaen losdispositivos desalida. La información en la unidadde memoria es volátil',por logeneralse pierdecuando seapaga lacomputadora. Con frecuencia, a la unidad de memoria seleconoce como memoria o memoria principal.Las típicas memorias principalesen las computadorasdeescritorio yportátilescontienen entre 1GB y 8GB (GB se refierea gigabytes; un gigabyte equivaleaproximadamente a mil millonesde bytes). Esta sección de “manufactura” realiza cálculoscorno suma, resta, multiplicación y división.También contiene los mecanismosde decisiónque permiten a lacompu­ tadora hacercosascomo, porejemplo, comparar doselementosde la unidadde memoria para determinar sison igualeso no. En lossistemasactuales, laALU se implementa por logeneralcomo parte de lasiguiente unidad lógica, la CPU. Esta sección “administrativa” coordina ysupervisa laoperación delas demás. La CPU le indicaa la unidad de entrada cuándo debe grabarsela información dentro dela unidad dememoria, a laALU cuándo debe utilizarsela información dela unidad de memoria para los cálculos, ya la unidaddesalidacuándo enviarla información desdelaunidadde memoria hastaciertosdispositivosdesalida. Muchasde lascompu­ tadorasactualescontienen múltiples CPU y, porlo tanto, pueden realizarmuchas operaciones de manera simultánea. Un procesador multinúcleo implementa varios procesadores en un solochip de circuitosintegrados; unprocesadordedoblenúcleo (dual-core)tiene dosCPU yunprocesadorde cuádruplenúcleo(quad-core)tiene cuatro CPU. Las computadoras de escritorio delaactualidad tienen procesadores que pueden ejecutarmilesde millones deinstrucciones porsegundo. Ésta es lasección de “almacén”de alta capacidady de largaduración. Los programas o datos que no utilizan las demás unidadescon frecuenciasecolocan en dispositi­ vosdealmacenamiento secundario (porejemplo, eldiscoduro)hasta queserequieran de nuevo, locual puede sercuestión de horas, días, meses o incluso años después. La información en losdispositivos de almacenamiento secundario espersistente: seconserva aún ycuando seapaga lacomputadora. El tiempo para accedera la información en almacenamiento secundario esmucho mayor que el necesario para accedera lade la memoria principal, pero el costo por unidad de memoria secundaria esmucho menor que elcorrespondiente a la unidad de memoria principal. Las unidades de CD, DVD yFlash USB son ejemplos de dispositivos de almacenamiento secundario, loscuales pueden contener hasta 128 GB. Los discos duros típicosen las computadoras de escritorio y portátiles pueden contener hasta 2 TB (TB se refiere a terabytes; un terabyte equivale aproximada­ mente a un billón de bytes). Fig. 1.4 | Unidades lógicas de una computadora (parte 2 de 2). Unidad lógica Unidad de memoria Unidad de salida www.FreeLibros.me
    • 10 Capítulo I Introducción a las computadoras y a Java 1.5 Lenguajes máquina, lenguajes ensambladores y lenguajes de alto nivel Los programadores escriben instrucciones en diversos lenguajes de programación, algunos de los cua­ les los comprende directamente la computadora, mientras que otros requieren pasos intermedios de traducción. En laactualidadseutilizancientos delenguajesdecomputación. Éstossedividen en tres tipos generales: 1. Lenguajes máquina 2. Lenguajes ensambladores 3. Lenguajesde alto nivel Cualquiercomputadorapuedeentenderde maneradirectasólo su propio lenguaje máquina, elcual se define según su diseño de hardware. Por lo general, los lenguajes máquina consisten en cadenas de números (que finalmente se reducen a los 1y 0) que instruyen a las computadoras para realizar sus ope­ raciones más elementales, una a la vez. Los lenguajes máquina son dependientesde la máquina (es decir, un lenguaje máquina en particular puede usarse sólo en un tipo decomputadora). Dichos lenguajes son difíciles decomprender para los humanos. Porejemplo, heaquílasección de uno de losprimeros progra­ mas en lenguaje máquina, el cual suma el pago de las horas extras al sueldo base y almacena el resultado en el sueldo bruto: +1300042774 +1400593419 +1200274027 La programación en lenguaje máquina era demasiado lenta y tediosa para la mayoría de los progra­ madores. En vez de utilizar las cadenas de números que las computadoras podían entender de manera directa, los programadores empezaron a utilizar abreviaturas del inglés para representar las operaciones elementales. Estas abreviaturas formaron la base de los lenguajes ensambladores. Sedesarrollaronpro­ gramas traductoresconocidos como ensambladores para convertir los primeros programas en lenguaje ensamblador a lenguaje máquina, a la velocidad de la computadora. La siguiente sección de un progra­ ma en lenguaje ensamblador también suma el pago de lashoras extras alsueldo base y almacenael resul­ tado en elsueldo bruto: load sueldobase add su eld o extra sto re sueldobruto Aunque este código es más claro para los humanos, las computadoras no lo pueden entender sino hasta quese traduce en lenguaje máquina. Eluso delascomputadorasseincrementó rápidamentecon lallegadadélos lenguajesensambladores, pero los programadores aún requerían de muchas instrucciones para llevara cabo incluso hasta las tareas más simples. Para agilizar el proceso de programación se desarrollaron los lenguajes de alto nivel, en donde podían escribirse instrucciones individuales para realizar tareas importantes. Los programas tra­ ductores,denominados compiladores,convierten programasen lenguajede alto nivela lenguajemáqui­ na. Los lenguajesde alto nivelpermiten alosprogramadoresescribirinstruccionesqueson muysimilares al inglés común, y contienen la notación matemática común. Un programa de nómina escrito en un lenguaje de alto nivelpodría contener unainstruccióncomo lasiguiente: sueldoBruto = sueldoBase + su e ld o E xtra Desde el punto de vistadel programador, los lenguajes de alto nivel son mucho más recomendables que los lenguajes máquina o ensamblador. Javaes, por mucho, el lenguaje de alto nivel más utilizado. www.FreeLibros.me
    • 1.6 Introducción a la tecnología de los objetos 11 El proceso decompilación de un programa escrito en lenguaje dealto nivel aun lenguaje máquina puede tardar un tiempo considerable en la computadora. Los programas intérpretes se desarrollaron para ejecutar programas en lenguaje de alto nivel de manera directa (sin el retraso de la compilación), aunque con más lentitud dela que se ejecutan en los programas compilados. Hablaremos más sobre la forma en que trabajan los intérpretes en la sección 1.9, en donde aprenderá queJava utiliza una astuta mezclade compilación einterpretación, optimizada con base en el rendimiento, para ejecutar los pro­ gramas. Los ejercicios 7.35-7.37 (en la Sección especial: Cree su propia computadora) le guiarán a través del proceso de creación de un programa intérprete. 1.6 Introducción a la tecnología de los objetos Crear software en forma rápida, correcta y económica sigue siendo un objetivo difícil de alcanzar en una época en que la demanda de software nuevo y más poderoso va en aumento. Los objetos,o dicho en forma más precisa —como veremos en el capítulo 3— las clasesde las que provienen los objetos, son en esencia componentes de software reutilizables. Existen objetos de fecha, objetos de hora, ob­ jetos de audio, objetos de video, objetos de automóviles, objetos de personas, etcétera. Casi cualquier sustantivo se puede representar de manera razonable como un objeto de software en términos de sus atributos (como el nombre, color y tamaño) y comportamientos (por ejemplo, calcular, moverse y co­ municarse). Los desarrolladores de software han descubierto que al usar una metodología de diseño e implementación orientada a objetos y modular, pueden crea grupos de desarrollo de software más productivos de lo que era posible con las técnicas populares anteriores, como la “programación es­ tructurada”;por lo general los programasorientados aobjetos son más fáciles decomprender, corregir y modificar. Elautomóvil como un objeto Para ayudarle acomprender los objetos y su contenido, empecemos con una analogíasimple. Suponga que deseaconducirunautoy hacerquevayamásrápidoaloprimirelpedaldelacelerador.¿Quédebeocurrir paraque usted puedahaceresto? Bueno,antes deque puedaconducir un auto, alguien tieneque diseñarlo. Por lo general, un auto empiezaen forma de dibujos de ingeniería, similares a losplanos de construcción quedescribeneldiseñode unacasa.Estosdibujosdeingenieríaincluyeneldiseño delpedaldelacelerador. El pedal ocultalos complejos mecanismosque se encargan de que el auto aumente su velocidad, de igual forma que el pedal del freno oculta los mecanismos que disminuyen la velocidad del auto y el volante “oculta”los mecanismos que hacenque el auto de vuelta. Esto permite que las personascon poco o nada de conocimiento acerca de cómo funcionan los motores, los frenos y los mecanismos de la dirección puedan conducir un auto con facilidad. Por desgracia, asícomo no es posible cocinar en la cocina de un plano de construcción, tampoco es posible conducir los dibujos de ingeniería de un auto. Antes de poder conducir un auto, éste debe construirse a partir de los dibujos de ingeniería que lo describen. Un auto completo tendrá un pe­ dal acelerador verdadero para hacer que aumente su velocidad, pero aún así no es suficiente; el auto no acelerará por su propia cuenta (¡esperemos que así sea!), así que el conductor debe oprimiré.1pedal del acelerador para aumentar la velocidad del auto. Métodosy clases Ahora vamos a utilizar nuestro ejemplo del auto para introducir algunos conceptos clave de la pro­ gramación orientada a objetos. Para realizar una tarea en una aplicación se requiere un método, el cual aloja las instrucciones del programa que se encargan de realizar sus tareas. El método oculta al usuario estas tareas, de la misma forma que el pedal del acelerador de un auto oculta al conductor los mecanismos para hacer que el auto vaya más rápido. En Java, creamos una unidad de programa lla­ mada clase para alojar el conjunto de métodos que realizan las tareas de esa clase. Por ejemplo, una www.FreeLibros.me
    • 12 Capítulo I Introducción a las computadoras y a Java dase que representa a una cuenta bancaria podría contener un método para depositar dinero en una cuenta, otro para retirary un tercero para solicitare saldo actual. Una clase es similar en concepto a los dibujos de ingeniería de un auto, que contienen el diseño de un pedal acelerador, volante de di­ rección, etcétera. btstanciamiento Asícomo alguien tiene que construir un autoa partir de sus dibujos de ingeniería para que otra persona lo puedaconducirdespués, tambiénesnecesario crearun objetode unaclaseparaque un programa pueda realizar las tareas definidas por los métodos de esaclase. Al proceso de hacer esto se le denomina instan- ciamiento. Entonces, un objeto viene siendo unainstancia de su clase. Reutilización Asícomo losdibujos de ingenieríade un auto sepueden reutilizarmuchas veces paraconstruir muchos autos, también es posible reutilizaruna clase muchas veces para crear muchos objetos. Al reutilizar las dases existentes para crear nuevas clases y programas, ahorramos tiempo y esfuerzo. La reutilización también nos ayuda acrear sistemas más confiables y efectivos, debido a que con frecuencia las clases y bs componentes existentes pasan por un extenso proceso de prueba, depuración y optimización del desempeño.De lamismamaneraen quelanoción átpiezas intercambiablesíne crucial parala Revolución Industrial, las clases reutilizables son cruciales para la revolución de software incitada por la tecnología de objetos. Observación de ingeniería de software l.l Useun método de construcciónen bloquespara crearprogramas. Evitereinventarla rueda: usepiezas existentessiemprequeseaposible. Estareutilizacióndesoftwareesun beneficioclavedelaprogramación orientadaaobjetos. Mensajesy llamadasa métodos Cuando conduce un auto, al oprimir el pedal del acelerador envía un mensaje ai auto para que realice una tarea: aumentar la velocidad. De manera similar, es posible enviar mensajesa un objeto. Cada men­ sajese implementa como llamada a método, para indicar a un método del objeto que realice su tarea. Por ejemplo, un programa podría llamar al método depositar de un objeto cuenta de banco específico para aumentar el saldo de esacuenta. Atributosy variablesde instancia Además de tener capacidades para realizar tareas, un auto también tiene atributos:color, número de puertas, cantidad degasolinaen el tanque, velocidad actual y registro del total dekilómetros recorridos (esdecir, lalectura desu velocímetro). Al igual quesuscapacidades, losatributos del auto serepresentan como parte desudiseño en susdiagramasde ingeniería (que, porejemplo, agregan un velocímetro yun indicador de combustible). Al conducir un auto real, estosatributos van incluidos. Cada auto conserva suspropiosatributos. Por ejemplo, cada uno sabe cuánta gasolina hay en su tanque, pero no cuánta hay en los tanques de otrosautos. De manera similar, un objeto tiene atributos que lleva consigo a medida que se utiliza en un pro­ grama. Estos atributos se especifican como parte de la clase del objeto. Por ejemplo, un objeto cuenta bancaria tiene un atributo saldo que representa la cantidad de dinero en la cuenta. Cada objeto cuen­ ta bancaria conoce el saldo de la cuenta que representa, pero no los saldos de las otras cuentas en el banco. Losatributos se especifican mediante lasvariablesde instancia de laclase. www.FreeLibros.me
    • 1.7 Sistemas operativos 13 Encapsulamiento Las clases encapsulan (envuelven) los atributos y métodos en objetos; los atributos y métodos de un objeto están muy relacionados entre sí. Los objetos se pueden comunicar entre sí, pero por lo general no se les permite saber cómo están implementados otros objetos; los detalles de implementación están ocultosdentro de losmismos objetos. Este ocultamiento de información, como veremos más adelante, escrucial para la buena ingenieríade software. Herencia Es posible crear una nuevaclasede objetos con rapidez y de manera conveniente mediante la herencia: la nueva clase absorbe las características de una clase existente, con la posibilidad de personalizarlas y agregar características únicas propias. En nuestra analogía del auto, sin duda un objeto de la clase “convertible”es««objeto de la clase misgeneralllamada “automóvil” pero, de manera más especifica, el techo puedeponerse o quitarse. Análisisy diseño orientado a objetos (A/DOO) fronto escribirá programas enJava. ¿Cómo creará el código (es decir, lasinstrucciones) parasus progra­ mas?Tal vez, al igualque muchos programadores,sólo encenderásu computadoray empezará a escribir. Quizás este método funcione para pequeños programas (como los que presentamos en los primeros ca­ pítulos del libro), pero ¿qué talsi le pidieran crear un sistemade software para controlar milesde cajeros automáticos para un banco importante? O ¿si le piden que trabaje con un equipo de 1,000 desarrolla- dores de software para crear el nuevo sistema de control de tráfico aéreo en Estados Unidos? Para pro­ yectos tan grandesy complejos, no es conveniente tan sólo sentarse y empezara escribir programas. Paracrear las mejores soluciones, debe seguir un proceso de análisis detallado paradeterminar los requerimientos desu proyecto (definirquésesuponeque debe hacer elsistema) ydesarrollarun diseño que los satisfaga (decidir cómo debe hacerlo el sistema). Lo idealsería pasar por este proceso y revisar el diseño con cuidado (además de pedir aotros profesionales de software que lo revisen) antes de escribir cualquier código. Sieste proceso implica analizary diseñar susistema desde un punto devistaorientado aobjetos,se denominaproceso de análisisydiseño orientado a objetos (A/DOO). Los lenguajescomo Javason orientados a objetos. La programación en un lenguaje de este tipo, conocida como programa­ ción orientada a objetos (POO), lepermite implementar un diseño orientado aobjetoscomo un siste­ ma funcional. El UML (Lenguaje unificado de modelado) Aunque existen muchos procesos deA/DOO distintos, hay un solo lenguaje gráfico paracomunicar los resultados de cualquierproceso deA/DOO queseutiliza en lamayoría de loscasos. Este lenguaje,cono­ cido como Lenguajeunificado de modelado (UML),es en laactualidadelesquemagráfico más utilizado para modelar sistemas orientados a objetos. Presentamos nuestros primeros diagramas de UML en los capítulos 3 y 4; después los utilizamos en nuestro análisis más detallado de laprogramación orientada a objetosen el capítulo 11. En nuestro ejemplo práctico opcionalde ingeniería desoftwaredelATM en los capítulos 12y 13presentamosun subconjuntosimplede lascaracterísticasdel UML, mientrasloguiamos por una experienciade diseño orientada a objetos. 1.7 Sistemas operativos Los sistemas operativos son sistemas de software que se encargan de hacer más conveniente el uso de las computadoras para los usuarios, desarroliadores de aplicaciones y administradores de sistemas. Los sistemasoperativos proveen serviciosque permiten acadaaplicación ejecutarseen formasegura, eficien­ www.FreeLibros.me
    • 14 Capítulo I Introducción a las computadoras y a Java te y concurrente{es decir, en paralelo) con otras aplicaciones. Elsoftware que contiene los componentes básicos del sistema operativo se denomina kemel. Lossistemas operativos de escritorio populares son: Linux, Windows 7 y Mac OS X. Los sistemas operativos móviles populares que se utilizan en teléfo­ nos inteligentes y tabletas son: Android de Google, BlackBerry OS y Apple ¡OS (para sus dispositivos iPhone, iPade iPodTouch). Windows: un sistema operativopropietario A mediados de la década de 1980 Microsoft desarrolló el sistema operativoWindows, el cual consis­ teen una interfazgráficade usuario creadasobre DOS: un sistemaoperativo de computadora personal muy popular en la época en que, para interactuar con él, los usuarios tecleaban comandos. Windows tomó prestados muchos conceptos (como los iconos, menús y ventanas) que se hicieron populares gracias a los primeros sistemas operativos Apple Macintosh, desarrollados en un principio por Xerox PARC. Windows 7esel sistemaoperativo más recientede Microsoft; algunasdesuscaracterísticasson; mejoras en lainterfaz de usuario, un arranque másveloz, un mayorgrado de refinamiento en cuanto a las características de seguridad, soporte para pantalla táctil y multitáctil, y otras más. Windows es un sistema operativo propietario;está bajo el control exclusivo de una compañía. Windows es por mucho el sistema operativo más utilizado en el mundo. Linux: un sistema operativo de códigofuente abierto El sistema operativo Linux es tal vez el más grande éxito del movimiento de códigofuente abierto. El código fuente abierto es un estilo de desarrollo de software que se desvíadel desarrollopropietario, el cual predominó durante los primeros años del software. Con el desarrollo de código fuente abierto, individuos ycompañías unen susesfuerzos para desarrollar, manteneryevolucionar elsoftware acam­ bio del derecho de usarlo para sus propios fines, por lo general sin costo. Porlo general el código fuen­ te abierto es escudriñado por una audiencia mucho mayor que la del software propietario, de modo que casi siempre los errores se eliminan con más rapidez. El código fuente abierto también fomenta una mayor innovación. Sun abrió el código de su implementación del Kit de desarrollo de Java y de muchas de sus tecnologías deJava relacionadas. Algunas organizaciones en la comunidad de código fuente abierto son: la fundación Eclipse (el Entorno integrado de desarrollo Eclipse ayuda a los programadores de Java a desarrollar software de maneraconveniente), lafundación Mozilla (creadores del navegadorWeb Firefox), la fundación de softwareApache (creadores del servidor Web Apache que se utiliza para desarrollar aplicaciones basa­ das en Web) y SourceForge (quien proporciona las herramientas para administrar proyectos de có­ digo fuente abierto; tiene más de 260,000 de estos proyectos en desarrollo). Las rápidas mejoras en la computación y las comunicaciones, la reducción en costos y el software de código fuente abierto han logrado que sea mucho más fácil y económico crear un negocio basado en software en la actualidad de lo que era hace unas cuantas décadas. Facebook es un gran ejemplo de ello; estesitio se inició desde un dormitorio universitario y se creó con software de código fuente abierto.7 El kernel de Linuxesel núcleo del sistema operativo de código fuente abierto máspopulary lleno de funcionalidades, que se distribuye en forma gratuita. Es desarrollado por un equipo devoluntarios organizados de manera informal; es popular en servidores, computadoras personalesy sistemas incrusta­ dos.Adiferenciadelossistemasoperativospropietarios comoWindows deMicrosoftyMacOSXdeApple, el código fuente de Linux (el código del programa) está disponible al público para que lo examinen y modifiquen; además se puede descargar e instalar sin costo. Como resultado, los usuarios del sistema operativo se benefician; de una comunidad de desarro11adores que depuran y mejoran el kernel de 7 d evelop e r s . fa c e b o o k . com /opensource/. www.FreeLibros.me
    • 1.7 Sistemas operativos 15 manera continua, de la ausencia de cuotas y restricciones de licencias, y de la habilidad de poder per­ sonalizar por completo el sistema operativo para cumplir necesidades específicas. En 1991, Linus Torvalds, un estudiante de 21 años en la Universidad de Helsinki en Finlandia, empezó a desarrollar el kernel de Linux como un pasatiempo (El nombre Linux se deriva de “Linus”y “UNIX”:un sistemaoperativo desarrollado por los Laboratorios Bellen 1969). Torvaldsquería mejorar el diseño de Minix, un sistema operativo académico creado por el profesor Andrew Tanenbaum de la Vrije Universiteit en Amsterdam. El código fuente de Minix estaba disponible al público para que los profesores pudieran demostrar los conceptos básicos de la implementación de sistemas operativos a sus estudiantes. Torvalds liberó laprimeraversión deLinux en 1991. Larespuestafavorablecondujo a lacreación de unacomunidad que hacontinuado coneldesarrolloysoportede Linux. Losdesarroliadoresdescargaron, probaron y modificaronelcódigo de Linux; después enviaroncorrecciones deerroresy retroalimentación aTorvalds, quien revisó esa informacióny aplicó las mejoras alcódigo. La liberación de Linux en 1994 integró muchas característicasque se encontraban por lo general en un sistema operativo maduro, con lo cual Linux se convirtió en una alternativa viable con respecto a UNIX. Las compañías de sistemas empresariales como IBM y Oracle se interesaron cadavez más en Li­ nux, a medida que éste sevolvíamás estable yse extendía a nuevas plataformas. Sonvariascuestiones—elpoder demercado deMicrosoft,elpequeño número de aplicaciones Linux amigables paralos usuariosy ladiversidad dedistribuciones de Linux, talescomo Red Hat Linux, Ubun- tu Linux y muchas más— las que han impedido que se popularice el uso de Linux en las computadoras deescritorio. Sin embargo, este sistemaoperativo se ha vuelto muy popular en servidores y sistemas in­ crustados, como los teléfonos inteligentes basados en Android de Google. Android Android —elsistema operativo paradispositivos móviles y teléfonos inteligentes, cuyo crecimiento ha sido el más rápido hastaahora— está basado en el kernel de Linux y enJava. Los programadores experi­ mentados deJava no tienen problemas paraentrar y participar en el desarrollo de aplicaciones paraAn­ droid. Un beneficio de desarrollar este tipo de aplicaciones es el grado de apertura de la plataforma. El sistemaoperativo esgratuito y de código fuente abierto. Elsistemaoperativo Android fue desarrollado por Android, Inc., compañíaque adquirió Google en 2005. En 2007 se formó laAlianza para los dispositivos móviles abiertos™ (OHA) —un consorcio de 34 compañías en un principio, yde 79 parael año 2010—,paracontinuar con eldesarrollo deAndroid. Al mesde diciembre de 2010, ¡seactivaban más de 300,000 teléfonos inteligentescon Android adiario!8 Ahora los teléfonos Android se venden más que los ¡Phone.9El sistema operativo Android se utiliza en varios teléfonos inteligentes (Motorola Droid, HTC EVO™ 4G, SamsungVibrant™ y muchos más), dispositivos lectores electrónicos (como el Noble Nook™ de Barnes and Noble), computadoras tipo tableta (Dell Streak, Samsung GalaxyTabyotras más),quioscos con pantallas táctilesdentro de lastien­ das, autos, robots y reproductores multimedia. Los teléfonos inteligentesAndroid tienen la funcionalidad de un teléfono móvil, cliente de Internet (paranavegarenWebycomunicarseatravésde Internet), reproductor deMP3,consoladejuegos, cáma­ radigital ydemás, todo envuelto endispositivos portátilesconpantallas multitáctilesatodo color—éstas pantallas le permiten controlar el dispositivo con ademanesen los que se requieren uno o varios toques simultáneos. Puede descargar aplicaciones de manera directa asu dispositivo Android, a través del An­ droid Marketyde otros mercados de aplicaciones. Al mesde diciembre de 2010 había cercade 200,000 aplicaciones en elAndroid Marketde Google. 8 yhm .pcraag. co m /art ie l e 2 / 0 ,2 8 1 7 ,2 B7 4 0 7 6 ,0 0 . asp. 9 mas habí e . com/ 2010/08/0 2/and r o id - o u t s e ll i n g -i phone-2/. www.FreeLibros.me
    • 16 Capítulo I Introducción a las computadoras y a Java Capítulos de desarrollo de aplicacionesAndroiden elsitio Webcomplementario Debido alenormeinterésen losdispositivosyaplicaciones basadasenAndroid,hemos integrado enelsitio Web complementario del libro una introducción de tres capítulos al desarrollo de aplicaciones Android, bs cuales pertenecen a nuestro nuevo libro, AndroidforProgrammers:AnApp-DrivenApproach. Después de que aprenda Java, descubrirá que no es tan complicado empezar a desarrollar y ejecutar aplicaciones Android. Puede colocar sus aplicaciones en elAndroid Market en línea (www.m arket. android.com)y,si sevuelven populares, tal vez hasta pueda iniciar su propio negocio. Sólo recuerde: Facebook, Microsoft y Dellseiniciaron desde un dormitorio. 1.8 Lenguajes de programación Enestasecciónveremos unoscuantos comentarios brevessobrevarios lenguajesde programación popu­ lares (figura 1.5). En lasiguiente secciónveremos una introducción aJava. Lenguaje de programación Descripción Fortran COBOL Pascal Ada Basic Fortran (FORmula TRANslator, Traductorde fórmulas) fuedesarrollado por IBM Corporation a mediados deladécadade 1950 para utilizarseen aplicaciones científicas yde ingenieríaque requerían cálculosmatemáticoscomplejos. Aún se utiliza mucho y susversiones más recientesson orientadasa objetos. COBOL (COmmon BusinessOriented Language, Lenguajecomún orientado a nego­ cios) fue desarrolladoafinalesde ladécadade 1950 porfabricantesdecomputadoras, elgobierno estadounidense yusuariosdecomputadorasdela industria, con baseen un lenguaje desarrollado porGraceHopper, un oficial delaMarina de EstadosUnidos ycientífico informático. COBOL aún se utiliza mucho en aplicacionescomerciales que requieren deunamanipulación precisay eficientede grandes volúmenes dedatos. Su versión más recientesoporta la programación orientada a objetos. Lasactividadesde investigación en la décadade 1960dieron como resultado la programaciónestructurada:un método disciplinado paraescribirprogramas que sean más clarosyfácilesde probar, depurar, yde modificarque losprogramas extensos producidoscon técnicasanteriores. Uno de los resultadosmás tangiblesdeesta investigación fue el desarrollo del lenguaje deprogramación Pascal por el profesor NiklausWirth en 1971. Se diseñó para laenseñanza dela programación estructurada yfue popular en loscursos universitarios durantevariasdécadas. Ada, un lenguajebasado en Pascal, sedesarrolló bajo elpatrocinio del Departamento deDefensa (DOD) de losEstadosUnidosdurante la décadade 1970ya principios de la décadade 1980. ElDOD quería un solo lenguajeque pudierasatisfacerla mayoría de susnecesidades. Elnombre de este lenguajebasado en Pascalesen honordeLady AdaLovelace, hija del poetaLord Byron.A ellase leatribuye el haberescritoelprimer programa paracomputadoras en el mundo, a principiosdela década de 1800 (para la MáquinaAnalítica, un dispositivode cómputo mecánico diseñado por Charles Babbage). Su versión más recientesoporta la programación orientada a objetos. Basicsedesarrolló en ladécadade 1960en el Dartmouth College, para introducirá los principiantesa la programación. Muchasdesusversionesmás recientesson orientadas aobjetos. C fue implementado en 1972 porDennis Ritchie en losLaboratorios Bell. En un prin­ cipio se hizo muy popular como el lenguaje dedesarrollo del sistemaoperativo UNIX. En laactualidad, la mayoríadelcódigo para los sistemas operativos de propósito general seescribe en C o C++. Fig. 1.5 | Otros lenguajes de programación (parte I de 2). www.FreeLibros.me
    • 1.8 Lenguajes de programación 17 Lenguaje de programación C++ Objective-C Visual Basic Visual C# PHP Ppthon JavaScript Rubyon Rails Scala Descripción C++, una extensión de C, fue desarrollado porBjameStroustrupa principios dela década de 1980 en losLaboratorios Bell. C++ proporciona varias característicasque “pulen”al lenguaje C, pero lo más importante es que proporciona lacapacidades de una programación orientada a objetos. Objective-C es un lenguajeorientado a objetosbasado en C. Se desarrolló a principios deladécadade 1980ydespuésfueadquirido porlaempresa Next, que a su vezfue comprada porApple. Sehaconvertido en el lenguajede programación clavepara el sistemaoperativo Mac OS X ytodos los dispositivosoperados porel iOS (como los dispositivosiPod, iPhonee iPad). El lenguajeVisualBasicde Microsoftseintrodujo a principios déla décadade 1990 para simplificarel desarrollo deaplicacionespara MicrosoftWindows. Susversiones más recientessoportan la programación orientada a objetos. Lostresprincipales lenguajes de programación de Microsoftson Visual Basic,Visual C++ (basadoen C++) yC# (basado en C++yJava; desarrollado para integrarInternet yWeben lasaplicacionesde computadora). PHP esun lenguajeorientado a objetosde “secuenciasde comandos”y“código fuente abierto” (veala sección 1.7), elcual recibe soportepormedio deuna comunidad de usuariosydesarroliadores; seutilizaen numerosos sitiosWeb, entre ellos Wikipedia yFacebook. PHP es independiente dela plataforma: existen implementaciones para todos los principalessistemasoperativos UNIX, Linux, Mac yWindows. PHP también soporta muchas basesde datos, como MySQL. Python, otro lenguaje orientado a objetos de secuencias decomandos, seliberó al público en 1991. Fuedesarrollado porGuido van Rossum del Instituto Nacionalde Investigación para lasMatemáticas yCienciasComputacionalesen Amsterdam (CWI); lamayorpartede Python se basaen Modula-3: un lenguajede programación de sistemas. Python es“extensible”:puede extenderse a través de clases einterfaces de programación. JavaScriptesel lenguajede secuencias decomandos másutilizado en el mundo. Su principal uso esparaagregarcapacidadde programación a laspáginasWeb; porejemplo, animacioneseinteractividad con el usuario. Losprincipalesnavegadores Web cuentan con él. Rubyfuecreado a mediadosde ladécada de 1990 por Yukihiro Matsumoto; es un lenguaje de programación orientado a objetos de código fuenteabierto, con una sintaxis simple que es similara Python. Rubyon Railscombina el lenguaje de secuen­ ciasdecomandos Rubycon el marco de trabajo deaplicaciones Web Rails, desarrollado por37Signals. Su libro, GettingReal{g e t t i n g re a l .3 7 s ig n a ls .c o m / to c .p h p ), esuna lectura obligatoria para los desarrolladoresWeb. Muchos desarrolladores de Rubyon Railshan reportado gananciasde productividadsuperioresa las de otros lenguajes, al utilizaraplicacionesWeb que trabajan demanera intensivacon basesdedatos. Rubyon Railsse utilizó para crearla interfazde usuario deTwitter. Scala (www. s c a la -la n g .o rg /n o d e /2 7 3 ), abreviación en inglésde“lenguajeescalable”, fuediseñado porMartin Odersky, un profesoren la École Polytechnique Fédérale deLausanne (EPFL)en Suiza. Selanzó al público en 2003; utiliza losparadigmas de orientación a objetos yde programación funcional, yestádiseñado para integrarse oonJava. Si programa en Scala, podrá reducirdemanera considerablelacantidad de código en susaplicaciones. TwitteryFoursquareusan Scala. Fig. 1.5 | Otros lenguajes de programación (parte 2 de 2). www.FreeLibros.me
    • 18 Capítulo I Introducción a las computadoras y a Java 1.9 Java y un típico entorno de desarrollo en Java Lacontribución más importante a la fecha de la revolución del microprocesador es que hizo posible el desarrollo de las computadoras personales. Los microprocesadores están teniendo un profundo im­ pacto en los dispositivos electrónicos inteligentes para uso doméstico. Al reconocer esto, Sun Micro­ systems patrocinó en 1991 un proyecto interno de investigación corporativa dirigido por James Gosling, que resultó en un lenguaje de programación orientado a objetos y basado en C++, al que Sun llamó Java. Unobjetivo clave deJavaespoder escribir programas que se ejecuten en una gran variedad de siste­ mas computacionales y dispositivos controlados por computadora. A esto se le conoce algunas veces como “escribir una vez,ejecutar en cualquier parte”. La popularidad del servicio Webseintensificó en 1993; en eseentonces Sun vio el potencial de usar Java para agregar contenido dinámico, como interactividad y animaciones, a las páginas Web. Java ge­ neró la atención de la comunidad de negocios debido al fenomenal interés en Web. En la actualidad, Java seutiliza para desarrollaraplicacionesempresarialesa gran escala, para mejorarlafuncionalidad de los servidores Web (las computadoras que proporcionan el contenido que vemos en nuestros explora­ dores Web), para proporcionar aplicaciones para los dispositivos de uso doméstico (como teléfonos celulares,teléfonos inteligentes, receptoresde televisión por Internetymucho más) ypara muchos otros propósitos. En 2009, Oracle adquirió Sun Microsystems. En la conferencia JavaOne 2010, Oracle anunció queel 97% de todas lascomputadoras deescritorio, tres mil millones dedispositivosportátiles y 80 millones de dispositivos de televisión ejecutan Java. En la actualidad hay cerca de 9 millones de desarrolladores deJava, en comparación con los4.5 millones en 2005.10AhoraJava es el lenguaje de desarrollo de software más utilizado en todo el mundo. Bibliotecasde clasesdeJava Usted puede crear cada clase y método que necesite para formar sus programas de Java. Sin embargo, la mayoría de los programadores en Java aprovechan las ricas colecciones de clases existentes en las bi­ bliotecas de clases de Java, que también se conocen como API (Interfaces de programación de aplicaciones) deJava. Tip de rendimiento l.l S utilizalasclasesy métodosdelasAPIdeJavaenvezdeescribirsuspropiasversionespue­ demejorarelrendimientodesusprogramas,yaqueestasclasesy métodosestánescritosde manera cuidadosaparafuncionar con eficacia. Esta técnica también reduce eltiempo dedesarrollodelosprogramas. Tip de portabilidad l.l Aunque esmásfácilescribirprogramasportables (programa que sepuedan ejecutar en muchostiposdistintosde computadoras)enJavaque enla mayoríade losotroslenguajes deprogramación,lasdiferenciasentreloscompiladores,lasJVMylascomputadoraspueden ocasionarqueseadifícillograrlaportabilidad. Elsimplehechodeescribirprogramasen Javanogarantizalaportabilidad. Ahora explicaremos los pasos típicos utilizados para crear y ejecutar una aplicación en Java, me­ diante el uso de un entorno de desarrollo (el cual se ilustra en las figuras 1.6-1.10). Por lo general, los programas en Java pasan a través de cinco foses: edición, compilación, carga, verificación y ejecución. Hablaremossobreestosconceptosen elcontexto del Kit dedesarrollo deJavaSE (JDK). Puededescargar el JDK más actualizado y su documentación en www.oracle.com/technetwork/java/javase/ 10 ja xe n te r.co m /h o w -m an y-ja v a - d e v e lo p e rs - a re - th e re - 1 0 4 6 2 .h tm l. www.FreeLibros.me
    • 1.9 Java y un típico entorno de desarrollo en Java 19 down1oad s / i ndex. htm l. Lea lasecciónAntesde empezareste libropara asegurarsedeconfigurarsu compu­ tadora enforma apropiadapara compilary ejecutarprogramas enJava. Tal vez también desee visitar el centro paraprincipiantes deJava (New to Java Center) de Oracle en: w w w .oracle.com /technetw ork/topics/new tojava/overvi ew/i ndex.htm l [Nota: este sitio Web proporciona las instrucciones de instalación paraWindows, Linux y Mac OS X. Si no utiliza uno de estos sistemas operativos, consulte la documentación del entorno deJava de su sis­ tema o pregunte a su instructor cómo puede realizar estas tareas con base en el sistema operativo de su computadora. Si encuentra un problema con éste o cualquier otro vínculo mencionado en este libro, visite el sitio www.dei te l .com/books/j htp9/ para consultar la fede erratasy notifíquenos su problema alcorreo electrónico dei t e l © d e ite l.com]. Fase 1: Creación de unprograma La fase 1consiste en editar un archivo con unprograma de edición,conocido comúnmente como editor (figura 1.6). Ustedescribeun programaenJava(conocido por lo generalcomo código fuente)por medio del editor, realiza las correcciones necesarias y guarda el programa en un dispositivo de almacenamiento secundario, como sudisco duro. Un nombre de archivo que termina con la extensión .java indica que éstecontiene código fuente enJava. El programa se crea en un editor y se almacena en disco, en un archivo cuyo nombre termina con .ja v a . Fig. 1.6 | Entorno de desarrollotípico deJava: fase de edición. Dos de los editores muy utilizadosensistemas Linuxson vi y emacs. EnWindows, basta con usar el Bloc de Notas. También hay muchos editores de freeware y Shareware disponibles en Enea, como Edit- Plus (www.editplus.com),TextPad (www.textpad.com)y jEdit (www.jedit.org). Para las organizaciones que desarrollan sistemas de información extensos, hay entornos de desa­ rrollo integrados (IDE) disponibles de la mayoría de los proveedores desoftware. Los IDE proporcio­ nan herramientasque dansoporte alproceso dedesarrollo delsoftware, incluyendo editores paraescribir yeditar programas, y depuradores para localizar errores lógicos: errores que provocan que los progra­ mas se ejecuten en forma incorrecta. Los IDE populares son Eclipse (www.eclipse.org) y NetBeans (www.netbeans.org). Fase2: Compilación de unprograma enJavapara convertirlo en códigosde bytes En lafase2, elprogramador utilizaelcomando javac (elcompilador deJava) para compilarun progra­ ma (figura 1.7). Por ejemplo, paracompilar un programa llamado B ien ven id o, ja v a , escriba ja v a c B ie n ve n id o .ja va en laventana de comandos de su sistema (es decir, el Símbolo del sistema en Windows, el indicadorde shellen Linuxo la aplicaciónTerminal en Mac OS X). Siel programa secompila, elcompilador produce un archivo .class llamado Bi envenido .class que contiene laversión compilada del programa. Fase I: Edición Editor www.FreeLibros.me
    • 20 Capítulo I Introducción a las computadoras y a Java Fase 2: Compilación Compilador Disco El compilador crea códigos de bytes y los almacena en disco, en un archivo cuyo nombre termina con .c la s s . Fig. 1.7 | Entorno de desarrollo típico deJava: fase de compilación. Elcompilador deJavatraduceelcódigo fuente deJavaen códigosde bytesque representan las tareas aejecutar en la fosede ejecución (fose 5). La máquina virtual de Java (JVM), que forma parte delJDK yesla basede la plataformaJava,ejecutaloscódigos debytes. Una máquina virtual (VM) es una aplica­ cióndesoftwarequesimula aunacomputadora, pero ocultaelsistemaoperativo yel hardwaresubyacen­ tes de los programas que interactúan con ésta. Si se implementa la mismaVM en muchas plataformas oomputacionales, las aplicaciones que ejecute se podrán utilizar en todas esas plataformas. La JVM es una de las máquinas virtuales más utilizadas en la actualidad. La plataforma NET de Microsoftutiliza una arquitectura de máquina virtualsimilar. A diferencia del lenguaje máquina, que depende del hardware de una computadora específica, los códigos de bytes son instrucciones independientes de la plataforma; no dependen de una plataforma de hardware en especial. Entonces, los códigos de bytes de Java son portables: es decir, se pueden ejecutar los mismos códigos de bytes en cualquier plataforma que contenga unaJVM que comprenda la versión deJavaen la que se compilaron loscódigos de bytes sin necesidad de volver a compilar elcódigo fuente. LaJVM seinvoca mediante elcomando java. Porejemplo, paraejecutar unaaplicaciónenJavallamada Bi enveni do, debe escribir el comando ja v a Bienvenido en unaventanade comandos para invocarlaJVM,queasuvezinicialospasos necesarios paraejecutar la aplicación. Esto comienza la fose 3. Fase3: Cargar unprograma en memoria En la fose 3, laJVM coloca el programa en memoria para ejecutarlo; a esto se le conoce como cargar (figura 1.8). El cargador de clases toma los archivos .class que contienen los códigos de bytes del programa y los transfiere a la memoria principal. El cargador de clases también carga cualquiera de los archivos .class que su programa utilice, y que sean proporcionados por Java: Puede cargar los archi­ vos .el ass desde un disco en su sistema o a través de una red (como la de su universidad local o la red de laempresa, o incluso desde Internet). Fase 3: Carga Memoria prindpal El cargador de clases lee los archivos . el a ss que contienen códigos de bytes del disco y coloca esos códigos de bytes en la memoria. Fig. 1.8 | Entorno de desarrollotípico deJava: fase de carga. www.FreeLibros.me
    • 1.9 Java y un típico entorno de desarrollo en Java 2 1 Fase4: Verificación delcódigo de bytes En la fase4, a medida que se cargan las clases, el verificador de códigos de bytes examinasus códigos debytes para asegurar quesean válidosy que no violen lasrestricciones de seguridad deJava(figura 1.9). Java implementa una estrecha seguridad para asegurar que los programas en Java que llegan a través de la red no dañen sus archivos o su sistema (como podrían hacerlo los virus de computadora y los gusanos). Fase 4: Verificación ferificador de código de bytes Memoria principal El verificador de código de bytes confirma que todos los códigos de bytes sean válidos y no violen las restricciones (fe seguridad de Java. Fig. 1.9 | Entorno de desarrollotípico deJava: fase de verificación. Fase5: Ejecución En la fase 5, laJVM ejecuta loscódigos de bytes del programa, realizando así las acciones especificadas porelmismo (figura 1.10). En lasprimerasversiones deJava, laJVM eratansólo un intérpretedecódigos de bytes deJava. Esto hacía que la mayoría de los programas se ejecutaran con lentitud, ya que laJVM tenía que interpretar y ejecutar un código de byte a lavez. Algunas arquitecturas de computadoras mo­ dernas pueden ejecutarvarias instruccionesen paralelo. Por lo general, lasJVM actualesejecutancódigos de bytes mediante una combinación de la interpretación y ladenominada compilación justo a tiempo (JIT). En este proceso, la JVM analiza los códigos de bytes a medida que se interpretan, en busca de puntosactivos:partesde loscódigos debytes que seejecutan con frecuencia. Paraestas partes, un compi­ ladorjusto a tiempo (JIT) (conocido como compilador HotSpot deJava) traduce loscódigos debytes al lenguajemáquina correspondiente alacomputadora. Cuando laJVM encuentraestas partescompila- Fase 5: Ejecución Máquina virtual de Java (JVM) Memoria principal Rara ejecutar el programa, la JVM lee los códigos de bytes y los compila •justo a tiempo' (JIT): es decir, tos traduce en un lenguaje que la computadora pueda entender. A medida que se ejecuta el programa, existe la posibilidad de que almacene tos valores de los datos en la memoria principal. Fig. 1.10 | Entorno de desarrollotípico de Java: fase de ejecución. www.FreeLibros.me
    • 22 Capítulo I Introducción a las computadoras y a Java das de nuevo, se ejecuta el código en lenguaje máquina, que es más rápido. Por ende, los programas en Java en realidad pasan pordosfasesdecompilación: unaen lacual elcódigo fuentese traduceacódigo de bytes (paratener portabilidad a través de lasJVM endistintas plataformas computacionales) y otra en la que, durante la ejecución, los códigos de bytes se traducen en lenguaje máquina para la computadora actual en laquese ejecuta el programa. Problemasquepueden ocurriren tiempo deejecución Esprobable que los programas no funcionen laprimeravez. Cadauna de las fasesanteriores puedefallar, debido adiversoserroresquedescribiremos enestetexto. Porejemplo, un programaen ejecución podría intentar una división entre cero (una operación ilegal para la aritmética con números enteros en Java). Esto haríaque el programa deJavaimprimiera un mensajede error. Siesto ocurre, tendría que regresara la fasede edición, hacer las correcciones necesarias y proseguir con las fases restantes de nuevo, para de­ terminar que las correcciones hayan resuelto el(los) problema(s) [Nota: lamayoría de los programas en Java reciben o producen datos. Cuando decimos que un programa muestra un mensaje, por lo general queremos decirqueapareceen la pantalla desucomputadora. Los mensajesyotros datos pueden enviar­ se a otros dispositivos, como los discos y las impresoras, o incluso a una red para transmitirlos a otras oomputadoras]. —yw . Error común de programación l.l jr Loserrores, cornoladivisiónentrecero, ocurrena medidaqueseejecutaunprograma, de maneraque a estos errores seles llama errores en tiempo de ejecución. Los errores fatales en tiempo de ejecución hacenque losprogramas terminen de inmediato, sin haberrealizadobiensutrabajo.Loserroresnofatalesentiempo deejecuciónpermiten a losprogramasejecutarsehastaterminarsutrabajo, loqueamenudoproduceresultados incorrectos. 1.10 Prueba de una aplicación en Java En esta sección, ejecutarásu primera aplicación en Javae interactuará con ella. Para empezar, ejecutará una aplicación de ATM, la cual simula las transacciones que se llevan acabo al utilizar una máquina de cajero automático, o ATM (por ejemplo, retirar dinero, realizar depósitos y verificar los saldos de las cuentas). Aprenderá acrear esta aplicación en elejemplo práctico opcionaloñe,nx.2Áo aobjetos que se in­ cluyeen loscapítulos 12y 13. Paralos finesdeestasecciónvamosasuponerqueestáutilizando Microsoft Windows.11 En los siguientes pasos, ejecutará la aplicación y realizarávarias transacciones. Los elementos y la funcionalidad que podemos ver en esta aplicación son típicos de lo que aprenderá a programar en este libro [Nota: utilizamos fuentes paradiferenciar las características que seven en una pantalla (por ejem­ plo, el Símbolo del sistema) y los elementos que no se relacionan de manera directa con una pantalla. Nuestraconvención esenfatizar lascaracterísticasde lapantallacomo los títulos y menús (porejemplo, el menú Archivo) en una fuente Helvética sans-serif en semi-negritas, y enfatizar los elementos que no son de la pantalla, como los nombres de archivo o los datos de entrada (como NombrePrograma, j ava) en una fuente Luci da sans-serif. Como tal vezyase hayadado cuenta, laocurrencia de definición de cada término en el texto se establece en negritas. En las figuras en esta sección, resaltamosen una pan­ tallagris claro la entrada del usuario requerida por cada paso y señalamos las partes importantes de la 11 En vwvw.deite 1.com/books/j htp9/, ofrecemosunaversiónenLinuxdeestaprueba.Tambiénofrecemosvínculosavideos queleayudaránaempezaratrabajarconvariosentornosdedesarrollointegradospopulares (IDE), comoel Kitdedesarrollo deJavaSE6 paraWindows, elSKD deEclipseparaWindows,NetBeans, jGRASP,Drjava, BlueJyeleditordetextoTestPad paraWindows. www.FreeLibros.me
    • 1.10 Prueba de una aplicación en Java 23 aplicación. Para aumentar la visibilidad de estas características, modificamos el color de fondo de las ventanas del Símbolo del sistem a a blanco y el color de las letras a negro]. Ésta es una versión simple que consiste de texto solamente. Más adelante en el libro, aprenderá las técnicas para rediseñar este ejemplo mediante el uso de lastécnicas de GUI (interfaz gráficade usuario). 1. Revise su configuración. Lea la sección Antes de empezar este libro para confirmar que haya instalado Java de manera apropiada en su computadora, y copiado los ejemplos del libro en su disco duro. 2. Localicela aplicación completa. Abraunaventana Símbolo del sistema. Paraello,puedeselec­ cionar Inicio |Todos los programas |Accesorios | Símbolo del sistema. Paracambiar aldirectorio de la aplicación del ATM, escriba cd C:ejem ploscap01ATM y después oprima Intro (figura 1.11). Elcomando cdseutiliza paracambiarde directorio. Uso del comando cd para cambiar de directorio Ubicación del archivo de la aplicación del cajero automático (ATM) SSAdr limstrator. Command Prompt ^ i a j x j C:>cd C:exam plesch01ATM ------------------------------------------ C: exam plesch01ATM> = i Á Fig. l.l I | Abrir una ventana Símbolo del sistema en Windows XP y cambiar de directorio. Ejecute la aplicación delATM. Escriba el comando ja v a Ejem ploPracticoATM y oprima Intro (figura 1.12). Recuerde que elcomando j ava, seguido del nombre del archivo .el ass de la aplicación (en este caso, Ejem ploPracticoATM ), ejecuta la aplicación. Si especificamos la extensión .el ass al usarelcomando ja v a se produce un error [Nota: loscomandos enJavason sensibles a mayúsculas/minúsculas. Es importante escribir el nombre de esta aplicación con las letras A,T y M mayúsculas en “ATM”,una letra E mayúsculaen “Ejemplo” y una letra P ma­ yúsculaen“Practico”.De locontrario,laaplicaciónno seejecutará.] Sirecibeelmensajedeerror “ Exceptio n in thread “main” java.lan g .N o C lassD e fFo u n d Erro r: Ejem ploPracticoATM ”, entonces su sistema tiene un problema con CLASSPATH. Consulte lasección Antes de empezar este libro paraobtener instrucciones acercadecómo corregireste problema. IAdministrator Command Prompt J n J x J C :>cd C:examplesch01ATM C : exampl esch01ATM>java ATT^CaseStudy Fig. 1.12 | Uso del comando java para ejecutar la aplicación del ATM. 4 . Escriba un número de cuenta. Cuando la aplicación se ejecuta por primera vez, muestra el mensaje “jB ie n ve n id o !" y le pide un número de cuenta. Escriba 12345 en el indicador “ E s c rib a su numero de cu e n ta :” (figura 1.13) y oprima Intro. www.FreeLibros.me
    • 24 Capítulo I Introducción a las computadoras y a Java Mensaje de bienvenida del ATM Indicador para introducir el número de cuenta G¡a Adminístrate» Command Prompt-java ATMCaseStudy -sJO J-Xf C:exam ples Welcome!---- P le ase enter ch01ATM>java ATMCaseStudy your account number: 12345 --------- d _________________________________________________ d F ig . 1.13 | La aplicación pide al usuario un número de cuenta. 5. Escriba un NIP. Una vez que introduzca un número de cuenta válido, la aplicación mostrará el indicador “Escriba su NIP:”. Escriba “54321” como su NIP (Número de Identificación Personal) válido y oprima Intro. A continuación aparecerá el menú principal del ATM, que contiene una lista de opciones (figura 1.14). En el capítulo 14 le mostraremos cómo puede introducir un NIP en forma privada mediante el uso de un objeto JPasswordField. Introduzca un NIP válido Menú principal ATM 09 Admmistrator Comma d Prompt-java ATMCaseStudy - iD lX i Welcome! P le ase enter your En ter your PIN : 54 iccount number: 12345 321 ....4 __ ti 1 - view my balance 2 - Withdraw cash 3 - Deposit funds 4 - E x it En ter a ch o ice : _______________________________________________ d Fig. 1.14 | El usuario escribe un número NIP válido y aparece el menú principal de la aplicación del ATM. 6. Revise elsaldo de la cuenta. Seleccione la opción 1, “Ver mi saldo”del menú del ATM (fi­ gura 1.15).Acontinuaciónlaaplicaciónmostrarádosnúmeros: Saldo disponibl e($1,000.00) y Saldo total (SI,200.00). Elsaldo disponibleesla máximacantidad dedinero en sucuenta, disponible pararetirarla en un momento dado. En algunos casos, ciertos fondos como los de­ pósitos recientes, no están disponibles de inmediato para que el usuario pueda retirarlos, por lo que el saldo disponible puede ser menor que el saldo total, como en este caso. Después de mostrar la información de los saldos de la cuenta, se vuelve a mostrar el menú principal de la aplicación. 7. Retire dinero de la cuenta. Seleccione laopción 2, “Reti rar efectivo", del menú de laapli­ cación. Acontinuación aparecerá (figura 1.16) unalistademontos endólares (porejemplo: 20, 40,60,100 y 200).También tendrá laoportunidad de cancelar latransacción y regresaral menú principal. Retire $100 seleccionando laopción 4. La aplicación mostrará el mensaje “Tome su efectivo ahora”y regresaráalmenú principal. [Nota: pordesgracia,estaaplicaciónsólo simula elcomportamiento de un verdadero ATM,por lo cual no dispensa efectivo en realidad]. www.FreeLibros.me
    • 1.10 Prueba de una aplicación en Java 25 Información del saldo de la cuenta E J Administrator Command Prompt - iava ATMCaseStudy _ |D |X | En ter a ch o ice : 1 Balance In fo rm a tio n :-------- - A v a ila b le b alan ce: $1,0 - T o tal b alan ce: $1,2 Main menú: 1 - View my balance 2 - Withdraw cash 3 - Deposit funds 4 - E x it E n ter a ch o ice : £ j 00.00 00.00 A F ig . 1.15 | La aplicación del ATM muestra la información del saldo de la cuenta del usuario. Menú de retiro del ATM Fig. 1.16 | Se retira el dinero de la cuenta y la aplicación regresa al menú principal. 8. Confirme que la información de la cuenta se haya actualizado. En el menú principal, se­ leccione la opción 1de nuevo paraver el saldo actual de su cuenta (figura 1.17). Observe que tanto el saldo disponible como el saldo total se han actualizado para reflejar su transacción de retiro. 9. Finalice la transacción. Para finalizar su sesión actual en el ATM, seleccione la opción 4, “Sali r” del menú principal (figura 1.18.) El ATM saldrá del sistema y mostrará un mensaje de despedida al usuario. A continuación, la aplicación regresará a su indicador original, pi­ diendo elnúmero de cuenta delsiguiente usuario. 10. Salga de la aplicación delATMy cierre la ventana Símbolo del sistema. La mayoría de las aplicacionescuentan con unaopción para saliry regresar aldirectorio del Símbolo delsistema desde el cual se ejecutó la aplicación. Un ATM real no proporciona al usuario la opción de apagar la máquinaATM. En vez de ello, cuando el usuario ha completado todas las transac­ ciones deseadasy elige la opción del menú para salir, elATM se reinicia y muestra un indica­ dor para el número de cuenta del siguiente usuario. Como se muestra en la figura 1.18, la www.FreeLibros.me
    • 26 Capítulo I Introducción a las computadoras y a Java Administrator Command Prompt -java ATMCaseStudy Enter a ch o ice : 1 Balance Info rm atio n : - A v a ila b le b alance: T o tal balance: Main menú: 1 - View my balance 2 - Withdraw cash 3 - Deposit funds 4 - E x it E n ter a ch o ice : $900.00 $1,100.00 Confirmación de la información actualizada del saldo de la cuenta después de la transacción de retiro. á Fig. 1.17 | Verificación del nuevo saldo. GSJ Administrator Command Prompt -java ATMCaseStudy —I□Ixl Enter a ch o ice : 4 ■ xiting the s y s te m ... tank youl Goodbye! Mens<qe de despedida del ATM íelcome! 'le a se enter your account number:- Indicador para pedir el número de cuenta del siguiente usuario Fig. 1.18 | Finalización de una sesión de transacciones con el ATM. aplicación del ATM se comporta de manera similar. Al elegir la opción del menú para salir sólo se termina la sesión del usuario actual con el ATM, no toda la aplicación completa. Para salir realmente de la aplicación del ATM, haga clic en el botón de cerrar (x) en la esquina su­ perior derecha de la ventana Símbolo del sistema. Al cerrar la ventana, la aplicación termina su ejecución. l.l I Web 2.0: Las redes sociales Literalmente, laWeb cobró fuerza a mediados de la década de 1990, pero surgieron tiempos difíciles a principios del año 2000, debido aldesplome económico de “punto com”.Al resurgimiento que empezó alrededorde 2004,se leconocecomo AXfeb2.0. A Google seleconsidera en muchas partescomo lacom­ pañíacaracterísticadeWeb 2.0. Algunas otrascompañías con “característicasdeWeb 2.0”son:YouTube (sitio para compartir videos), FaceBook (red social), Twitter (microblogs), Groupon (comercio social), Foursquare(reporteso “check-ins”móviles), Salesforce(softwarede negociosqueseofrececomo servicios en línea), Craigslist (listados gratuitos de anuncios clasificados), Flickr (sido paracompartir fotos), Se­ cond Life (un mundo virtual), Skype (telefonía por Internet) y Wikipedia (una enciclopedia en línea gratuita). Google En 1996, los candidatos a un doctorado en ciencias computacionales de Stanford, Larry Page y Sergey Brin, empezaron acolaboraren un nuevo motor de búsqueda. En 1997 lecambiaron el nombre aGoo­ glecon base en el término matemático gúgol(en inglés, googol), una cantidad representada por el nú­ mero “uno” seguido de 100 “ceros” (o 101°°): un número de un tamaño asombroso. La habilidad de Google paradevolverresultados de búsquedascon extremaprecisión le ayudó aconvertirsecon rapidez en el motorde búsqueda más utilizado, ademásdeseruno de lossitiosWeb más popularesenel mundo. www.FreeLibros.me
    • l.l I Web 2.0: Las redes sociales 27 Google continúa siendo un innovador en las tecnologías de búsqueda. Porejemplo, Google Goggles es una fascinante aplicación móvil (disponible en Android e ¡Phone) que permite al usuario realizar una búsqueda, con la novedad de que utiliza una fotografía en vez de texto. Usted sólo tiene que tomar fo­ tografías de puntos de referencia, libros (cubiertas o códigos de barras), logotipos, arte o etiquetas de botellas de vino, y Google Goggles escanea la fotografía para devolver los resultados de la búsqueda. También puede tomar una fotografía de texto (por ejemplo, el menú de un restaurante o un anuncio) yGoogle Goggles lo traducirá por usted. Servicios Weby mashups En este libro incluimos un tratamiento detallado sobre los servicios Web (capítulo 31) y presentamos la nueva metodología de desarrollo de aplicaciones conocida como mashups, en la que puede desarrollar oon rapidez aplicaciones poderosas e intrigantes, al combinar servicios Web complementarios (a menu­ do gratuitos) y otras formas de fuentes de información (figura 1.19). Uno de los primeros masbups fue www.housingmaps.com, que combina al instante los listados de bienes raíces proporcionados por www. c ra i gs 1i s t . o rg con las capacidades de generación de mapas de GoogleMaps para ofrecer mapas que muestren las ubicaciones de los apartamentos en renta dentro de cierta área. Fuente de servicios Web Cómo se utiizan GoogleMaps Servidosdemapas Facebook Redessodales Foursquare Reportes (check-ins)móviles Linkedln Redessodalesparanegodos YouTube Búsquedasdevideo Twitter Microblogs Groupon Comerciosocial Netflix Renta depelículas eBay Subastasen Internet Wikipedia Encidopediacolaborativa PayPal Rigos Last.fm Radiopor Internet AmazoneCommerce Comprade librosyotrosartículos Salesforce.com Administracióndelasreladonesconeldiente (CRM) Skypc Telefoníapor Internet MicrosoftBing Búsqueda Flickr Compartirfotografías Zillow Predosde bienes raíces YahooSearch Búsqueda WeatherBug Clima Fig. 1.19 | Algunos servicios Web populares (www.programmableweb.com/apis/ d i rectory/l?sort= m ashups). Ajax Ajax es una de las tecnologías de software más importantes de Web 2.0, ya que ayuda a las aplicaciones basadas en Internet a funcionar como las aplicaciones de escritorio; una tarea difícil, dado que dichas www.FreeLibros.me
    • 28 Capítulo I Introducción a las computadoras y a Java aplicacionessufrende retrasosen latransmisión,a medida que losdatosseintercambianentresucompu­ tadora y las computadoras servidores en Internet. Mediante el uso de Ajax, las aplicaciones como Google Maps ban logrado un desempeño excelente, además de que su aparienciavisual se asemeja a las aplicaciones de escritorio. Aunque no hablaremos sobre la programación “pura”con Ajax en este libro (que es bastante compleja), en el capítulo 30 le mostraremos cómo crear aplicaciones habilitadas para Ajax mediante el uso de los componentes deJavaServer Faces (JSF) habilitados paraAjax. Aplicacionessociales Durante los últimos añosse haproducido un aumento considerableen el número de aplicacionessocia­ les en Web. Aún y cuando la industria de la computación ya alcanzó la madurez, estos sitios fueron capaces de tener un éxito fenomenal en un periodo de tiempo relativamente corto. La figura 1.20 ana­ lizaunas cuantas delas aplicacionessociales que están generando un impacto. Compañía Descripción Facebook Facebook inició desde un dormitorio en Harvarden elaño 2004, graciasa losalumnos Mark Zuckerberg, Chris Hughes, Dustin Moskovitzy Eduardo Saverin,yahora tiene un valorestimado de 70 mil millones de dólares. Paraenero de 2011, Facebookera elsitio másactivoen Internetcon más de 600 millonesde usuarios—casi9% de la población mundial—,quienes invierten 700 mil millonesde minutosen Facebookal mes. Según su tasa de crecimiento actual (cercadel 5% mensual),en 2012 Facebook llegará a mil millones de usuarios ¡de los dosmil millones de Internet! La actividad en este sitio lo hace muyatractivo para losdesarrolladoresde aplicaciones. Cada día, los usuariosdeFacebook instalan más de 20 millonesde aplicaciones (http://mm.facebook.com/press/info.php?stati st ics). Twitter Jack Dorsey, Evan Williamse Isaac “Biz”Stone fundaronTwitteren 2006: todo desde lacompañía de podcasts, Odeo. Twitter revolucionó los trúcroblogs. Los usuarios publican “tweets”:mensajes de hasta 140caracteresde longitud. Se publicancerca de 95 millonesdetweetsa diario (twitter. com/about). Usted puede seguirlostweetsde amigos, artistas, negocios, representantes del gobierno (inclusoel presidentede Estados Unidos, quien tiene 6.3 millones de seguidores),etcétera, o seguirtweetsdel tema para darseguimiento a noticias, tendenciasy mucho más.Al momento de escribireste libro, LadyGaga tenía el mayornúmero de seguidores (más de 7.7 millones). Twitterseconvirtió en el punto de origen para muchas noticias de última hora en todo el mundo. Groupon Groupon, un dúodecomerciosocial,fue lanzado porAndrew Masón in 2008. Paraenero de 2011 lacompañía estaba valuadaalrededor de los $15 mil millones¡con locualseconvirtió en lacompañía con más rápido crecimiento hasta esa fecha! Ahora estádisponible en cientosde mercadosen todo el mundo. Groupon muestra una oferta diaria en cada mercado para restaurantes, vendedoresal detalle, servicios, atraccionesydemás. Lasofertasseactivan sólo hasta que se inscribeel mínimo número de personasrequeridaspara comprar elproducto o servicio. Si usted se inscribeen una oferta ytodavía no cumplecon el mínimo, talvezsevea tentado a dar avisoa otras personas sobreesaoferta porcorreo electrónico, Facebook, Twitter, etcétera. Si laoferta no cumplecon el mínimo de ventas, secancela. Una de lasofertas de Groupon másexitosasa nivel nacional a lafecha fue un certificado de $50 dólaresen mercancíade una importante compañía de ropa a sólo $25. Sevendieron más de 440,000 cuponesen un solo día. Fig. 1.20 | Aplicaciones axiales (parte I de 2). www.FreeLibros.me
    • 1.12 Tecnologías de software 29 Compañía Descripción Foursquare Foursquare—creadaen 2009 porDennis CrowleyyNaveen Selvadurai— es una aplicación para realizar reportes (check-ins) móviles, lacual lepermite notificara susamigoslos lugaresque visita. Puede descargarlaaplicación en su teléfono inteligenteyvincularlacon suscuentas deFacebook yTwitter, de modo que susamigos puedan seguirlodesdevariasplataformas. Si no tiene un teléfono inteligente, puedereportarsemediante un mensajede texto. Foursquare utiliza elservicio GPS paradeterminar su ubicación exacta. Lasempresasusan Foursquareparaenviarofertasa losusuarios que se encuentren cerca. Foursquare iniciósusoperacionesen marzo de 2009 yya cuenta con másde 5millones de usuarios en todo el mundo. Skype Skype es un producto desoftwareque le permite realizarllamadas devoz yde video (la mayoríason gratuitas)a travésde Internet, medianteel uso deuna tecnología llamada M)IP(6zsobreIPIP se refierea “Protocolo deInternet”). Niklas Zennstrom yDañeJanus Friiisfundaron Skype en 2003. Dosaños después, vendieron lacompañía a eBaypor $2.6 mil millones. YouTube YouTube esun sitio para compartir videosquese fundó en 2005.Antesde que transcurriera un año, Googlecompró lacompañía por $1.65 mil millones. En laactualidad, YouTubeesresponsabledel 10% del tráfico totalen Internet (wwv.webpronews.com/topnews/2010/04/16/facebook-and-youtube-get-the- most-business-i nternet-traffi c). Menos deun año despuésde la liberación del iPhone 3GS deApple—elprimermodelo del iPhoneen ofrecervideo— lastransferenciasdesde dispositivosmóvilesa YouTubeaumentaron un 400% (www.hypebot.com/hypebot/2009/06/youtube-reports-1700-jump-1n- mobile-video.html). Fig . 1.20 | Aplicaciones sociales (parte 2 de 2). 1.12 Tecnologías de software La figura 1.21 muestra una lista de palabras de moda que escuchará en la comunidad de desarrollo de software. Creamos Centros de Recursossobre lamayoríade estos temas, y hay muchos por venir. Tecnología Descripción Softwareágil El desarrollo ágil de softwareesun conjunto de metodologíasque tratan de implementarsoftwarecon másrapidezymenos recursos que las metodologías anteriores.Visite lossitiosdeAgileAlliance (www.agilealliance.org) yAgile Manifestó (www.agilemanifesto.org).También puedevisitarelsitioen español www.agi le-spain.com. Refactorización La refactorización implica reformularel código para hacerlo más claroyfácil de mantener, al tiempo quesepreservasufuncionalidad. Esmuy utilizado en lasmetodologías de desarrolloágil. Muchos IDE contienen herramientasde refactorizaciónintegradaspara realizarla mayorparte del procesode refactoriza­ ción de manera automática. Patrones Lospatrones de diseño son arquitecturasprobadas para construirsoftware dediseño orientado a objetos flexibley que pueda mantenerse. Elcampo de lospatronesde diseño trata deenumerara lospatrones recurrentes,ydealentara losdiseñadores desoftware para que losreutilicen y puedan desarrollarun softwarede mejor calidadcon menos tiempo, dinero y esfuerzo. En elapéndice Q analizaremos lospatrones de diseño deJava. Fig. 1.2 1 | Tecnologías de software (parte I de 2). www.FreeLibros.me
    • Capítulo I Introducción a las computadoras y a Java Tecnología Descripción LAMP Software como un servicio (SaaS) Plataforma como un servicio (SaaS) Computación en la nube Kit de desarrollo de software (SDK) MySQLesunsistemadeadministración debasesde datosdecódigo fuente abierto. PHP esellenguajede“secuenciasdecomandos”del ladoservidordecódigo fuente abierto más popularparaeldesarrollode aplicacionesWeb. LAMP esun acrónimo paraelconjunto detecnologíasdecódigo fuenteabiertoque usanmuchosdesarro­ lladores en lacreacióndeaplicacionesWeb: serefierea Linux,Apache, MySQLy PHP (o Perl,o Python; otrosdoslenguajesdesecuencias decomandos). Por logeneral, elsoftwaresiempre se havisto como un producto; lamayoríaaún seofrecedeesta forma. Paraejecutaruna aplicación, hayque comprarla a un distribuidor desoftware. Despuésla instalamosen lacomputadora ylaejecutamos cuando sea necesario.A medida queaparecen nuevas versiones, actualizamosel software, locualgeneracon frecuencia un gasto considerable. Este proceso puede serincómodo para lasorganizaciones con decenasde miles de sistemas,a los que se debedarmantenimiento en una diversaselección de equipo de cómputo. En el Softwarecomo un servicio (SaaS),ésteejecuta en servidores ubicadosen cualquier parte de Internet. Quealseractualizados, losclientes en todo el mundo ven lasnuevascapacidades sin necesidad deuna instalación local. Podemos accederalservicioa travésdeun navegador. Losnavegadoresson bastante portables, por loque podemosverlasmismasaplicacionesen una amplia variedad de computadoras desdecualquierparte del mundo. Salesforce.com, Google, MicrosoftOfficeLive yWindowsLiveofrecen SaaS. La Plataformacomo un servicio (PaaS) proveeuna plataforma de cómputo para desarrollary ejecutaraplicaciones como un servicioa través deWeb, en vez deinstalarlas herramientas en su computadora. Los proveedores dePaaS más importantesson: GoogleApp Engine,Amazon EC2, BungeeLabs, entreotros. SaaSyPaaSson ejemplosde computación en la nube en donde elsoftware, las plataformasyla infraestructura (porejemplo, el poderdeprocesamiento y el almacenamiento)sealojan según lademanda a través de Internet. Estoofrece a losusuariosflexibilidad, escalabilidad yun ahorro en loscostos. Porejemplo, considere lasnecesidadesdealmacenamiento de datosdeuna compañía, que pueden fluctuardemanera considerable en eltranscurso deun año. En vez de invertiren hardware dealmacenamiento degran escala—cuyocosto de compra, mantenimiento yaseguramiento puede serconsiderable, ademásde que no siempre es posibleaprovecharsu capacidad total—,lacompañía podría comprar serviciosbasadosen la nube (comoAmazon S3, GoogleStorage, Microsoft WindowsAzure™,Nirvanix™ yotros) según losfuera requiriendo. LosKitsde desarrollo de software (SDK) incluyen tanto lasherramientascomo ladocumentación que utilizan los desarrolladorespara programaraplicaciones. Porejemplo, usted usará el Kit dedesarrollo deJava (JDK) paracrearyejecutar aplicacionesdeJava. Fig . 1.2 1 | Tecnologías de software (parte 2 de 2). Lafigura 1.22 describe las categoríasde liberación de versiones de los productos desoftware. Versión Descripción Alfa Elsoftwarealfaesla primeraversióndeun producto desoftwarecuyodesarrollo aúnseencuentraactivo. Porlogeneral lasversionesalfatienen muchoserrores, son incompletasyestables; además seliberana un pequeño número de desarrolladores paraqueevalúenlasnuevascaracterísticas, paraobtenerretroalimentaciónlo más pronto posible, etcétera. Fig. 1.22 | Terminología de liberación de versiones de productos de software (parte I de 2). www.FreeLibros.me
    • l.l 3 Cómo estar al día con las tecnologías de información 3 1 Versión Descripción Beta Lasversiones betase liberan a un número mayordedesarrolladoresen una etapa posteriordel proceso de desarrollo, una vezquesehacorregido la mayoríade los erroresimportantesylasnuevas características están casi completas. Elsoftware beta esmásestable, pero todavíapuede sufrirmuchos cambios. Candidatos En general, los candidatosparaliberacióntienen todas sus característicascomple- para liberación tas,están (supuestamente) libresde erroresy listospara que lacomunidad los (Release utilice,con locualse logra un entorno de prueba diverso: elsoftware se utiliza Candidates) en distintossistemas, con restriccionesvariables ypara muchos fines diferentes. Cualquier errorqueaparezcasecorrigey,en un momento dado, el producto final selibera al público en general. A menudo, lascompañíasdesoftware distribuyen actualizaciones increméntalesa travésde Internet. Beta Elsoftware que sedesarrolla mediante estemétodo porlo general no tiene permanente númerosde versión (porejemplo, la búsquedade Googleo Gmail).Este software, quesealojaen la nube (no seinstalaen su computadora), evoluciona demanera constante demodo quelos usuariossiempre dispongan delaversión más reciente. Fig . I .2 2 | Terminología de liberación de versiones de productos de software (parte 2 de 2). 1.13 Cómo estar al día con las tecnologías de información La figura 1.23 muestra una lista de las publicaciones técnicas y comerciales que le ayudarán a perma­ necer actualizado con la tecnología, las noticias y las tendencias más recientes. También encontrará unalista cada vez más grande de Centros de recursos relacionados con Internet yWeb en http: //www. dei tel.com/ResourceCenters.html. Publicación URL Bloomberg BusinessWeek www.businessweek.com CNET news.cnet.com Computer World www.computerworld.com Engadget www.engadget.com eWeek vwvw.eweek.com FastCompany www.fastcompany.com/ Fortune money.cnn.com/magazines/fo rtune/ InfoWorld www.i nfoworld.com Mashable mashable.com PCWorld www.pcworld. com SD Times www.sdtimes. com Slashdot slashdot.org/ SmarterTechnology www.smartertechnology.com TechnologyReview technologyreview.com Techcrunch techcrunch.com Wired www.wired.com Fig. 1.23 | Publicaciones técnicas y comerciales. www.FreeLibros.me
    • 32 Capítulo I Introducción a las computadoras y a Java 1.14 Conclusión Enestecapítulo analizamosel hardwareysoftware decomputadora, los lenguajes deprogramación ylos sistemas operativos. Vimos las generalidades de un entorno típico de desarrollo de programas deJavay probamos una aplicación de Java. Introdujimos los fundamentos de la tecnología de objetos. Aprendió acercade algunosde losemocionantes y nuevosacontecimientosen elcampo delascomputadoras.Tam­ bién analizamos cierta terminología clave del desarrollo de software. En elcapítulo 2 crearásus primeras aplicacionesdeJava. Podrávercómo esque los programas mues­ tran mensajes en la pantalla y obtienen información del usuario mediante el teclado para procesarla. Utilizará los tipos de datos primitivos y los operadores aritméticos deJava en cálculos que emplean los operadores de igualdady relaciónalesdeJava paraescribirinstrucciones simples de toma de decisiones. Ejercicios de autoevaluación I.I Complete lassiguientesoraciones: a) Lacompañía que popularizó lacomputación personal fue_________ b) La computadora que legitimó lacomputación personalen losnegociosy la industria fue_________ c) Las computadoras procesan datos bajo elcontrol deconjuntos deinstruccionesconocidascomo_________ d) Las unidades lógicas clave de la computadora son_________ , ___________ , , ____________ :y---------e) Lostrestiposde lenguajes descritosen este capítulo son________,_________y _________ f) Losprogramas quetraducen programasen lenguaje dealto nivela lenguajemáquina se denominan_________ g) ________ esun sistemaoperativo de teléfonosinteligentes, basado en el kemeldeLinuxy enJava. h) En general, el software________ tiene todas sus característicascompletas, está (supuestamente) libre de errores y listo paraque la comunidad lo utilice. i) Al igual que muchos teléfonos inteligentes, el control remoto del Wii utiliza u n _________que permite al dispositivo responderal movimiento. 1.2 Complete lassiguientesoraciones sobre elentorno deJava: a) Elcomando________ delJDK ejecuta una aplicación deJava. b) Elcomando________ delJDK compila un programa deJava. c) Un archivo de programa deJavadebe terminarcon laextensión dearchivo_________ d) Cuando secompila un programaen Java, elarchivo producido por el compiladorterminacon la extensión_________ 1.3 Complete lassiguientesoraciones (con base en lasección 1.6): a) Losobjetos tienen una propiedadqueseconoce como________;aunque éstos pueden saber cómo comuni­ carse con los demás objetos a través de interfaces bien definidas, por lo general no se les permite sabercómo están implementados losotrosobjetos. b) LosprogramadoresdeJavaseconcentran en crear________,quecontienen camposy elconjunto de métodos que manipulan a esoscampos y proporcionan serviciosa losclientes. c) El proceso deanalizary diseñarun sistemadesde un punto de vistaorientado a objetosse denomina_________ d) Mediantela________ ,sederivan nuevasclasesdeobjetosalabsorberlas características delasclasesexistentes y luegoagregarcaracterísticasúnicas propias. www.FreeLibros.me
    • Ejercicios 33 e) ________es un lenguaje gráfico que permite a las personas que diseñan sistemas de software utilizar una notaciónestándaren laindustriapararepresentarlos. f) Eltamaño, forma,colory pesodeun objetoseconsideran desuclase. Respuestas a los ejercicios de autoevaluación 1.1 a)Apple, b) Computadora personal (PC) de IBM. c) programas, d) unidad deentrada, unidad desalida, unidad dememoria, unidadcentralde procesamiento, unidadaritméticay lógica,unidad dealmacenamientosecundario,e)len­ guajesmáquina,lenguajesensambladores,lenguajesdealtonivel.0 compiladores,g)Android. h)Candidatodeliberación, i)acelerómetro. 1.2 a) java.b) javac. c) .java, d) .class. e)códigosdebytes. 1.3 a) ocultamientodeinformación, b)clases, c)análisisydiseñoorientadosa objetos (A/DOO). d)herencia,e)El Lenguajeunificadodemodelado (UML). 0 atributos. Ejercicios 1.4 Complete lassiguientesoraciones: a) La unidad lógica de la computadora que recibe información desde el exterior de la computadora para que ésta la utilice sellama_________ b) El proceso de indicara lacomputadora cómo resolver un problemasellama_________ c) ________es un tipo de lenguaje computacional que utiliza abreviaturas del inglés para las instrucciones de lenguajemáquina. d) ________es una unidad lógica de la computadora que envía información que ya ha sido procesada por lacomputadora a variosdispositivos,demanera quepueda utilizarse fuera delacomputadora. e) ________ y_________son unidades lógicasde lacomputadora que retienen información. 0 ________esuna unidad lógicade la computadora querealiza cálculos. g) ________esuna unidad lógicadela computadora quetoma decisiones lógicas. h) Los lenguajes son los más convenientes para que el programador pueda escribir programas con rapidezyfacilidad. i) Al único lenguaje que una computadora puede entender directamente se le conoce como el_________de esacomputadora. j) ________es una unidad lógica de la computadora que coordina las actividades de todas las demás unidades lógicas. 1.5 Complete lassiguientesoraciones: a) ________se utiliza ahora para desarrollaraplicaciones empresariales de gran escala, para mejorar la funcio­ nalidad de los servidores Web, para proporcionaraplicaciones para dispositivos domésticos y muchos otros finesmás. b) En un principio, se hizo muy popular como lenguajededesarrollo paraelsistemaoperativo UNIX. c) Lacompañía Web 2.0________ es laque tiene elcrecimiento más rápido dela historia. d) El lenguajede programación_________fue desarrollado por Bjame Stroustrup a principios de la década de 1980en losLaboratorios Bell. 1.6 Complete lassiguientesoraciones: a) Por lo general, los programas de Java pasan a través de cinco fases: ________ , , , y • b) U n________ proporciona muchas herramientas que dan soporte al proceso de desarrollo de software, como loseditoresparaescribiryeditarprogramas, losdepuradores para localizarloserroreslógicosen losprogramas, ymuchasotrascaracterísticasmás. www.FreeLibros.me
    • 34 Capítulo I Introducción a las computadoras y a Java c) Elcomando java invocaal________, que ejecuta los programas deJava. d) Una________ es una aplicación de software que simula una computadora, pero oculta el sistema operativo yelhardwaresubyacentes de losprogramas queinteractúan con laVM. e) El________ toma los archivos .el ass que contienen los códigos de bytes del programa y los transfierea la memoria principal. f) El________examina los códigosde bytesparaasegurarquesean válidos. 1.7 Expliquelas dos fases de compilación de losprogramas deJava. 1.8 Es probableque usted lleveen su muñeca uno delos tiposdeobjetosmáscomunesen el mundo: un reloj.Analice cómo seaplicacada uno delossiguientestérminosyconceptosa lanocióndeun reloj: objeto, atributos, comportamientos, clase, herencia (porejemplo, considere un relojdespertador), abstracción, modelado, mensajes, encapsulamiento, interfaz yocultamiento deinformación. Marcar la diferencia Hemos incluido en este libro ejercicios Marcar ladiferencia, en losque le pediremos que trabaje con problemasque son de verdad importantes para los individuos, las comunidades, los países y el mundo. Para obtener más información sobre las organizaciones a nivel mundial que trabajan para marcar la diferencia, y para obtener ¡deas sobre proyectos de programación relacionados, visite nuestro Centro de recursos para marcar la diferencia en www.dei te l .com/ maki ngadi ffe re n c e . 1.9 (Pruebapráctica:calculadora deimpactoambientaldelcarbono)Algunos científicos creen que las emisiones de carbono, sobre todo las que se producen al quemar combustibles fósiles, contribuyen de manera considerable al calenta­ miento globalyqueesto sepuede combatirsi laspersonas tomamosconciencia ylimitamosel usodelos combustiblescon baseen elcarbono.Lasorganizacionesylosindividuossepreocupan cadavezmás porel “impactoambientaldelcarbono”. Lossitios Webcomo Terra Pass www.terrapass.com/carbon-footprint-calculator/ yCarbón Footprint www.carbonfootprint.com/calculator.aspx ofrecen calculadoras de impacto ambiental del carbono. Pruébelas para determinar el impacto que provoca usted en el ambiente debido al carbono. Los ejercicios en capítulos posteriores le pedirán que programe su propia calculadora de impacto ambiental delcarbono. Como preparación, lesugerimosinvestigarlas fórmulas para calcularlo. 1.10 (Pruebapráctica:calculadora delIndicede masa corporal)Según lasestimaciones recientes, dos terceras partes de las personas que viven en Estados Unidos padecen de sobrepeso; la mitad de estas personas son obesas. Esto provoca aumentosconsiderablesen elnúmero de personascon enfermedadescomo ladiabetesylascardiopatías. Paradeterminar si una persona tiene sobrepeso o padece de obesidad, puede usar una medida conocida como índice de masa corporal (IMC). El Departamento de Salud y Servicios Humanos de Estados Unidos proporciona una calculadora del IMC en www. nhl bisupport.com/bmi/. Usela para calcular su propio IMC. Un ejercicio del capítulo 2 le pedirá que programe su propia calculadora del IMC. Como preparación, lesugerimos investigar lasfórmulasparacalcular el IMC. I. I I (Atributosdelosvehículoshíbridos)En este capítulo aprendió sobre losfundamentosde lasclases.Ahora empe­ zaráa describircon detalle losaspectosdeunaclaseconocida como “Vehículo híbrido”.Loscualesseestánvolviendocada vezmás populares, puesto que porlogeneral pueden ofrecer mucho más kilometraje que los operados sólo porgasolina. Navegueen Web y estudie lascaracterísticas de cuatro o cinco de los autos híbridos populares en laactualidad; después haga una lista de todos los atributos relacionados con sus características de híbridos que pueda encontrar. Porejemplo, algunos de los atributos comunes son los kilómetros por litro en ciudad y los kilómetros por litro en carretera.También puede hacer una listade losatributos de lasbaterías (tipo, peso, etcétera). 1.12 (Neutralidaddegénero)Muchas personasdeseaneliminarelsexismode todaslas formasdecomunicación. Usted ha recibido la tarea de crear un programa que pueda procesar un párrafo de texto y reemplazar palabras que tengan un género específico con palabras neutrales en cuanto al género. Suponiendo que recibió una lista de palabras con género específico y sus reemplazos con neutralidad de género (porejemplo, reemplace “esposa” por “cónyuge”, “hombre” por “persona”,“hija” por“descendiente”,yasíen losucesivo), expliqueel procedimiento que utilizaría paraleerun párrafo de texto y realizarestos reemplazos en forma manual. ¿Cómo podría su procedimiento generar un término extraño como www.FreeLibros.me
    • Recursos para hacer la diferencia 35 Voperchild”, que aparece listado en el Diccionario Urbano (www.urbandictionary.com)? En el capítulo 4 aprenderá que un término másformalpara“procedimiento”es“algoritmo”,queespecificalospasosarealizar,además delordenen elquesedeben llevaracabo. 1.13 (Privacidad)Algunosservicios decorreo electrónico en línea guardan toda lacorrespondencia electrónicaduran­ tecierto periodo de tiempo. Suponga que un empleado disgustado de uno de estos serviciosdecorreo electrónico en línea publicara en Internet todas las correspondenciasde correo electrónico de millones de personas, entreellaslasuya.Analice lasconsecuencias. 1.14 (Responsabilidad¿ticay legaldelprogramador) Como programador en la industria, tal vez lleguea desarrollar software que podría afectarlasaludde otras personas, o incluso susvidas. Suponga que un error desoftwareen uno de sus programas provocara que un paciente de cáncer recibiera una dosis excesiva durante la terapia de radiación y resultara gravemente lesionadao muriera.Analicelasconsecuencias. 1.15 (El “Flash Crash”de2010)Un ejemplo de lasconsecuencias de nuestra excesivadependencia con respecto a las computadoraseseldenominado “flashcrash”,que ocurrió el 6demayo de2010, cuando el mercado devaloresde Estados Unidos se derrumbó de manera precipitada en cuestión de minutos, al borrarse billones de dólares de inversiones que se volvieron a recuperar pocos minutosdespués. UseInternet para investigarlas causas de estederrumbeyanalice lasconse­ cuenciasque genera. Recursos para marcar la diferencia La CopaImaginedeMicrosoftes una competencia global en la que los estudiantes usan la tecnología para intentar resol­ ver algunos de los problemas más difíciles del mundo, como la sostenibilidad ambiental, acabar con la hambruna, la respuesta a emergencias, la alfabetización, combatir el HIV/SIDA y otros más. Visite www.imaginecup.cora/about para obtenermás información sobre lacompetencia y paraaprender sobre los proyectos desarrollados por los anteriores ganadores. También encontrará varias ¡deas de proyectos enviadas por oiganizaciones de caridad a nivel mundial en www. iraaginecup. cora/students/imagine-cup-solve-this. Si desea obtener ¡deas para proyectos de programación que puedan marcarladiferencia, busque en Webel tema “marcarladiferencia”y visite: www. un. o rg/m i11 en ni umgoals ElproyectoMilenio deNacionesUnidas buscasolucionesparalosprincipalesproblemasmundiales,comolasostenibilidad ambiental, la igualdaddesexos, lasalud infantil ymaterna, laeducación universaly otros más. www.ibm.com/smarterplanet/ ElsitioWeb SmarterPlanetdeIBM®habla sobrecómo es que IBM utiliza la tecnología para resolverproblemasrelaciona­ doscon losnegocios, lacomputación en la nube, la educación, lasostenibilidadyotros más. www.gatesfoundati on.org/Pages/home.aspx La Fundación Bill y Melinda Gates ofrece becas a las organizaciones que trabajan para mitigar el hambre, la pobreza y lasenfermedades en los países en desarrollo. En Estados Unidos, la fundación seenfocaen mejorar la educación pública, en especial para las personascon bajos recursos. www.nethope.org/ NetHope esuna colaboración deorganizacioneshumanitariasen todo elmundo, quetrabajan para resolver losproblemas relacionadoscon la tecnología, como laconectividadyla respuestaa las emergencias, entreotros. www.rainforestfoundation.org/home La Fundación Rainforest trabaja para preservar los bosques tropicales y proteger los derechos de los indígenas que consi­ deran aestos bosquescomo su hogar. El sitiocontiene una listadeactividadesque usted puedehacerpara ayudar. www.undp.org/ El Programa de las Naciones Unidas para el Desarrollo (UNDP) busca soluciones a los desafíos globales, como la pre­ vención yrecuperación decrisis, laenergíay elambiente, lagobemanza democrática yotros más. www.unido.org La Organización de las Naciones Unidas para el Desarrollo Industrial (UNIDO) busca reducir la pobreza, dar a los países en desarrollo laoportunidad de participar en el comercioglobal y promover tanto la eficiencia de la energía como lasostenibilidad. www.FreeLibros.me
    • 36 Capítulo I Introducción a las computadoras y a Java www.usaid.gov/ USAID promuevela democraciaglobal, lasalud, elcrecimiento económico, la prevención deconflictos ylaayuda huma­ nitaria, entre otrascosas. www.toyota.com/ideas-for-good/ Elsitio Web Ideas forGoodde Toyota describe variastecnologíasde estaempresa que están haciendo ladiferencia; entre éstas; su Sistemaavanzado de asistenciade estacionamiento (AdvancedParkingGuidance System), la tecnología Hybrid Synergy Drive®, el Sistema de ventilación operado por energía solar (Solar Powered Ventilation System), el modelo T.H.U.M.S. (Modelo humano total para la seguridad) yTouchTracer Display. Usted puede participaren el desafío de Ideas for Good; envíe un breve ensayo o un video que describa cómo se pueden usarestas tecnologías para otros buenos propósitos. www.FreeLibros.me
    • Introducción a las aplicaciones en Java en un nombre? A esoalo quellamamosrosa, silediéramosotro nombre cojiservaríasu misma fraganciadulce. — Wiiliam Shakespeare Alhacerfrente a unadecisión, siempremepregunto, Cuál serálasolución másdivertida —PeggyWaJker Elméritoprincipaldellenguaje eslaclaridad. —Galen Unapersonapuedehacerla diferenciay cadapers deberíaintentarlo. rsona —John F.Kennedy O b j e t i v o s En este capítulo aprenderá a: ■ Escribir aplicaciones simples en Java. ■ Utilizar las instrucciones de entrada y salida. ■ Familiarizarse con los tipos primitivos de Java. ■ Comprender los conceptos básicos de la memoria. ■ Utilizar los operadores aritméticos. ■ Comprender la precedencia de bs operadores aritméticos. ■ Escribir instrucciones para tomar decisiones. ■ Utilizar los operadores relaciónales y de igualdad. www.FreeLibros.me
    • Plangeneral 38 Capítulo 2 Introducción a las aplicaciones en Java 2.1 Introducción 2.6 Conceptos acerca de la memoria 2.2 Su primer programa en Java: imprimir una 2.7 Aritmética línea de texto 2.8 Toma de decisiones: operadores de igualdad 2.3 Modificación de nuestro primer programa y relaciónales en Java 2.9 Conclusión 2.4 Cómo mostrar texto con p r in t f 2.5 Otra aplicación en Java: suma de enteros Resumen | Ejerciciosde autoevaluación | Respuestas a los ejercicios de autoevaluación | Ejercicios | Marcar la diferencia ^ 2.1 Introducción En estecapítulo lepresentaremos laprogramación de aplicaciones enJava. Empezaremos con ejemplos de programas que muestran mensajes en la pantalla. Después veremos un programa que obtiene dos números de un usuario, que calcula lasuma y muestra elresultado. Aprenderá cómo ordenar a la computadora que realice cálculos aritméticos y guarde sus resultados para usarlos más adelante. El último ejemplo en este capítulo demuestra cómo tomar decisiones. La aplicación compara números y después muestra mensajes oon los resultados. Este capítulo utiliza herramientas delJDK para compilar y ejecutar programas. También publica­ mos videos Dive Into® en www.dei t e l .com/books/jhtp9 paraque usted pueda empezar a trabajar con bs populares entornos de desarrollo integrados Eclipse y NetBeans. 2.2 Su primer programa en Java: imprimir una línea de texto Una aplicación Java es un programa de computadora que se ejecuta cuando usted utiliza el comando javapara iniciar la máquina virtual deJava (JVM). Más adelanteen estasección hablaremos sobre cómo oompilary ejecutar una aplicación deJava. Primero vamos a considerar una aplicación simple que mues­ tra una línea de texto. En la figura 2.1 se muestra el programa, seguido de un cuadro que muestra su salida. El programa incluye números de línea, que integramos para fines académicos; no son parte de un programa en Java. Este ejemplo ilustra varias características importantes. Pronto veremos que la línea 9 se encarga del verdadero trabajo: mostrar la frase Bienvenido a la programación en lava! en la pantalla. 1 / / Fig- 2 .1 : B ie n ve n id o !..java 2 / / Programa para im p rim ir te x to . 3 4 p u b lic c la s s B ienvenido!. 5 { 6 / / e l método main empieza la ejecu ció n de la a p lic a c ió n en la v a 7 p u b l i c s t a t i c v o id m a in ( S t r i n g [ ] arg s ) 8 { 9 S y s t e m .o u t . p r i n t l n C "Bienvenido a la programación en la v a !” ) ; 10 } / / f in del método main 11 } / / f in de la c la s e Bienvenido!. B ie n v e n id o a l a program ación en la v a ! Fig. 2.1 | Programa para imprimir texto. www.FreeLibros.me
    • 2.2 Su primer programa en Java: imprimir una línea de texto 39 Comentarios en susprogramas Insertamos comentarios para documentar los programas y mejorar su legibilidad. El compilador de Java ignora los comentarios, de manera que lacomputadora nohace nada cuando el programa seejecuta. Por convención, comenzamos cada uno de los programas con un comentario, el cual indica el nú­ mero de figura y el nombre del archivo. El comentario en la línea 1 / / F ig . 2 .1 : B ie n v e n id o l.ja v a Empieza con //, lo cual indica que es un comentario de fin de línea: termina al final de la línea en la que aparece el carácter //. Un comentario de fin de línea no necesita empezar ésta; también puede estar en medio y continuar hasta el final (como en las líneas 10 y 11). La línea 2 / / Programa para im p rim ir te x to . es un comentario que describe el propósito del programa. Java también cuenta con comentarios tradicionales, que se pueden distribuir en varias líneas, como en: /* Éste es un com entario tr a d ic io n a l. Se puede d iv id ir en v a ria s lin e a s * / Estos comentarios comienzan y terminan con los delimitadores /* y */. El compilador ignora todo el tExto entre estos delimitadores. Java incorporó los comentarios tradicionales y los de fin de línea de los lenguajes de programación C y C++, respectivamente. En este libro sólo utilizamos comentarios de fin de línea (//). Java también cuenta con un tercer tipo de comentarios: los comentarios Javadoc, que están deli­ mitados por /** y */. El compilador ignora todo el texto entre los delimitadores. Estos comentarios nos permiten incrustar la documentación de manera directaen nuestros programas, y son el formato prefe­ rido en la industria. El programa de utilería j avadoc (parte del Kit de Desarrollo de Java SE) lee esos oomentarios y los utiliza para preparar la documentación de su programa, en formato HTML. En el apéndice M, Creación de documentación con Javadoc, demostramos el uso de los comentarios j avadoc y la herramienta javadoc. Error común de programación 2.1 Olvidarunodelosdelimitadoresde un comentario tradicionaloJavadocesun errorde sintaxis, elcualocurrecuandoelcompiladorencuentracódigo que mola las reglasdel lenguajeJava (esdecir, susintaxis). Estasreglassonsimilaresalasreglasgramaticalesde unlenguajenaturalqueespecificanlaestructuradesusoraciones.Loserroresdesintaxisse conocentambiéncomoerroresdelcompilador, erroresen tiempo de compilación o erroresde compilación,yaqueelcompiladorlosdetectadurantelafasedecompilación. Como respuesta, elcompilador emite un mensajede errory evita que suprograma se compile. Buena práctica de programación 2.1 Ciertasorganizacionesrequierenquetodoslosprogramascomiencenconuncomentarioque expliquesupropósito,elautor,lafichay lahoradelaúltimamodificacióndelmismo. Usode líneasen blanco La línea 3 es una línea en blanco. Las líneas en blanco, los espacios y las tabulaciones facilitan la lec­ tura de los programas. En conjunto se les conoce como espacio en blanco, el cual es ignorado por el compilador. Buena práctica de programación 2.2 Utilicelíneasenblancoy espaciosparamejorarlalegibilidaddelprograma. www.FreeLibros.me
    • 40 Capítulo 2 Introducción a las aplicaciones en Java Declaración de una clase La línea 4 public class Bienvenidol oomienzaunadeclaración de clase para laclase Bienvenidol.Todo programa enJavaconsisteal menos de una clase que usted (el programador) debe definir. La palabra clave class introduce una declara­ ción de clase, que debe ir seguida de inmediato por el nombre de la clase (Bienveni dol). Las palabras clave(también conocidas como palabras reservadas) se conservan parauso exclusivo deJavay siempre seescriben en minúscula. En el apéndice C se muestra la lista completa de palabras clavedeJava. Nombresde clasese identificadores Por convención, todos los nombres de clases comienzan con una letra mayúscula, y la primera letra de cada palabraen el nombre de laclasedebe iren mayúscula(porejemplo, Ej empl oDeNombreDeCl ase). El nombre de una clase es un identificadon una serie de caracteres que pueden ser letras, dígitos, guiones bajos (_) y signos de moneda ($), que no comience con un dígito ni tenga espacios. Algunos identifica­ dores válidos son: Bienvenidol, Svalor, _va lo r, m_campoEntradal y boton7. El nombre 7boton no es un identificadorválido, yaque comienzacon un dígito,y elnombre campo entrada tampoco loes debi­ do aque contiene un espacio. Por lo general, un identificador que no empieza con una letra mayúscula no esel nombre de unaclase.Javaessensible amayúsculasy minúsculas; esdecir, lasletras mayúsculas yminúsculassondisdntas,porloque valoryValorsondisdntosidendficadores(peroambossonválidos). En los capítulos 2 al 7, cada una de las clases que definimos comienza con la palabra clave publi c. Por el momento vamos a considerar tan sólo que es obligatoria. Para nuestra aplicación, el nombre del archivo es Bienvenidol. java. En el capítulo 8 aprenderá más acerca de las clases public y las que no son public. Error común de programación 2.2 '*5* Una clase pub 11c debecolocarseen un archivoque tenga elmismo nombre que la clase (en términosdeortografíay usode mayúsculas)y la extensión .ja v a ; en cosocontrario, ocurreun errordecompilación. Porejemplo, publ 1c classBienveni dosedebecolocaren unarchivollamadoBienvenido, java. Una llave izquierda (como en la línea 5), {, comienza el cuerpo de todas las declaraciones de cla­ ses. Su correspondiente llave derecha (en la línea 11),), debe terminar cada declaración de una clase. Las líneas 6 a 10 tienen sangría. Tip para prevenir errores 2.1 Cuandoescribaunallaveizquierdadeapertura, {,escribadeinmediatolallavederecha de cierre, };despuésvuelvaa colocarelcursorentre lasdosllavesy apliquesangríapara empezar a escribirelcuerpo. Estaprácticaayuda aprevenirerroresdebidoa lafalta de llaves.MuchosIDEinsertan lasllavesporusted. m Error común de programación 2.3 Esunerrordesintaxisnoutilizarlasllavesporpares. Buena práctica de programación 2.3 Aplique sangríaa todo elcuerpo de ¡adeclaración de cada clase, usando un “nivel”de sangríaentrelallaveizquierday lallavederecha, lascualesdelimitanelcuerpodelaclase. Lerecomendamosusartresespaciosparafirmar unniveldesangría.Esteformatoenfatiza laestructuradeladeclaracióndelaclase,y facilitasulectura. www.FreeLibros.me
    • 2.2 Su primer programa en Java: imprimir una línea de texto 41 Buena práctica de programación 2.4 MuchosIDEinsertanlasangríaporustedenloslugaresapropiados. Tambiénpuedeusar lateclaTabparaaplicar sangríaalcódigo,pero lasposicionesde losfabuladoresvarían entre losdiversos editoresde texto. La mayoría de los IDE lepermiten configurar los fabuladoresdetalformaque seinserteelnúmero especificado de espacioscada vez que oprimalateclaTab. Declaración de un método Lalínea 6 // el método main empieza la ejecución de la aplicación en lava es un comentario de fin de líneaque indica el propósito de las líneas 7 a 10 del programa. La línea7 public static void main( String[] args ) esel punto de inicio de toda aplicación enJava. Los paréntesis despuésdel identificadormain indican que éste es un bloque de construcción del programa, al cual se le llama método. Las declaraciones de clasesen Javapor lo general contienen uno o más métodos. En una aplicación enJava, sólo uno deesos métodos debellamarsemain y hay quedefinirlo como semuestraen lalínea 7; de no serasí, la máquina virtual deJava (JVM) no ejecutará la aplicación. Los métodos pueden realizar tareas y devolver infor­ mación una vez que las hayan concluido. La palabra clave void indica que este método nodevolverá ningún tipo de información. Más adelanteveremoscómo puede un método devolverinformación. Por ahora, sólo copie la primera línea de main en sus aplicaciones en Java. En la línea 7, las palabras Stri ng[] args entre paréntesisson unaparte requerida de ladeclaración del método main; hablaremos sobre esto en el capítulo 7. La llave izquierda en la línea 8 comienza el cuerpo de la declaración del método. Su correspon­ diente llave derecha debe terminarlo (línea 10). La línea 9 en el cuerpo del método tiene sangría entre lasllaves. Buena práctica de programación 2.5 Apliquesangríaatodoelcuerpode ladeclaraciónde cadamétodo, usando un “nivel"de sangríaentrelasllavesquedelimitan elcuerpodelmétodo. Esteformatoresaltalaestruc­ turadelmétodoyayudaaquesudeclaraciónseamásfácildeleer. Operacionesde salida con System, o u t.p rin tln La línea 9 System.out.printlnC “ Bienvenido a la programación en Ja v a !” ) ; indicaa lacomputadora que realice una acción; es decir,que imprima la cadenade caracteres contenida entre los caracteres de comillas dobles (sin incluirlas). A una cadena también se le denomina cadena de caracteres o literal de cadena. Elcompilador noignora los caracteres de espacio en blanco dentro de las cadenas. Éstas no pueden abarcar varias líneas de código, pero como veremos más adelante, no impide que usemos cadenas largas en nuestro código. System .out seconocecomo el objeto de salida estándar. PermitealasaplicacionesenJavamostrar información en laventana de comandos desde lacual se ejecutan. En versiones recientes de Microsoft Windows, laventana decomandos es el Símbolo del sistema. En UNDÍ/Linux/Mac OS X, laventana de comandos se llamaventana de terminal o shell. Muchos programadores se refieren a la ventana de co­ mandos simplemente como lalínea de comandos. Elmétodo System.out.pri ntl nmuestra(oimprime) unalíneadetexto en laventanadecomandos. Lacadenadentro de los paréntesisen lalínea9es elargumento paraelmétodo. Elmétodo System,out. pri ntl ncompleta su tarea, posiciona elcursor de salida (la ubicación en donde se mostrará el siguiente carácter) al principio de la siguiente línea en la ventana de comandos. Esto es similar a lo que ocurre www.FreeLibros.me
    • 42 Capítulo 2 Introducción a las aplicaciones en Java cuando un usuario oprime la tecla Intro,al escribir en un editor de texto: el cursor aparece al principio de lasiguiente líneaen el documento. Todalalínea9, incluyendo System. out. pr i nt i n, elargumento “ Bienvenido a la programación en Java!” entre paréntesis y el punto y coma (;), se conoce como una instrucción. Cada instruc­ ción termina con un punto y coma. Por lo general, un método contiene una o más instrucciones que realizan su tarea. La mayoría de las instrucciones terminan con punto y coma. Cuando se ejecuta la instrucción de la línea 9, muestra el mensaje Bienvenido a la programación en Java! en la ven­ tana de comandos. Tip para prevenir errores 2.2 Al aprender a programar, algunas veces es conveniente “'descomponer' un programa funcional, para que de esta manerapuedafamiliarizarse con los mensajesde error de sintaxisdelcompilador.Éstosnosiempreindicanelproblemaexactoenelcódigo. Cuando seencuentreconunmensajedeerror, ledardunaideadequéfue loqueloocasionó[trate dequitarunpuntoy comaounallavedelprogramadelafigura2.1,y vuelvaacompilar­ lodemaneraquepuedaverlosmensajesdeerrorquesegenerandebidoaestaomisión]. Tip para prevenir errores 2.3 Cuandoelcompiladorreportaunerrordesintaxis,éstetalveznoseencuentreenelnúmero delineaindicadoporelmensajedeerror.Primeroverifiquelalineaenlaquesereportóel error;siesalineanocontieneerroresdesintaxis, verifiquelasanteriores. Usode loscomentariosdefin de linea en lasllavesderechaspara mejorar la legibilidad Incluimos un comentario de fin de línea después de una llave derecha de cierre que termina la declara­ ción de un método y después de una llave de cierre que finaliza ladeclaración de una clase. Por ejemplo, la línea 10 } / / f in del método main especifica la llave derecha decierre del método mai n, y la línea 11 } / / f in de la c la s e B ien ven id o l especificalallave derecha decierre de la clase Bi enveni dol. Cadacomentario indica elmétodo o la clase que termina con esa llave derecha. Compilacióny ejecución de suprimera aplicación deJava Ahora estamos listos para compilar y ejecutar nuestro programa. Vamos a suponer que usted utilizará las herramientas de línea de comandos del Kit de Desarrollo de Java y no un IDE. En nuestros Cen­ tros de Recursos de Java en www.deitel.com /ResourceCenters.htm l proporcionamos vínculos a tutoriales que le ayudarán a empezar a trabajar con varias herramientas de desarrollo populares de Java, entre ellas NetBeans™, Eclipse™ y otras. También publicamos videos de NetBeans y Eclipse en www. d e ite l .com/books/j htp9/ para ayudarle aempezar a utilizar estos populares IDE. Para compilar el programa, abra una ventana de comandos y cambie al directorio en donde está guardado elprograma. Lamayoríade lossistemasoperativos utilizan el comando cd para cambiardirec­ torios. Por ejemplo, en Windows el comando, cd c:ejem ploscap02fig02_01 cambiaal directorio fig02_01. En UNIX/Linux/Mac OS X, el comando cd ~/ejemplos/cap02/fig02_01 cambiaal directorio f i g02_01. www.FreeLibros.me
    • 2.2 Su primer programa en Java: imprimir una línea de texto 43 Para compilar el programa, escriba javac B ien ven id o l.java Si el programa no contiene errores de sintaxis, el comando anterior crea un nuevo archivo llamado B ien ven id o l.class (conocido como el archivo de clase para Bienvenidol), el cual contiene los códigos de bytes deJava independientes de la plataforma, que representan nuestra aplicación. Cuando utilicemos el comando java para ejecutar la aplicación en una plataforma específica, la JVM tradu­ cirá estos códigos de bytes en instrucciones que elsistema operativo y el hardware subyacentes puedan comprender. Tip para prevenir errores 2.4 Cuantotratedecompilarunprograma,sirecibeunmensajecomo “comando o nombre de archivo in c o rre c to ,” “ja v a c : comando no encontrado” o “ 'ja v a c ' no se reconoce como un comando interno o externo, programa o archivo por lo te s ejecu ta b le, ” en-toncessu instalacióndelsoftwaredefava nose completó enforma apropiada. Si uti­ lizael]DK,estoindicaque lavariabledeentornoPATH¿leísistemanoseestableciódema­ neraapropiada. Consultecon cuidado lasinstruccionesde instalaciónenlasecciónAntes deempezarestelibro. Enalgunossistemas,despuésde corregirla variable PATH, esproba­ ble¿juenecesitereiniciarsuecjuipooabrirunanuevaventanadecomandosparacpieestos ajustestenganefecto. Tip para prevenir errores 2.5 Cadamensajedeerrordesintaxiscontieneelnombredearchivoy elnúmerode lineaen donde ocurrió elerror. Por ejemplo, Bienvenidol. ja v a :6 indica queocurrió un error enlalinea 6delarchivo Bi envenid o l. java. Elresto¿leímensajeproporcionainforma­ ciónacerca¿leíerrordesintaxis. Tip para prevenir errores 2.6 Elmensajedeerrordelcompilador“cla ss Bienvenidol is p u b lic, should be declared in a f i l e named Welcomel. ja va ” indica ¿fue elnombre delarchivono coincide con elnombre de la clasepublic en elarchivo, o que escribió malelnombre de la clase al momentodecompilarla. La figura2.2 muestra el programade lafigura2.1 al ejecutarseen unaventana Símbolo del sistema de Microsoft® Windows® 7. Para ejecutar el programa, escriba java Bienvenidol. Este comando inicia la JVM, que a su vez carga el archivo .cla ss para la clase Bienvenidol. El comando omite la extensión .el as s del nombrede archivo; de no serasí, laJVM no ejecutaráel programa. LaJVM llama al método main. A continuación, la instrucción dela línea 9 de main muestra “Bien ven i do a la pro­ gramación en Java I” [nota: muchos entornos muestran los símbolos del sistema con fondos negros y texto blanco. En nuestro entorno ajustamos esta configuración para que nuestras capturas de pan­ talla fueran más legibles]. ISdtít CcmmprvdPrompt f:exaap1esrh02f1g02jmjavar Welrnmel.Java C:exaaplesch02fiR02 01>iav« Welcoael Itelcon* to Java ^rograamlngl, C:trx«aple*(.t 02fig02_01> El programa imprime en la pantalla Bienvenido a la programación en lava! Usted escribe este comando para ejecutar la aplicación Fig. 2.2 | Ejecución de B ien ven id o l desde el Símbolo del sistema www.FreeLibros.me
    • 44 Capítulo 2 Introducción a las aplicaciones en Java Tip para prevenir errores 2.7 AltratardeejecutarunprogramaenJava,sirecibeunmensajecomo“Excepti on in threa d “main " ja v a .7ang. NoClassDefFoundError: Bienven i do l,”quieredecirquesuvariable deentorno CLASSPATH noestáconfiguradade manera correcta. Consulteconcuidadolas instruccionesde instalaciónenlasecciónAntesdeempezarestelibro. Enalgunossistemas, talveznecesitereiniciarsuequipooabrirunanuevaventanadecomandosparaqueestos ajustestenganefecto. 2.3 Modificación de nuestro primer programa en Java En estasección modificaremos el ejemplo de la figura 2.1 para imprimir texto en una línea mediante el usode varias instrucciones,y para imprimir texto en varias líneas mediante unasola instrucción. Cómo mostrar una sola línea de texto con varias instrucciones Esposiblemostrar la líneade texto Bienvenido a la programación en Java! devarias formas. Laclase Bienveni do2, que se muestra en la figura 2.3, utiliza dos instrucciones (líneas 9 y 10) para producir el resultado que se muestra en la figura 2.1. [Nota: de aquí en adelante, resaltaremos las características nuevas y las características clave en cada listado de código, como se muestra en las líneas 9 y 10 de este programa]. 1 / / F ig - 2.3 : Bienvenido2.java 2 / / Im prim ir una lin e a de texto con va ria s in stru ccio n e s. 3 4 public c la ss Bienvenido2 5 { 6 // e l método main empieza la ejecución de la ap licació n en Java 7 public s ta tic void main(S trin g [] args ) 8 { 9 S ystem .o u t.p rin t( “Bienvenido a ” ) ; 10 System .out.printlnC “la programación en Ja v a !” ) ; 11 } / / fin del método main 12 } / / fin de la clase Bienvenido2 Bienvenido a la programación en Java! Fig. 2.3 | Impresión de una línea de texto con varias instrucciones. El programaes similar al de lafigura 2.1, por lo que aquísólo hablaremos de los cambios. La línea 2 / / Im prim ir una lin e a de texto con va ria s in stru ccio n es. es un comentario de fin de línea que describe el propósito de este programa. La línea 4 comienza la declaración de laclase Bienveni do2. Las líneas9 y 10 del método mai n S y s te m .o u t.p rin t( “Bienvenido a " ) ; S y ste m .o u t.p rin tln C “ la programación en Ja v a !” ) ; muestran una línea de texto. La primera instrucción utiliza el método p ri nt de System , out para mos­ trar una cadena. Cadainstrucción p ri nt o p ri n tl n continúamostrando caracteresa partir dedonde la últimainstrucción p rin t o p ri n tl n dejó demostrarlos. A diferenciade p ri n tl n, después de mostrarsu argumento, p rin t «oposicionael cursordesalidaalinicio de lasiguiente líneaen laventana de coman­ dos; elsiguiente carácterque muestrael programaen laventanade comandos aparecerájustodespuésdel último carácter que muestre p ri n t. Por lo tanto, la línea 10 coloca el primer carácter de su argumento www.FreeLibros.me
    • 2.3 Modificación de nuestro primer programa en Java 45 (la letra “1”) inmediatamente después del último carácter que muestra la línea 9 (el carácterde espacio antes del carácter decomilladoble de cierre de la cadena). Cómo mostrar variaslineasde texto con una sola instrucción Una sola instrucción puede mostrar varias líneas mediante el uso de los caracteres de nueva línea, los cuales indican a los métodos print y println de System.out cuándo deben colocar el cursor de salida al inicio de la siguiente línea en la ventana de comandos. Al igual que las líneas en blanco, los espacios y los tabuladores, los caracteres de nueva línea son caracteres de espacio en blanco. El pro­ grama de la figura 2.4 muestra cuatro líneas de texto mediante el uso de caracteres de nueva línea para determinar cuándo empezar cada nueva línea. La mayor parte del programa es idéntico a los de las figuras 2.1 y 2.3. 1 / / F i g . 2.4 : Bienvenido3.java 2 / / Im prim ir va ria s lin e a s de texto con una sola in stru cció n . 3 4 p u b lic c la s s Bienvenido3 5 { 6 / / e l método main empieza la ejecución de la ap licació n en lava 7 p u b lic s t a t ic void m ain(S trin g [] args ) 8 { 9 S y ste m .o u t.p rin tln C "Bienvenidonanla programacionnen la v a !” ) ; 10 } / / fin del método main 11 } / / fin de la clase Bienvenido3 Bienvenido a la programación en Java! Fig. 2.4 | Impresión de varias líneas de texto con una sola instrucción. La línea 2 / / Im prim ir va ria s lin e a s de texto con una so la in stru cció n . es un comentario que describe el propósito de este programa. La línea4 comienza la declaración de la clase Bienvenido3. La línea 9 S y ste m .o u t.p rin tln C “ Bienvenidonanla programacionnen Ja v a !” ) ; muestracuatro líneasseparadas de texto en laventana de comandos. Por lo general, loscaracteres en una cadena se muestranjustocomo aparecen en lascomillas dobles. Sin embargo, observe que los dos carac­ teres y n (quese repiten tres veces en la instrucción) no aparecen en la pantalla. La barra diagonal in­ versa () se conocecomo carácterde escape, elcualtiene un significado especial paralosmétodos p ri nt y p ri n tl n de System . out. Cuando aparece una barra diagonal inversa en una cadena de caracteres,Java oombina elsiguiente carácter con la barra diagonal inversa para formar una secuencia de escape. Lase­ cuencia de escape n representa el carácter de nueva línea. Cuando aparece un carácter de nueva línea en una cadena que seva a imprimir con System . out, el carácter de nueva línea hace que el cursor de salida de la pantallase desplace alinicio de lasiguiente línea en laventana de comandos. En lafigura2.5 seenumeranvariassecuenciasdeescapecomunes,condescripcionesdecómo afectan la manera de mostrar caracteres en la ventana de comandos. Paraobtener una lista completa de secuen­ cias de escape,visite j ava. sun. com/docs/books/j 1s/thi rd_editi on/html/1 exical. html# 3 .1 0 .6 . www.FreeLibros.me
    • 46 Capítulo 2 Introducción a las aplicaciones en Java Secuencia de escape Descripción n Nueva línea. Coloca elcursorde la pantalla al inicio de lasiguiente línea. t Tabuladorhorizontal. Desplaza el cursorde la pantalla hasta la siguienteposición de tabulación. r Retomo de carro. Coloca el cursorde la pantalla al iniciode la línea actual; «¿avanza a la siguientelínea. Cualquiercarácterque se imprima despuésdel retomo decarro sobrescribe bs caracteres previamente impresosen esa línea. Barradiagonal inversa. Se usa para imprimir un carácterde barra diagonal inversa. ” Doblecomilla. Se usa para imprimirun carácter de doblecomilla. Por ejemplo, System,out.printl n( “”entre comillas”” ); displays “entre comilias". Fig. 2 .5 | Algunas secuencias de escape comunes. 2.4 Cómo mostrar texto con p ri n tf El método System .out .pri ntf (“f”significa “formato”) muestra datos con formato. La figura 2.6 usa estemétodo paramostrar las cadenas “Bienvenido a” y “la programación en Ja v a !” . Las líneas 9y 10 S y ste m .o u t.p rin tf( “ %sn%sn” , “Bienvenido a” , “ la programación en Ja v a !” ) ; llaman al método System .o u t. pri n tf para mostrar lasalida del programa. La llamada al método espe­ cifica tres argumentos. Cuando un método requiere varios argumentos, éstos se colocan en una lista separada por comas. Buena práctica de programación 2.6 Coloque un espaciodespuésde cada coma (,) en una lista de argumentospara que sus programasseanmáslegibles. 1 / / F i g . 2.6 : Bienvenido4.java 2 / / Im prim ir va ria s lin e a s con el método S y ste m .o u t.p rin tf. 3 4 public c la ss Bienvenido4 5 { 6 / / el método main empieza la ejecución de la ap licació n de Java 7 public s t a t ic void main( S trin g [] args ) 8 { 9 S yste m .o u t.p rin tf( “%sn%sn"t 10 “ Bienvenido a", “la programación en Java!" ) ; 11 } / / fin del método main 12 } / / fin de la clase Bienvenido4 Bienvenido a la programación en Java! Fig. 2.6 | Imprimir varias líneas de texto con el método System, out. p ri n tf. www.FreeLibros.me
    • 2.5 Otra aplicación en Java: suma de enteros 47 Las líneas 9 y 10 representan sólo una instrucción. Java permite dividir instrucciones extensas en varias líneas. Aplicamos sangría a la línea 10 para indicar que es la continuaciónde la línea 9. — Error común de programación 2.4 Dividir una instrucción a la mitadde un identificador o de una cadena esun error de sintaxis. Elprimerargumento delmétodo pri n tf esunacadena de formato que puedeconsistiren texto fijo y especificadores de formato,este método imprime el texto fijo de igual forma que pri nt o p ri ntl n. Cada especificador de formato es un receptáculo para un valor,y especificael tipo de datos a imprimir. Los especificadores de formato también pueden incluir información de formato opcional. Empiezan con un signo porcentual (%) y van seguidos de un carácter que representa el tipo de datos. Por ejemplo, elespecificador de formato %s es un receptáculo para una cadena. La cadena de for­ mato en la línea 9 especificaque pri n tf debe imprimirdos cadenas,y que a cada una de ellas le debe se­ guir un carácter de nueva línea. En laposición del primer especificador de formato, pri n tf sustituye el valordelprimerargumento despuésde lacadenadeformato. En cadaposición posterior delespecificador de formato, pri n tf sustituye el valor del siguiente argumento. Así, este ejemplo sustituye “Bienvenido a” por el primer %s y “la programación en Ja va !” por elsegundo %s. Lasalida muestra que se desplie­ gandos líneas de texto en pantalla. En nuestros ejemplos presentaremos las diversas características de formato a medida que se vayan necesitando. El apéndice G presenta los detalles de cómo dar formato a lasalida con pri ntf. 2.5 Otra aplicación en Java: suma de enteros Nuestra siguiente aplicación lee (o recibe como entrada) dos enteros (números completos, como —22, 7, 0 y 1024) que el usuario introduce mediante el teclado, después calcula lasuma de los valoresy mues­ tra el resultado. Este programa debe llevar la cuenta de los números que suministra el usuario para los cálculos que el programa realiza posteriormente. Los programas recuerdan números y otros datos en la memoria de lacomputadora, y acceden a ellos a través de unos elementos conocidos como variables. Elprograma delafigura2.7 demuestraestosconceptos. En lasalida deejemplo, usamostexto en negritas para identificar laentrada del usuario (por ejemplo, 45 y 72). 1 / / F i g . 2.7: Suma.java 2 / / Programa que muestra la suma de dos números. 3 im port j a v a .ú t i l . Scanner; / / el programa usa la clase Scanner 4 5 p u b lic c la s s Suma 6 { 7 / / el método main empieza la ejecución de la ap licació n en Java 8 public s t a t ic void main( S trin g [] args ) 9 { 10 / / crea objeto Scanner para obtener la entrada de la ventana de comandos 11 Scanner entrada = new ScannerC System .in ) ; 12 13 in t numerol; / / primer número a sumar 14 in t numero2; / / segundo número a sumar 15 in t suma; / / suma de numerol y numero2 16 Fig. 2 .7 | Programa que muestra la suma de dos números (parte I de 2). www.FreeLibros.me
    • 48 Capítulo 2 Introducción a las aplicaciones en Java 17 System .out.printC “Escrib a el primer entero: " ) ; / / indicador 18 numerol = e n tra d a .n e xtln tO ; / / lee el primer número del usuario 19 20 System .out.printC “Escrib a el segundo entero: ” ) ; // indicador 21 numero2 = e n tra d a .n e xtln tO ; / / lee el segundo número del usuario 22 23 suma = numerol + numero2; / / suma los números, después almacena el to ta l en suma 24 25 System.out .p ri n tf( “ La suma es %dn” , suma ) ; / / muestra la suma 26 } / / fin del método main 27 } / / fin de la clase Suma Escrib a el primer entero: 45 Escrib a el segundo entero: 72 La suma es 117 Fig. 2.7 | Programa que muestra la suma de dos números (parte 2 de 2). Declaraciones import Las líneas 1y 2 / / Fig . 2.7: Suma.java / / Programa que muestra la suma de dos números. indican el número de la figura, el nombre del archivo y el propósito del programa. Una gran fortaleza de Java es su extenso conjunto de clases predefinidas que podemos reutilizar, en vez de “reinventar la rueda”.Estas clases se agrupan en paquetes (grupos con nombre de clases rela­ cionadas) y se conocen en conjunto como la biblioteca de clases de Java, o Interfazde programación de aplicaciones de Java (API de Java). La línea 3 im port ja v a .ú t il.S c a n n e r ; / / el programa usa la clase Scanner esuna declaración importque ayudaalcompilador a localizar una clasequeseutiliza eneste programa. Indica que este ejemplo utiliza la clase Scanner predefinida deJava (que veremos en breve) del paquete java.útil. Error común de programación 2.5 Todaslasdeclaraciones importdebenaparecerantesde ladeclaracióndelaprimeraclase en elarchivo. Colocar una declaración import dentro del cuerpo de la declaración de unaclase, odespuésdeésta,esunerrordesintaxis. Tip para prevenir errores 2.8 Porlogeneral siolvidaincluir unadeclaración importpara unaclasequeutilice ensu programa,seproduceunerrordecompilaciónquecontieneunmensajecomoacannot find symbol Cuandoestoocurra,verifiquequehayaproporcionadolasdeclaraciones import apropiadasy quelosnombresenbismismasesténescritosenforma correcta,quesehayan usadolasletrasmayúsculasy minúsculascomosedebe. Declaración de la claseSuma La línea 5 public class Suma www.FreeLibros.me
    • 15 Otra aplicación en Java: suma de enteros 49 empieza ladeclaración de laclase Suma. El nombre dearchivo paraesta clase publi c debeser Suma.java. Recuerde queel cuerpo decada declaraciónde claseempiezacon una llaveizquierda deapertura (línea6) ytermina con una llavederecha de cierre (línea 27). La aplicación empiezaaejecutarse con el método main (líneas 8 a la 26). La llaveizquierda (línea 9) marcaelinicio del cuerpo de main, y lacorrespondiente llavederecha (línea 26) marca su final. Observe que al método main se le aplica un nivel de sangría en el cuerpo de la clase Suma,y que al código en el cuerpo de mainse leaplicaotro nivel para mejorar la legibilidad. Declaracióny creación de un objeto Scannerpara obtenerla entrada del usuario mediante elteclado Una variable es una ubicación en lamemoria de la computadora, en donde se puede guardar un valor para utilizarlo después en un programa. Todas las variables deben declararse con un nombre y un tipo antesde poder usarse. El nombre de ésta, que puede ser cualquier identificador válido, permite al pro­ gramaacceder al valor de lavariable en memoria. El tipo de una variable especifica la clase de informa­ ción que se guarda en esa ubicación de memoria. Al igual que las demás instrucciones, las instrucciones de declaración terminan con punto y coma (;). La línea 11 Scanner entrada = new Scanner( System .in ) ; es una instrucción de declaración de variable que especificael nombre (entrada) ytipo (Scanner) de una variable que se utiliza en este programa. Un objeto Scanner permite a un programa leer datos (por ejemplo: númerosycadenas) parausarlosen un programa. Losdatos puedenprovenirde muchas fuentes, como un archivo en disco o desde el teclado de un usuario. Antes de usar un objeto Scanner, hay que crearlo yespecificar elorigen de la información. Elsigno =en lalínea 11 indicaqueesnecesarioinidalizarlavariable entrada tipo Scanner (esdecir, hay que prepararla para usarla en el programa) en su declaración con el resultado de la expresión a la derecha del signo igual: new Scanner(System .in). Esta expresión usa la palabra clave new para crear un objeto Scanner que lee los datos escritos por el usuario mediante el teclado. El objeto de entrada estándar, System .in, permite a las aplicaciones de Java leer la información escrita por el usuario. Elobjeto Scanner traduceestos bytes en tipos (como int) que se pueden usar en un programa. Declaración de variablespara almacenar enteros Lasinstrucciones de declaración de variables en las líneas 13 a la 15 in t numerol; / / prim er número a sumar in t numero2; / / segundo número a sumar in t suma; / / suma de numerol y numero2 declaran que las variables numerol, numero2 y suma contienen datos de tipo int; estas variables pueden oontenervaloresenteros (númeroscompletos, como 72, -1127 y 0). Estasvariables no se han inicializado todavía. El rango de valores para un int es de -2,147,483,648 a +2,147,483,647 nota: bs valores int reales talvez no contengan comas]. Hay otros tipos de datos como flo a t y doubl e, para guardar números reales, y el tipo char, para guardardatos decaracteres. Los números realesson números quecontienen puntos decimales,como 3.4, 0 .0 y -11.19. Lasvariables de tipo char representan caracteres individuales,como una letraen mayúscu­ la (A), un dígito (7), un carácter especial (* o %)o una secuencia de escape (como el carácter de nueva línea, n). Los tipos tales como in t , flo a t, doubl e y char seconocencomo tipos prim itivos. Los nom­ bres de los tipos primitivos son palabras clavey deben aparecer completamente en minúsculas. El apén­ dice D sintetiza las características de los ocho tipos primitivos (boolean, byte, char, short, in t, long, flo a t y double). www.FreeLibros.me
    • 50 Capítulo 2 Introducción a las aplicaciones en Java Es posible declarar varias variables del mismo tipo en una sola declaración, en donde los nombres de las variables se separan por comas (es decir, una lista de nombres de variables separados por comas). Porejemplo, las líneas 13 a la 15 se puedenescribirtambién así: in t numerol, / / prim er número a sumar numero2, / / segundo número a sumar suma; / / suma de numerol y numero2 Buena práctica de programación 2.7 Declarecadavariableenunalineaseparada.Esteformatopermiteinsertaruncomentario descriptivoenseguidadecadadeclaración. Buena práctica de programación 2.8 Seleccionarnombresdevariablessignificativosayudaaqueunprogramaseautodocumente (esdecir,queseamásfácilentenderelprogramaconsóloleerlo,enlugardeleermanualeso verunnúmeroexcesivodecomentarios). Buena práctica de programación 2.9 Por convención, los identificadores de nombre de variables empiezan con una letra minúscula,y cadaunade laspalabrasenelnombre,quevandespuésdelaprimera,deben empezar con una mayúscula. Por ejemplo, elidentificador primerNumero tiene una N mayúsculaensusegundapalabra.Numero. Cómopedir la entrada al usuario La línea 17 System .out.printC "E s c rib a el prim er en tero : " ) ; / / in d icad o r utiliza System, out. p rin t paramostrar el mensaje “ Escrib a el prim er en tero:” . Este mensaje se co­ noce como indicador, ya que indicaal usuario que debe realizar una acción específica. En este ejemplo utilizamoselmétodo p ri nt envezde pri ntl n paraque laentrada del usuario aparezcaen lamisma línea que la del indicador. En la sección 2.2 vimos que, por lo general, los identificadores que empiezan con letras mayúsculas representan nombres declases. Porlo tanto, System esunaclase. Laclase System forma parte del paquete ja v a . lang. Cabe mencionar que la clase System no se importa con una declaración import al principio del programa. Observación de ingeniería de software 2. i Elpaquete java, langseimporta de manerapredeterminadaen todos losprogramasde Java,;porende, lasclasesenjava, langsonlosúnicasenlaAPIdeJavaque norequieren unadeclaración import. Cómo obtener un valor in t como entrada del usuario La línea 18 numerol = e n tra d a .n e xtln tO ; / / le e el prim er número del u su ario utiliza el método n e xtln t del objeto entrada de la clase Scanner para obtener un entero del usuario medianteel teclado. En estepunto, elprograma esperaa queel usuario escribael número yoprimaIntro paraenviar el número al programa. Nuestro programa asume que el usuario escribirá un valor de entero válido. De no ser así,se produ­ ciráun error lógico en tiempo deejecución yelprogramaterminará. Elcapítulo 11, Manejo deexcepcio­ nes: un análisis más detallado, hablasobrecómo hacersus programasmás robustos alpermitirles manejar dichos errores. Esto también se conocecomo hacer que su programa sea toleranteafallas. www.FreeLibros.me
    • 2.5 Otra aplicación en Java: suma de enteros 5 1 En la línea 18, colocamos el resultado de la llamada al método nextlnt (un valor i nt) en lavariable numerol mediante eluso deloperador de asignación, ■*.Lainstrucciónseleecomo “numerolobtiene el valorde entrada.nextlnt()”.Aloperador=sele llama operador binario, yaque tienedos operandos: numerolyelresultado delallamadaalmétodo entrada.nextlntO. Estainstrucciónse llamainstrucción deasignación,ya que asignaun valor aunavariable.Todo loqueestá a laderechadel operador de asigna­ ción (=)se evalúa siempreantesde realizar la asignación. Buena práctica de programación 2.10 Alcolocar espaciosen cualquier lado de un operador binario, mejora la legibilidaddel programa. Cómopedir e introducir un segundo int La línea 20 System .out.printC “ E s c rib a el segundo en tero : ” ) ; / / in d icad o r pide al usuario que escriba elsegundo entero. La línea 21 numero2 = entrada. n e x tln tO ; / / le e el segundo número del u su ario lee elsegundo entero y lo asigna a lavariable numero2. Usode variablesen un cálculo La línea 23 suma = numerol + numero2; / / suma lo s números, después almacena el to ta l en suma es una instrucción de asignación que calcula la suma de las variables numero l y numero2, y asigna el re­ sultado alavariable sumamedianteeluso del operador deasignación, =.Lainstrucciónseleecomo “suma obtienee1valor de numerol + numero2”. En general, los cálculos se realizan en instrucciones de asigna­ ción. Cuando el programa encuéntrala operación de suma, utilizalos valores almacenados en las varia­ bles numerol y numero2 para realizar el cálculo. En la instrucción anterior, el operador de suma es un operadorbinaria, susdosoperandos son las variables numero l y numero2. Las partesde las instrucciones que contienen cálculos se llaman expresiones. De hecho, una expresión es cualquier parte de una ins­ trucción que tiene un valorasociado. Porejemplo, el valorde laexpresión numerol + numero2 eszsuma de los números. De manerasimilar, el valor de la expresión entrada. n e xtln tO esel entero escrito por el usuario. Cómo mostrarelresultado delcálculo Unavez realizado el cálculo, la línea 25 S y ste m .o u t.p rin tf( “ La suma es %dn” , suma ) ; / / m uestra la suma utiliza el método System .o u t. pri n tf para mostrar la suma. Elespecificador de formato %des un recep­ táculo paraun valor i nt (en estecaso, elvalorde suma); laletra dse refierea “entero decimal”.Elresto de loscaracteresen lacadenade formato son texto fijo. Por lo tanto,elmétodo pri n tf imprime en pantalla “ La suma es” , seguidodelvalordes urna(en laposicióndelespecificadordeformato %d)yunanuevalínea. Tambiénesposible realizarcálculosdentro de instruccionespri n tf. Podríamos habercombinado las instrucciones de las líneas 23 y 25 en lasiguiente instrucción: S y s te m .o u t.p rin tf( "La suma es %dn” , ( numerol + numero2 ) ) ; www.FreeLibros.me
    • 52 Capítulo 2 Introducción a las aplicaciones en Java Losparéntesis alrededordelaexpresión numerol + numero2 noson requeridos; seincluyen paraenfatizar que elvalor de todalaexpresión seimprime en la posición del especificador de formato %d. Documentación de la API deJava Para cada nueva clase de la API de Java que utilicemos, hay que indicar el paquete en el que se ubica. Esta información nos ayuda a localizar las descripciones de cada paquete y clase en la documentación de laAPI deJava. Puede encontrar una versión basadaenWeb de esta documentación en download.oracle. com/j avase/6/docs/ap i/ También puede descargar esta documentación de www.oracle. com/techn etwo rk /j ava/j avase/downloads/i ndex. html El apéndice E muestracómo utilizaresta documentación. 2.6 Conceptos acerca de la memoria Losnombres devariablescomo numerol, numero2 y suma en realidad corresponden aciertas ubicaciones en la memoria de la computadora. Toda variable tiene un nombre, un tipo, un tamaño (en bytes) y un valor. En el programade suma de la figura 2.7, cuando se ejecuta lainstrucción (línea 18): numerol = e n tra d a .n e x tln tO ; / / le e el prim er número del u su ario el número escrito por el usuario se coloca en una ubicación de memoria que corresponde al nombre numerol. Suponga que el usuario escribe 45. La computadora coloca ese valor entero en la ubica­ ción numerol (figura 2.8) y sustituye alvalor anterior en esa ubicación (si había uno). El valor anterior se pierde. numerol 45 Fig. 2 .8 | Ubicación de memoria que muestra el nombre y el valor de la variable numerol. Cuando seejecuta la instrucción (línea 21) numero2 = e n tra d a .n e x tln tO ; / / le e el segundo número del u su ario suponga que el usuario escribe 72. La computadora coloca ese valor entero en la ubicación numero2. Lamemoria ahora aparececomo se muestra en lafigura 2.9. numerol 45 numero2 72 Fig. 2 .9 | Ubicaciones de memoria, después de almacenar valores para numerol y numero2. Unavez que el programa de la figura 2.7 obtiene valores para nume ro l y numero2, los suma y coloca eltotal en lavariable suma. La instrucción (línea 23) www.FreeLibros.me
    • 2.7 Aritmética 53 suma = numerol + numero2; // suma lo s números, después almacena e l to ta l en suma realiza la suma y después sustituye el valor anterior de suma. Una vez que se calcula suma, la memoria aparece como semuestra en lafigura 2.10. Observe que losvalores de numeroly numero2 aparecen exac­ tamente como antes de usarlos en el cálculo de suma. Estos valores se utilizaron, pero no sedestruyeron, cuando lacomputadorarealizó elcálculo. Porende, cuando seleeun valorde una ubicación de memoria, elproceso es no destructivo. numerol 45 numero2 72 suma 117 Fig. 2 .1 0 | Ubicaciones de memoria, después de almacenar la suma de numerol y numero2. 2.7 Aritmética La mayoría de los programas realizan cálculos aritméticos. Los operadores aritméticos se sintetizan en la figura 2.11. Observe el uso de variossímbolos especiales que no seutilizan en álgebra. Elasteris­ co (*) indica la multiplicación, y el signo de porcentaje (%) es el operador residuo, el cual descri­ biremos en breve. Los operadores aritméticos en la figura 2.11 son operadores binarios, ya que fun­ cionan con ¿iosoperandos. Por ejemplo, la expresión f + 7 contiene el operador binario +y los dos operandos f y 7. Operación en Java Operador Expresión algebraica Expresión en Java Suma + M f + 7 Resta - p -c p - c Multiplicación * brn b * m División / x ly o — o x 'ly y x / y Residuo % rmod s r % s Fig. 2.11 | Operadores aritméticos. La división de enteros produce un cociente entero. Por ejemplo, laexpresión 7 / 4 da como resul­ tado 1,ylaexpresión 17 / 5dacomo resultado 3.Cualquierparte fraccionariaen unadivisióndeenteros simplemente se eiescarta(se trunca); no ocurre un redondeo. Javaproporciona el operador residuo, %,el cual produce elresiduo después de ladivisión. Laexpresión x %yproduce elresiduo después de que xse divide entre y. Por lo tanto, 7 % 4 produce 3, y 17 % 5produce 2. Este operador se utiliza más común­ menteconoperandosenteros, pero tambiénpuede usarseconotros tipos aritméticos. En losejerciciosde estecapítulo y de capítulos posteriores, consideramos muchas aplicaciones interesantes del operador re­ siduo,como determinarsi un número es múltiplo deotro. www.FreeLibros.me
    • 54 Capítulo 2 Introducción a las aplicaciones en Java Expresionesaritméticasenformato de línea recta Las expresiones aritméticas enJavadeben escribirse en formato de línea recta para facilitar laescritura de programas en la computadora. Por lo tanto, las expresiones como “a dividida entre b” deben escri­ birse como a/b, de maneraque todas las constantes, variables yoperadores aparezcan en una línea recta. Lasiguiente notación algebraicapor lo general no es aceptable para los compiladores: a J Paréntesispara agruparsubexpresiones Losparéntesisseutilizan para agrupartérminos en lasexpresionesenJava,de lamisma maneraqueen las expresiones algebraicas. Por ejemplo, para multiplicar apor lacantidad b + c,escribimos a * ( b + c ) Si una expresión contiene paréntesis anidados, como ( ( a + b ) * c ) seevalúa primero laexpresión en el conjunto más interno de paréntesis (a + ben este caso). Reglasdeprecedencia de operadores Java aplica los operadores en expresiones aritméticas en una secuencia precisa, determinada por las si­ guientes reglas de precedencia de operadores, que casi siempre son las mismas que las que se utilizan en álgebra: 1. Las operacionesde multiplicación, divisiónyresiduo se aplican primero. Si una expresión con­ tienevariasde esasoperaciones, losoperadoresseaplicande izquierdaaderecha. Losoperadores de multiplicación,división y residuo tienen el mismo nivel de precedencia. 2. Las operaciones de suma y resta se aplican a continuación. Si una expresión contiene varias de esas operaciones, los operadores se aplican de izquierda a derecha. Los operadores de suma y restatienen el mismo nivel de precedencia. Estas reglas permiten a Java aplicar los operadores en el orden correcto.1Cuando decimos que los operadores se aplican de izquierda a derecha, nos referimos a su asociatividad. Algunos se asocian de derecha a izquierda. La figura 2.12 sintetiza estas reglas de precedencia de operadores. En elapéndiceA se presenta una tabla de precedencias completa. Operador(es) Operación(es) Orden de evaluación (precedencia) * Multiplicación Seevalúan primero. Si hayvariosoperadores deeste / División tipo, seevalúan de izquierdaa derecha. % Residuo + Suma Seevalúan después. Sihayvariosoperadoresde este tipo, - Resta seevalúan de izquierda a derecha. = Asignación Seevalúaal último. Fig. 2.12 | Precedenciade losoperadoresaritméticos. 1 Utilizamosejemplossimplesparaexplicarelordendeevaluaciónde lasexpresiones. Seproducen ligeroserroresen lasex­ presionesmáscomplejasqueveremosmásadelanteenellibro.Paraobtener másinformaciónsobreelordendeevaluación, veaelcapítulo 15de Thejav¿z™LanguageSpecification(java.sun. com/docs/books/jls/). www.FreeLibros.me
    • 2.7 Aritmética 55 Ejemplosde expresionesalgebraicasy dejava Ahora consideremos varias expresiones en vista de las reglas de precedencia de operadores. Cada ejem­ plo enlista una expresión algebraica y su equivalente en Java. El siguiente es un ejemplo de una media (promedio) aritmética de cinco términos: a+b+c+d+e m = ( a + b + c + d + e ) / 5 ; Losparéntesissonobligatorios, yaque ladivisión tiene una mayor precedenciaque lasuma. Lacantidad completa (a + b + c + d + e) vaa dividirse entre 5. Si por error se omiten los paréntesis, obtenemos a + b + c + d + e / 5, lo cual da como resultado a + b + c+d + y E1siguiente es un ejemplo de una ecuación de línea recta: Algebra: y = tnx + b Java: y = m * x + b; No se requieren paréntesis. El operador de multiplicación se aplica primero, ya que la multiplicación tiene mayor precedencia sobre lasuma. La asignación ocurre al último, yaque tiene menor precedencia que la multiplicación o suma. Elsiguiente ejemplo contiene lasoperaciones residuo (%),multiplicación,división, suma y resta: Algebra: z =pr%q +w/x- y Java: z = p * r X q + w / x - y; 6 1 2 4 3 5 Los números dentro de los círculos bajo lainstrucción indican elorden en el queJavaaplica los opera­ dores. Lasoperaciones *,%y/ seevalúanprimero,enorden deizquierdaaderecha (esdecir,seasocian de izquierda a derecha), ya que tienen mayor precedencia que + y -. Las operaciones + y - se evalúan a continuación. Estasoperaciones tambiénseaplicande izquierdaaderecha. Eloperador deasignación (=) seevalúaal último. Evaluación de unpolinomio de segundogrado Para desarrollar una mejor comprensión de las reglas de precedencia de operadores, considere laevalua­ ción de unaexpresión de asignación que incluye un polinomio de segundo grado ax1+bx +c. y = a * x * x + b * x + c ; 6 1 2 4 3 5 Lasoperacionesde multiplicaciónseevalúanprimero enorden deizquierdaaderecha(esdecir,seasocian de izquierda a derecha), ya que tienen mayor precedencia que la suma (como Java no tiene operador aritmético para laexponenciación, x2se representa como x * x. La sección 5.4 muestra una alternativa pararealizarlaexponenciación). Acontinuaciónse evalúanlasoperaciones de suma,de izquierda adere­ cha. Suponga que a, b, c y xse inicializan (reciben valores) como sigue: a = 2 , b = 3, c = 7yx = 5. La figura 2.13 muestra el orden en el que se aplican los operadores. Álgebra: Java: www.FreeLibros.me
    • 56 Capítulo 2 Introducción a las aplicaciones en Java ftjso /. y = 2 * 5 * 5 + 3 * 5 + 7; (Multiplicación de mása la izquierda) 2 * 5 es 10 1 10 * 5 + 3 * 5 + 10 * 5 es 50 1 * 50 + 3 * 5 + 7; 3 * 5 es 15 1 r 50 + 15 + 7; 50 + 15 es 65 1 *65 + 7; 65 + 7 es 72 1 (Multiplicación antes de la suma) (Sumade más a la izquierda) (Última suma) f foso 6. y = 72 (Última operación: colocar 72 en y) Fig. 2.13 | Orden en elcual seevalúa un polinomiode segundogrado. Podemos usar paréntesis redundantes (paréntesis innecesarios) para hacer que una expresión sea más clara. Por ejemplo, la instrucción de asignación anterior podría colocarse entre paréntesis, de la siguiente manera: y = ( a * x * x ) + ( b * x ) + c; 2.8 Toma de decisiones: operadores de igualdad y relaciónales Una condición es una expresión que puede ser verdadera (true) o falsa (fal se). Esta sección pre­ senta la instrucción if de Java, la cual permite que un programa tome una decisión, con base en el valor de una condición. Por ejemplo, la condición “calificación es mayor o igual que 60” determina si un estudiante pasó o no una prueba. Si lacondición en una instrucción if es verdadera, el cuerpo de la instrucción if se ejecuta. Si la condición es falsa, el cuerpo no se ejecuta. Veremos un ejemplo en breve. Las condiciones en las instrucciones i f pueden formarse utilizando los operadores de igualdad (== y !=) y los operadores relaciónales (>, <, >= y <=) que se sintetizan en la figura 2.14. Ambos operadores de igualdad tienen el mismo nivel de precedencia, que es menor que la precedencia de bs operadores relaciónales. Los operadores de igualdad se asocian de izquierda a derecha. Todos los operadores relaciónales tienen el mismo nivel de precedencia y también se asocian de izquierda a derecha. En la figura 2.15 se utilizan seis instrucciones if para comparar dos enteros introducidos por el usuario. Si la condición en cualquiera de estas instrucciones i f es verdadera, se ejecuta la instruc­ ción asociada con esa instrucción i f; en caso contrario, se omite la instrucción. Utilizamos un objeto Scanner para recibir los dos enteros del usuario y almacenarlos en las variables numerol y numero2. Después, el programa compara los números y muestra los resultados de las comparaciones que son verdaderas. www.FreeLibros.me
    • 2.8 Toma de decisiones: operadores de igualdad y relaciónales 57 Operador estándar algebraico de igualdad o relacional Operador de igualdad o relacional de Java Ejemplo de condición en Java Significado de la condición en Java Operadoresde igualdad 8S x = y xes igual que y * Operadoresrelaciónales != x !—y x no esigual que y > > x > y xesmayor quey < < x < y xesmenor que y >= x >= y xesmayoro igual que y £ <= x <= y xesmenor o igual que y Fig. 2.14 | Operadores de igualdad y relaciónales. 1 / / F i g . 2.15: Comparación.java 2 / / Compara enteros u tiliza n d o instrucciones i f , operadores relació nales 3 / / y de igualdad. 4 import ja v a .u ti 1 .Scanner; // el programa u t iliz a la clase Scanner 5 6 p u b lic c la s s Comparación 7 { 8 / / el método main empieza la ejecución de la ap licació n en lava 9 p u b lic s t a t ic void m ain( S tr in g [] args ) 10 { 11 / / crea objeto Scanner para obtener la entrada de la ventana de comandos 12 Scanner entrada = new Scanner( System .in ) ; 13 14 in t num erol; / / primer número a comparar 15 in t numero2; / / segundo número a comparar 16 17 Syste m .o u t.p rin tC “Escrib a el primer entero: ” ) ; / / indicador 18 numerol = e n tra d a .n e x tln tO ; / / lee el primer número del usuario 19 20 S yste m .o u t.p rin tC "Escrib a el segundo entero: ” ) ; // indicador 21 numero2 = e n tra d a .n e x tln tO ; / / lee el segundo número del usuario 22 23 i f C numerol — numero2 ) 24 System, o u t. p ri n tf C “%d = %dn” f numerol, numero2 ) ; 25 26 i f C numerol != numero2 ) 27 S y s te m .o u t.p rin tfC “%d != %dn", numerol, numero2 ) ; 28 29 i f C numerol < numero2 ) 30 S y s te m .o u t.p rin tfC “%d < 96dn", num erol, numero2 ) ; 31 Fig. 2 .15 | Comparación de enteros mediante instrucciones i f. operadores de igualdad y relaciónales (parte I de 2). www.FreeLibros.me
    • 58 Capítulo 2 Introducción a las aplicaciones en Java 32 i f ( numerol > numero2 ) 33 S yste m .o u t.p rin tf( “%d > %dn” , numerol, 34 35 i f ( numerol <= numero2 ) 36 S yste m .o u t.p rin tf( "%d <= %dn” , numerol, 37 38 i f ( numerol >= numero2 ) 39 System, out. pri n tf ( “%d >= %dn” , numerol, 40 } / / f in del método main 41 } / / f in de la c la s e Comparación numero2 ) ; numero2 ) ; numero2 ) ; Escrib a el primer entero: 777 Escrib a el segundo entero: 777 777 = 777 777 <= 777 777 >= 777 Escrib a el primer entero: 1000 Escrib a el segundo entero: 2000 1000 1= 2000 1000 <2000 1000 <= 2000 Escrib a el primer entero: 2000 Escrib a el segundo entero: 1000 2000 != 1000 2000 > 1000 2000 >= 1000 Fig. 2.15 | Comparación de enteros mediante instrucciones i f, operadores de igualdad y relaciónales (parte 2 de 2). Ladeclaración de laclaseComparad oncomienza en la línea 6 p ublic class Comparación Elmétodo mainde laclase (líneas 9 a 40) empieza laejecución del programa. La línea 12 Scanner entrada = new Scanner( System .in ) ; declara la variable entrada de la clase Scanner y le asigna un objeto Scanner que recibe datos de la en­ trada estándar (es decir, el teclado). Las líneas 14 y 15 in t numerol; / / prim er número a comparar in t numero2; / / segundo número a comparar declaran lasvariables i nt que se utilizan para almacenar los valores introducidos por el usuario. Las líneas 17-18 S yste m .o u t.p rin tC “ E s c rib a e l prim er en tero : ” ) ; / / in d icad o r numerol = e n tra d a .n e x tln tO ; / / le e el prim er número del u su ario piden al usuario que introduzca elprimer entero y el valor, respectivamente. Elvalor de entrada se alma­ cenaen lavariable numerol. www.FreeLibros.me
    • 2.8 Toma de decisiones: operadores de igualdad y relaciónales 59 Las líneas 20-21 Syste m .o u t.p rin tC “ E s c rib a e l segundo en tero : ” ) ; / / in d icad o r numero2 = e n tra d a .n e x tln tO ; / / le e el segundo número del u su ario piden al usuario que introduzca el segundo entero y el valor, respectivamente. El valor de entrada se al­ macena en lavariable numero2. Las líneas 23-24 i f ( numerol = numero2 ) S yste m .o u t.p rin tf( “%d = %dn” , numerol, numero2 ) ; declaran una instrucción i f quecomparalosvaloresde lasvariables numerol ynumero2,paradeterminar sison iguales o no. Una instrucción i f siempre empiezacon la palabra clave i f, seguida de una condi­ ción entre paréntesis. Una instrucción i f espera una instrucción en su cuerpo, pero puede contener varias instrucciones si se encierran entre un conjunto de llaves ({}). La sangría de la instrucción del cuerpo que se muestra aquí no es obligatoria, pero mejora la legibilidad del programa al enfatizar que la instrucción en la línea 24formaparte de la instrucción i f que empieza en la línea 23. La línea 24 sólo se ejecuta si los números almacenados en las variables numerol y numero2 son iguales (es decir, si lacondición es verdadera). Las instrucciones i f en las líneas 26-27,29-30, 32-33, 35-36 y 38-39 com­ paran a numerol y numero2 con los operadores !=, <, >, <= y >=, respectivamente. Si la condición en unao más de las instrucciones if es verdadera, se ejecuta la instrucción del cuerpo correspondiente. Error común de programación 2.6 Confundireloperadordeigualdad(==)coneldeasignación (=)puedeproducir unerror lógicoodesintaxis.Eloperadordeigualdaddebeleersecomo“esigualque”,yeldeasignación como *'obtiene”u “obtiene elvalor de”. Paraevitar confusión, algunaspersonas leen el operadordeigualdadcomo “dobleigual”o “igualigual”. Buena práctica de programación 2.11 Alcolocarsólounainstrucciónporlineaenunprograma, mejorasulegibilidad. No hay punto y coma (;) al final de la primera línea de cada instrucción if ,ya que produciría un error lógico en tiempo de ejecución. Por ejemplo, i f ( numerol = numero2 ) ; / / e rro r ló g ico S yste m .o u t.p rin tf( “%d = %dn” , numerol, numero2 ) ; sería interpretada porJavade lasiguiente manera: i f C numerol = numero2 ) ; / / in s tru c c ió n v a c ía S y ste m .o u t.p rin tf( “%d = 96dnMf numerol, numero2 ) ; en donde el punto y coma que aparece por sí solo en una línea (que se conoce como instrucción vacía) es la instrucción que se va a ejecutar si la condición en la instrucción i f es verdadera. Al ejecutarse la instrucción vacía, no se lleva acabo ninguna tarea. Después el programa continúa con la instrucción de salida, que siempre se ejecuta, sin importar que lacondición sea verdadera o falsa, ya que la instrucción de salida no forma parte de la instrucción i f . . Error común de programación 2.7 Colocarunpuntoy comainmediatamentedespuésdelparéntesisderechodelacondiciónen unainstrucción ifes,porlogeneral, unerrorlógico. www.FreeLibros.me
    • 60 Capítulo 2 Introducción a las aplicaciones en Java Observe el uso del espacio en blanco en la figura 2.15. Recuerde que el compilador casi siempre ignora loscaracteresdeespacio en blanco. Porlo tanto, lasinstrucciones pueden dividirseen varias líneas y espaciarse de acuerdo a las preferencias del programador, sin afectar el significado de un programa. Es incorrecto dividir identificadores y cadenas. Lo ideal es que las instrucciones se mantengan lo más reducidas posible,pero, no siempre se puede hacer esto. Tip para prevenir errores 2.9 Una instrucción largapuede esparcirse en varias lineas. Si una sola instrucción debe dividirseentrevariaslineas,lospuntosqueelijaparahacerladivisióndebentenersentido, comodespuésdeunacomaenunalistaseparadaporcomas,odespuésdeunoperadorenuna expresiónlarga.SiunainstrucciónsedivideentredosomásUneos,apliquesangríaatodas laslineassubsecuenteshastaelfinaldelainstrucción. La figura 2.16 muestra los operadores que hemos visto hasta ahora, en orden decreciente de prece­ dencia. Todos, con laexcepción del operador de asignación, =,seasocian de izquierda aderecha. Elope­ rador de asignación, =,asociade derecha aizquierda, por lo que una expresión como x = y = 0se evalúa como sisehubieraescrito así: x = (y = 0),en donde primero seasigna elvalor0a lavariabley, ydespués se asigna elresultado de esa asignación, 0, ax. Buena práctica de programación 2.12 Cuando escribaexpresionesque contengan muchos operadores, consulte la tabla depre­ cedenciadeoperadores(apéndiceA). Confirmequelasoperacionesenlaexpresiónserea­ licenenelordenque ustedespera. Si noestáseguroacercadelordendeevaluaciónen una expresióncompleja, utiliceparéntesisparaforzarelorden,enlamismaformaqueloharía conlasexpresionesalgebraicas. Operadores / Asociatividad izquierda a derecha izquierda a derecha izquierda a derecha izquierda a derecha derecha a izquierda multiplicativa suma relacional igualdad asignación Fig. 2.16 | Precedencia y asociatividad de los operadores descritos hasta ahora. 2.9 Conclusión Enestecapítulo aprendió acercade muchas características importantes deJava,como mostrardatos en la pantalla en un Símbolo delsistema, introducir datos por medio del teclado, realizar cálculos y tomar de­ cisiones. A través de las aplicaciones quevimos en este capítulo, le presentamos los conceptos básicos de programación. Como veremosenelcapítulo 3, por logenerallasaplicacionesdeJavacontienensólo unas cuantas líneasdecódigo en elmétodo main:casisiempreestas instruccionescrean losobjetos que realizan eltrabajo de laaplicación. En elcapítulo 3 aprenderáa implementarsuspropias clasesy ausarobjetos de éstas en las aplicaciones. Resumen Sección 2.2 Suprimerprograma enJava: imprimiruna línea de texto • Una aplicación de Java (pág. 38) se ejecuta cuando utilizamos el comando java para iniciar la JVM. www.FreeLibros.me
    • Resumen 61 • Loscomentarios (pág.39) documentan losprogramasymejoransu legibilidad. Elcompiladorlosignora. • Un comentario que empieza con // se llama comentario de fin de línea; termina al final de la línea en la queaparece. • Loscomentarios tradicionales (pág.39) sepuedendistribuirenvariaslíneas;estándelimitados por/* y*/. • Loscomentarios3avadoc (pág.39) sedelimitan por/** y*/; nospermiten incrustarladocumentación delos programasenelcódigo. Laherramienta javadoc generapáginasen HTMLcon baseen estoscomentarios. • Un errordesintaxis (pág. 39; también conocido como errordecompilador, erroren tiempo decompilación oerrordecompilación) ocurrecuando elcompiladorencuentra código queviolalasreglasdel lenguajeJava. Essimilaraun errorgramatical en un lenguajenatural. • Las líneasen blanco, losespaciosylosfabuladoresseconocen comoespacioenblanco (pág. 39). Éstemejora lalegibilidadde losprogramas;elcompiladorloignora. • Las palabras clave (pág. 40) están reservadas para el uso exclusivo de Java, y siempre seescriben con letras minúsculas. • Lapalabraclave elas s (pág. 40) introduceunadeclaracióndeclase. • Porconvención, todos losnombresdelasclasesenJavaempiezan con una letramayúscula, yla primera letra decadapalabrasubsiguientetambién seescribeenmayúscula (comoNombreClaseDeEjemplo). • ElnombredeunaclasedeJavaesun identificador unaseriedecaracteresformadapor letras,dígitos,guiones bajos (_)ysignosdedólar ($), quenoempiezacon un dígitoynocontieneespacios. • Javaessensibleamayúsculas/minúsculas (pág.40);esdecir, lasletrasmayúsculasyminúsculassondistintas. • Elcuerpodetodaslasdeclaracionesdeclases(pág. 40)debeestardelimitadopor llaves, {y>. • Ladeclaración deunaclase publi c(pág.40) debeguardarseenun archivo conelmismonombrequelaclase, seguidodelaextensión denombre dearchivo *.java”. • Elmétodomain (pág.41)eselpunto deiniciodetodaaplicaciónenJava,ydebeempezarcon: public static void main( String[] args ) encasocontrario, laJVM noejecutarálaaplicación. • Los métodos pueden realizar tareas y devolver información cuando las completan. La palabra clave void (pág.41) indicaqueun método realizaráuna tarea, peronodevolveráinformación. • Lasinstruccionesinstruyenalacomputadora paraque realiceacciones. • Porlo general, a una cadena (pág. 41) entrecomillas dobles se leconoce como cadenade caracteres, literal decadena. • Elobjetodesalidaestándar (System .out; pág.41)muestracaracteresenlaventanadecomandos. • El método System, out. printl n (pág. 41) muestra suargumento (pág. 41) en laventana de comandos, se­ guidode un carácterdenuevalíneaparacolocarelcursordesalidaeneliniciode lasiguientelínea. • Paracompilarun programaseutilizaelcomando javac. Sielprogramanocontieneerroresdesintaxis,secrea unarchivodeclase(pág.43)quecontieneloscódigosde bytesdeJavaquerepresentanalaaplicación. LaJVM interpretaestoscódigosdebytescuando ejecutamosel programa. • Para ejecutar una aplicación, escriba la palabra java (pág. 38) seguida del nombre de la clase que contiene amain. Sección 2.3 Modificación de nuestroprimerprograma enJava • System.out.print (pág. 44) muestra suargumento en pantalla ycolocael cursordesalidajusto despuésdel últimocaráctervisualizado. • Una barra diagonal inversa () en una cadena es un carácter de escape (pág. 45). Java locombina con el si­ guientecarácterparaformarunasecuenciadeescape(pág. 45). Lasecuencia deescapen (pág. 45) representa elcarácterdenuevalínea. Sección 2.4 Cómo mostrar texto conp rin t f • Elmétodo System.out. pri ntf (pág.46; f serefierea“formato”)muestradatoscon formato. www.FreeLibros.me
    • 62 Capítulo 2 Introducción a las aplicaciones en Java • El primerargumento del método pri ntf esuna cadena de formato (pág. 47) quecontiene texto fijoy/o es- pecificadoresde formato. Cada especificadorde formato (pág. 47) indica el tipo dedatosa imprimiryesun receptáculoparaelargumento correspondientequeaparecedespuésdelacadenadeformato. • Losespecificadoresdeformatoempiezancon un signoporcentual (&),yvanseguidosdeun carácterque repre­ sentaeltipo dedatos.Elespecificadordeformato %s(pág. 47)esun receptáculoparaunacadena. Sección 2.5 Otra aplicación enJava: suma de enteros • Una declaración import (pág. 48)ayudaalcompiladoralocalizaruna clasequeseutilizaenun programa. • El extenso conjunto declasespredefinidasdeJava seagrupan en paquetes (pág. 48) denominadosgrupos de clases. A éstos se les conoce como la biblioteca de clases de Java (pág. 48), o la Interfaz de programación deaplicacionesdeJava(APIdeJava). • Una variable (pág. 49) es una ubicación en la memoria de la computadora, en la cual se puede guardar un valorparausarlomásadelanteenun programa.Todaslasvariablesdebendeclararsecon unnombreyun tipo parapoderutilizarlas. • Elnombre deuna variablepermitealprogramaaccederasuvaloren memoria. • Un objeto Scanner (paquetejava, útil; pág. 49) permiteaun programa leerdatosparausarlosenéste.Antes de usarun objeto Scanner, el programa debecrearloyespecificarelorigen delosdatos. • Lasvariablesdeben inicializarse (pág.49) para poderusarlasen un programa. • Laexpresiónnew Scanner (System.in) creaunobjetoScanner queleedatosdesdeelobjetodeentradaestándar (System, i n; pág.49); por logenerales elteclado. • Eltipodedatosi nt (pág.49)seutilizaparadeclararvariablesqueguardaránvaloresenteros.Elrangodevalo­ resparaun int esde-2,147,483,648a +2,147,483,647. • Lostipos floatydouble (pág.49)especificannúmerosrealescon puntosdecimales, como 3.4 y-11.19. • Las variables de tipo char (pág. 49) representan caraaeres individuales, como una letra mayúscula (por ejemplo, A), un dígito (por ejemplo, 7), un carácter especial (porejemplo, *o %)o una secuencia de escape (porejemplo,elcarácterdenuevalínea, n). • Lostiposcomo i nt, float, double y char son tipos primitivos (pág.49). Losnombresde lostiposprimitivos sonpalabrasclave;porende,debenaparecerescritossólocon letrasminúsculas. • Un indicador (pág. 50) pide al usuario que realice una acción específica. • Elmétodo nextlnt de Scanner obtiene un entero para usarloen un programa. • El operador deasignación, - (pág. 51), permiteal programa dar un valora una variable. Sellama operador binario (pág. 51),yaque tienedosoperandos. • Laspartesdelasinstruccionesquetienenvaloressellamanexpresiones(pág. 51). • Elespecificadordeformato%d(pág. 51)esun receptáculoparaun valori nt. Sección 2.6 Conceptosacerca de la memoria • Los nombres de lasvariables (pág. 52) corresponden a ubicacionesen la memoria de lacomputadora. Cada variabletieneun nombre, un tipo, un tamañoyun valor. • Un valor que se coloca en una ubicación de memoria sustituye al valor anterior en esa ubicación, el cual sepierde. Sección 2.7Aritmetica • Losoperadoresaritméticos(pág. 53)son+(suma),- (resta), *(multiplicación), / (división)y%(residuo). • Ladivisióndeenteros(pág. 53)produceun cocienteentero. • Eloperador residuo,%(pág. 53), produceelresiduodespuésdeladivisión. • Las expresiones aritméticas deben escribirse en formato de línea recta (pág. 54). • Si una expresión contiene paréntesis anidados (pág. 54), el conjunto de paréntesis más interno se evalúa primero. www.FreeLibros.me
    • Ejerciciosde autoevaluación 63 • Java aplica los operadores en las expresiones aritméticas en una secuencia precisa, la cual se determina me­ diante lasreglas de precedenciade losoperadores (pág. 54). • Cuando decimos que los operadores se aplican de izquierda a derecha, nos referimos a su asociatividad (pág. 54).Algunosoperadoresseasocian de derechaa izquierda. • Losparéntesis redundantes (pág. 56) pueden hacerqueuna expresión sea más clara. Sección 2.8 Tonta de decisiones: operadoresde igualdady relaciónales • La instrucción if (pág. 56) toma una decisión con base en elvalorde esacondición (verdaderoo falso). • Las condiciones en las instrucciones if se pueden forman mediante el uso de los operadores de igualdad (—y !-) yrelaciónales (>, <,>- y<-) (pág. 56). • Una instrucción if empieza con la palabra clave if seguida de una condición entre paréntesis, y espera una instrucción en sucuerpo. • La instrucción vada (pág. 59) esuna instrucción que no realiza una tarea. Ejercicios de autoevaluación 2.1 Complete lassiguientesoraciones: a) Elcuerpo de cualquiermétodo comienzacon un(a)________ y termina con un(a)_________ b) La instrucción________ seutiliza para tomar decisiones. c) ________indica el inicio de un comentario defin de línea. d) ________,_________y_________seconocen como espacio en blanco. e) Las________ están reservadaspara su usoen Java. f) LasaplicacionesenJavacomienzan su ejecución en el método_________ g) Losmétodos________ ,________ y_________muestran información en una ventana decomandos. 2.2 Indiquesicada una de las siguientesinstrucciones es verdaderaofalsa.Siesfalsa,explique por qué. a) Loscomentarios hacen quelacomputadora imprima el texto quevadespuésde loscaracteres/ / en la pantalla, al ejecutarseel programa. b) Todas lasvariablesdeben recibirun tipo cuando sedeclaran. c) Javaconsideraque lasvariables numeroy NuMeRoson idénticas. d) Eloperador residuo (%)puede utilizarsesolamente con operandosenteros. e) Losoperadoresaritméticos *, /, %,+y- tienen todos el mismo nivel de precedencia. 2.3 Escriba instrucciones para realizarcada una de lassiguientestareas: a) Declararlasvariables c, estaEsUnaVariable, q76354 y numero como de tipo int. b) Pediral usuario que introduzca un entero. c) Recibir un entero como entrada y asignar el resultado a la variable i nt valor. Suponga que se puede utilizar lavariable ent rada tipo Scanner para recibirun valordel teclado. d) Imprimir "Este es un programa en Java” en una línea de la ventana de comandos.Use el método System.out .pri ntl n. e) Imprimir "Este es un programa en 3ava” en dos líneas de la ventana de comandos. La primera línea debe terminarcon es un. Useel método System.out.println. f) Imprimir "Este es un programa en lava” en dos líneas de la ventana de comandos.La primera línea debeterminar con es un. Useel método System,out. pri ntf ydos especificadoresdeformato %s. g) Si lavariable numero no es igual que 7, mostrar “La variable numero no es igual que 7”. 2.4 Identifiquey corrijaloserroresen cada una de lassiguientesinstrucciones: a) if ( c < 7 ); System.out.printlnC “c es menor que 7” ); b) if ( c -> 7 ) System.out.printlnC “c es igual o mayor que 7” ); www.FreeLibros.me
    • 64 Capítulo 2 Introducción a las aplicaciones en Java 2.5 Escriba declaraciones, instruccioneso comentarios para realizarcada una de lassiguientestareas: a) Indicar que un programa calculará elproducto de tres enteros. b) Crear un objeto Scannerllamado entrada que leavalores delaentrada estándar. c) Declararlasvariablesx, y, zy resu1tado de tipo i nt. d) Pediral usuario queescribael primerentero. e) Leerel primerentero del usuario yalmacenarlo en lavariablex. f) Pediral usuario queescribael segundo entero. g) Leerelsegundo entero del usuarioyalmacenarlo en la variable y. h) Pediral usuario queescribael tercerentero. i) Leerel tercerentero del usuarioyalmacenarlo en lavariable z. j) Calcularel producto de los tres enteros contenidos en las variables x, yyz,y asignarel resultado a la variable resultado. k) Mostrar el mensaje "El producto es ”,seguido delvalordelavariable resultado. 2.6 Utilicelasinstrucciones queescribió en elejercicio2.5 para escribirun programa completo que calculeeimprima el producto de tres enteros. Respuestas a los ejercicios de autoevaluación 2.1 a) llave izquierda ({), llave derecha (}). b) if. c)//. d) Caracteres de espacio, caracteres de nuevalínea y fa­ buladores. e) Palabras clave, g) System,out. print, System,out. pri ntln y System.out.printf. 2.2 a) Falso. Los comentarios no producen ninguna acción cuando el programa se ejecuta. Se utilizan para docu­ mentar programas ymejorarsu legibilidad. b) Verdadero. c) Falso.Javaes sensiblea mayúsculas yminúsculas, por loque estasvariablesson distintas. d) Falso. Eloperadorresiduo puede utilizarsetambién con operandos no enterosen Java. e) Falso. Los operadores *,/y%tienen mayorprecedenciaque losoperadores +y -. 2.3 a) int c, estaEsUnaVariable, q76354, numero; o int c; int estaEsUnaVariable; int q76354; int numero; b) System.out.printC "Escriba un entero” ); c) valor - entrada, nextlnt O; d) System.out.printlnC "Este es un programa en Java" ); e) System.out.printlnC "Este es unn programa en Java” ); 0 System.out.printfC "XsXsn", “Este es un", “programa en 3ava” ); g) if Cnumero I- 7 ) System.out.printlnC "La variable numero no es igual que 7" ); 2.4 a) Error. Hay un punto y coma después del paréntesis derecho de la condición (c < 7) en la instrucción if. Corrección: Quite el punto y coma que va después del paréntesis derecho. [Nota: como resultado, la instrucción de salida seejecutará,sinimportar que lacondición en la instrucción if seaverdadera]. b) Error Eloperadorrelacional -> es incorrecto. Corrección: Cambie -> a >-. 2.5 a) // Calcula el producto de tres enteros b) Scanner entrada - new Scanner (System.in); c) int x, y, z, resultado; www.FreeLibros.me
    • Ejercicios 65 int x; int y; int z; int resultado; d) System.out.printC “Escriba el primer entero: " ); e) x - entrada.nextlntO; f) System.out.printC “Escriba el segundo entero: ” ); g) y - entrada.nextlntO; h) System.out.printC “Escriba el tercer entero: " ); i) z - entrada.nextlntO; j) resultado - x * y * z; k) System.out.printfC "El producto es Xdn", resultado ); 2.6 La solución parael ejercicio 2.6 eslasiguiente: 1 / / Ejemplo 2.6 : Producto.java 2 / / C alcu lar el producto de tre s enteros. 3 import ja v a .u t i1.Scanner; / / el programa usa Scanner 4 5 public c la ss Producto 6 { 7 public s ta tic void mainC S trin g [] args ) 8 { 9 / / crea objeto Scanner para obtener la entrada de la ventana de comandos 10 Scanner entrada = new Scanner( System .in ) ; 11 12 in t x; / / primer número introducido por el usuario 13 in t y; / / segundo número introducido por el usuario 14 in t z ; / / te rce r número introducido por el usuario 15 in t resultado; / / producto de los números 16 17 System .out.printC “Escriba el primer entero: " ) ; // indicador de entrada 18 x = e n tra d a .n e xtln tO ; / / lee el primer entero 19 20 System .out.printC “Escriba el segundo entero: ” ) ; / / indicador de entrada 21 y = ent rada, next In t O ; / / lee el segundo entero 22 23 System .out.printC “Escriba el te rce r entero: " ) ; // indicador de entrada 24 z = ent rada, next In t O ; / / lee el te rce r entero 25 26 resultado = x * y * z ; / / calcu la el producto de los números 27 28 System .out.printfC “ El producto es %dn” , resultado ) ; 29 } / / fin del método main 30 } / / fin de la clase Producto Escrib a el primer entero: 10 Escrib a el segundo entero: 20 Escrib a el te rce r entero: 30 El producto es 6000 Ejercicios 2.7 Complete lassiguientesoraciones: a) ________ seutilizan para documentarun programa y mejorarsulegibilidad. b) Una decisión puedetomarseen un programaenJavacon un(a)_________ www.FreeLibros.me
    • 6 6 Capítulo 2 Introducción a las aplicaciones en Java c) Loscálculosserealizan normalmente mediante instrucciones_________ d) Losoperadoresaritméticoscon la misma precedenciaquela multiplicación son________ y_________ e) Cuando los paréntesis en una expresión aritmética están anidados, se evalúa primero el conjunto________ de paréntesis. f) Una ubicación en la memoria de la computadora que puede contener distintos valores en diversos instantes de tiempo, durante laejecución de un programa, sellama_________ 2.8 Escriba instruccionesen Javaque realicen cada una de lassiguientestareas: a) Mostrar elmensaje "Escriba un entero”,dejando elcursoren la misma línea. b) Asignarel producto de lasvariables by ca la variable a. c) Usarun comando para indicarque un programa vaa realizarun cálculo denómina de muestra. 2.9 Conteste con verdaderoofalsoa cada una de lassiguientesproposiciones; en caso de serfalso,explique por qué. a) Losoperadoresen Javaseevalúan de izquierdaa derecha. b) Los siguientes nombres de variables son todos válidos: _barra_inferior_,m928134, t5, j7, sus_ventas$, su_$cuenta_total, a, b$, c,zyz2. c) Una expresión aritméticaválidaen Javasin paréntesisse evalúa deizquierdaa derecha. d) Lossiguientesnombres devariablesson todos inválidos:3g, 87, 67h2, h22 y 2h. 2.10 Suponiendo que x - 2y y - 3, ¿quémuestra cada una delas siguientesinstrucciones? a) System.out.printfC “x ■Xdn", x ); b) System.out.printfC “El valor de %d + %d es %dn”, x, x, ( x + x ) ); c) System.out.printfC “x ); d) System.out.printfC "Xd - %dn", ( x + y ), ( y + x ) ); 2.11 ¿Cuáles delas siguientesinstrucciones deJavacontienen variables, cuyosvalores semodifican? a) p - i + j + k + 7; b) System.out.printlnC “variables cuyos valores se modifican" ); c) System.out.printlnC “a - 5" ); d) valor ■entrada, nextlnt O; 2.12 Dado que^ =ax3+7, ¿cuálesde lassiguientesinstruccionesenJavason correctaspara estaecuación? a) y - a * x * x * x + 7; b) y - a * x * x * ( x + 7) ; c) y - C a * x ) * x * C x + 7) ; d) y - C a * x ) * x * x + 7; e) y - a * ( x * x * x ) + 7 ; 0 y - a * x * ( x * x + 7) ; 2.13 Indique el orden de evaluación de los operadores en cada una de las siguientes instrucciones en Java, y muestre elvalorde xdespuésde ejecutarcada una de ellas: a) x - 7 + 3 * 6 / 2 - l ; b) x - 2 X 2 + 2 * 2 - 2 / 2 ; c) x - C3 * 9 * C3 + C9 * 3 / C3 ) ) ) ); 2.14 Escriba una aplicación que muestre losnúmeros del 1al4 en la misma línea, con cada parde númerosadyacentes separado porun espacio. Uselas siguientes técnicas: a) Medianteuna instrucción System.out.println. b) Mediante cuatro instrucciones System.out.pri nt. c) Medianteuna instrucción System.out.printf. 2.15 (Aritmética) Escriba una aplicación que pida al usuario que escriba dos enteros, que obtenga los números del usuario eimprima la suma, producto, diferencia ycociente (división) de losnúmeros. Uselas técnicas que se muestran en lafigura 2.7. www.FreeLibros.me
    • Ejercicios 67 2.16 (Comparación de enteros)Escriba una aplicación que pida al usuario que escriba dos enteros, que obtenga los númerosdel usuario y muestreel másgrande, seguidodelaspalabras "es más grande”.Sison iguales, imprima el mensaje "Estos números son iguales”. Utilícelas técnicasquesemuestran en la figura 2.15. 2.17 (Aritmética:menory mayor)Escriba una aplicación que reciba tres enteros del usuario y muestre la suma, pro­ medio, producto, menorymayor de esosnúmeros. Utilicelas técnicas que semuestran en la figura 2.15. [Nota:el cálculo del promedio en este ejercicio debe resultar en una representación entera del promedio. Por lo tanto, si la suma de los valoreses7, el promedio debe ser2, no 2.3333...]. 2.18 (Visualización defiguras con asteriscos)Escriba una aplicación que muestreun cuadro, un óvalo, una flecha y un diamante usando asteriscos (*), como se muestraa continuación: 2.19 ¿Qué imprimeelsiguiente código? System.out.println( “*n**n***n****n*****" ); 2.20 ¿Qué imprimeelsiguiente código? System.out.println( ); System, out. pri ntl n( "***” ); System, out. pri ntl n( “*****’■); System, out. pri ntl n( •'****” ); System.out.println( "**” ); 2.21 ¿Qué imprimeelsiguiente código? System.out.printC “*" ); System.out.printC "***" ); System.out.printC '•*****" ); System.out.printC “****” ); System.out.printlnC "**” ); 2.22 ¿Qué imprimeelsiguiente código? System.out.printC “*" ); System, out. pri ntl nC "***" ); System.out.printlnC "*****” ); System.out.printC "****" ); System.out.printlnC "**" ); 2.23 ¿Qué imprimeelsiguiente código? System.out.printfC “%sn%snXsn", “***", ••*****" ); 2.24 (Enterosmenory mayor) Escriba una aplicación que lea cinco enteros y que determine e imprima los enteros mayorymenor en elgrupo. Usesolamente las técnicas de programación que aprendió en estecapítulo. 2.25 (Paroimpar)Escriba una aplicación que lea un entero y que determine e imprima si esimpar o par. [Sugerencia: use el operador residuo. Un número par es un múltiplo de 2. Cualquier múltiplo de 2 deja un residuo de 0 cuando se di­ videentre 2]. www.FreeLibros.me
    • 68 Capítulo 2 Introducción a las aplicaciones en Java 2.26 (Múltiplos)Escriba una aplicación que leados enteros, determinesiel primero esun múltiplo delsegundo e im­ prima el resultado. [Sugerencia:use eloperador residuo]. 2.27 (Patrón de dattias mediante asteriscos) Escriba una aplicación que muestre un patrón de tablero de damas, como se muestraa continuación: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 2.28 (Diámetro, circunferenciay área de un circulo)He aquí un adelanto. En este capítulo, aprendió sobre los enterosyel tipo int. Java también puede representar númerosde punto flotante que contienen puntosdecimales, como 3.14159. Escriba unaaplicación que recibadel usuarioel radio de un círculocomo unentero, yque imprimad diámetro, lacircunferencia yelárea del círculo mediante el uso delvalorde punto flotante 3.14159 para Ti.Use las técnicas que se muestran en la figura 2.7. [Nota:también puede utilizar laconstante predefinida Math. PI para el valorde Jt. Esta cons­ tante es más precisa que el valor 3.14159. La clase Math se define en el paquete java.lang. Las clases en este paquete se importan de manera automática, por lo que no necesita importar la clase Math mediante la instrucción import para usarla.] Use las siguientesfórmulas (res el radio): diámetro=2r circunferencia= 2Jlr área=Jir2 No almacene los resultados de cada cálculo en una variable. En vez de ello, especifique cada uno como el valor que se imprimirá en una instrucción System,out. printf. Los valores producidos por los cálculos del área y la circunferencia son números depunto flotante. Dichosvalores pueden imprimirse con elespecificadorde formato %fen una instrucción System.out.pri ntf. En elcapítulo 3aprenderá másacercade losnúmerosdepunto flotante. 2.29 (Valor entero de un carácter) He aquíotro adelanto. En estecapítulo, aprendió acerca de losenteros yel tipo int. Java puede también representar letras en mayúsculas, en minúsculas y una considerable variedad de símbolos especiales. Cada carácter tiene su correspondiente representación entera. El conjunto de caracteres que utiliza una computadora, ylascorrespondientes representacionesenterasde esoscaracteres, seconocen como elconjunto de carac­ teres de esa computadora. Usted puede indicar un valor de carácter en un programa con sóloencerrarlo entre comillas sencillas, como en ‘A’. Puededeterminar elequivalenteentero de un caráctersi loanteponea la palabra (i nt),como en (int) ‘A’ Estaforma seconocecomo operadordeconversión detipo. (Aprenderá sobreestosoperadoresen elcapítulo4.)Lasiguien­ te instrucción imprime un carácterysu equivalente entero: System.out .pri n tf( "El carácter %c tiene el valor %dn”, ‘A’, ( (int) ‘A’ ) ); Cuando seejecutaesta instrucción, muestraelcarácterAyelvalor 65 (delconjunto decaracteresconocido comoUnicode®) oomo parte de la cadena. Observe que el especificador de formato %c es un receptáculo para un carácter (en este caso, elcarácter ‘A’)- Utilizando instrucciones similares a la mostrada anteriormente en este ejercicio, escriba una aplicación que mues­ tre los equivalentes enteros de algunas letras en mayúsculas, en minúsculas, dígitos y símbolos especiales. Muestre los equivalentes enteros de lossiguientescaracteres: A B C a b c 0 1 2 $ * + / y elcarácteren blanco. www.FreeLibros.me
    • Hacer la diferencia 69 2.30 (Separación de losdígitosen un entero) Escriba una aplicación que reciba del usuario un número compuesto por cinco dígitos, que separe ese número en sus dígitos individuales y los imprima, cada uno separado de los demás por tres espacios. Porejemplo,si el usuario escribe elnúmero 423 39, el programa debe imprimir 4 2 3 3 9 Suponga que el usuario escribe el número correcto de dígitos. ¿Qué ocurre cuando ejecuta el programa y escribe un número con más de cinco dígitos? ¿Qué ocurre cuando ejecuta el programa y escribe un número con menos de cinco dígitos? [Sugerencia:es posible hacer este ejercicio con las técnicas que aprendió en este capítulo. Necesitará utilizar las operacionesde división yresiduo para “seleccionar”cada dígito]. 2.31 (Tabla de cuadradosy cubos) Utilizando sólo las técnicas de programación que aprendió en este capítulo, es­ criba una aplicación que calcule los cuadrados y cubos de los números del 0 al 10, y que imprima los valores resultantes en formato de tabla, como se muestra a continuación. [Nota: este programa no requiere de ningún tipo de entrada por parte del usuario]. numero cuadrado cubo 0 0 0 1 1 1 2 4 8 3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000 2.32(Valoresnegativos,positivosy cero)Escriba un programa que recibacinco números, yquedetermine eimprima lacantidad denúmeros negativos, positivos, ylacantidaddeceros recibidos. Marcar la diferencia 2.33 (Calculadora delíndice de masa corporal)En el ejercicio 1.10 introdujimos la calculadora del índice de masa corporal (BMI). Lasfórmulas para calcularel BMI son pesoEnLibrasX703_______ " alturaEnPulgadasXalturaEnPulgadas o ggjjggjseggí_____ alturaEnMetrosXalturaEnMetros Creeuna calculadoradel BMI que leael pesodel usuario en librasylaalturaen pulgadas (o,si lo prefiere, el pesodel usua­ rio en kilogramos ylaaltura en metros), para que luego calculey muestre el índice demasa corporal del usuario. Muestre además la siguiente información del Departamento de Salud y Servicios Humanos/Instituto Nacional de Salud para que el usuario pueda evaluarsu BMI: VALORES DE BMI B a jo p eso : N orm al: menos de 1 8 .5 e n tre 18 5 y 2 4 .9 So b repeso : e n tre 25 y 2 9 .9 Obeso: 30 o más www.FreeLibros.me
    • 70 Capítulo 2 Introducción a las aplicaciones en Java [Nota:en estecapítulo aprendió a usarel tipo int para representar números enteros. Cuando se realizan los cálculos del BMI con valores int, se producen resultados en números enteros. En el capítulo 3 aprenderá a usar el tipo d o ub le para representara los números con puntos decimales. Cuando se realizan los cálculos del BMI con valores doubl e, producen númeroscon puntos decimales; a éstosselesconoce como númerosde“punto flotante”]. 2.34 (Calculadoradelcrecimientode lapoblación mundial)UseWeb para determinarla población mundial actual yla tasa de crecimiento anual de la población mundial. Escriba una aplicación que reciba estos valores como entrada y luego muestrela población mundial estimada después deuno, dos, tres, cuatro ycincoaños. 2.35 (Calculadorade ahorropor viajescompartidosen automóvil) Investiguevarios sitios Web de viajes compar­ tidosen automóvil. Cree una aplicación que calculesu costo diario alconducirsuautomóvil, demodo que pueda estimar cuánto dinero puede ahorrar si comparte los viajes en automóvil, lo cual también tieneotras ventajas, como la reducción de las emisiones de carbono y de la congestión de tráfico. La aplicación debe recibircomo entrada la siguiente informa­ ción ymostrar elcosto por día para el usuario porconduciral trabajo: a) Totalde kilómetros conducidos pordía. b) Costo por litro degasolina. c) Promedio de kilómetros por litro. d) Cuotasde estacionamiento pordía. e) Peaje pordía. www.FreeLibros.me
    • Introducción a las clases, objetos, métodos y cadenas 3Nadapuedetenervalor sinserun objetodeutilidad. —Kari Marx Susservidorespúblicos lesirven bien. —A dlai E. Stcvenson Ustedveráalgonuevo. Doscosas. YLasllamo Cosa Unoy CosaDos. —Dr. TheodorScuss Getsel O b j e t i v o s En este capítulo aprenderá a: ■ Declarar una clase y utilizarla para crear un objeto. ■ Implementar los comportamientos de una clase como métodos. ■ Implementar los atributos de una clase como variables de instancia y propiedades. ■ Llamar a los métodos de un objeto para hacer que realicen sus tareas. ■ Conocer cuáles son las variables de instancia de una clase y las variables locales de un método. ■ Utilizar un constructor para inicializar los datos de un objeto. ■ Conocer las diferencias entre bs tipos primitivos y los tipos por referencia. www.FreeLibros.me
    • Plangeneral 72 Capítulo 3 Introducción a las clases, objetos, métodos y cadenas 3.1 Introducción 3.6 Inicialización de objetos mediante 3.2 Declaración de una clase con un método e constructores instanciamiento de un objeto de una clase 3.7 Los números de punto flotante y 3.3 Declaración de un método con un parámetro el tipo doubl e 3.4 Variables de instancia, métodos establecer y métodos obtener 3.8 (Opcional) Caso de estudio de GUI y gráficos: uso de cuadros de diálogo 3.5 Comparación entre tipos primitivos y tipos por referencia 3.9 Conclusión Resumen | Ejerciciosde autoevaluación | Respuestas a los ejercicios de autoevaluación | Ejercicios | Marcar la diferencia ^ 3.1 Introducción En lasección 1.6 le presentamos laterminologíabásicay los conceptos acerca de la programación orien­ tada aobjetos. En este capítulo le presentaremos un marco de trabajo simple para organizar aplicaciones orientadas a objetos enJava. Por lo general, las aplicaciones que desarrollará en este libro consistirán de dos o más clases. Si se vuelve parte de un equipo de desarrollo en la industria, podría trabajar en aplica­ ciones que contengan cientos, o incluso miles de clases. Primero explicaremos el concepto de las clases con un ejemplo real. Después presentaremos cinco aplicaciones para demostrarle cómo crear y utilizar sus propias clases. Los primeros cuatro ejemplos empiezan nuestro caso de estudio acercade cómo desarrollar una clase tipo libro de calificaciones, que los instructores pueden utilizar para mantener las calificaciones de las pruebas de sus estudiantes. Am­ pliaremos este ejemplo práctico en los capítulos 4,5 y 7. El último ejemplo en este capítulo introduce los números de punto flotante (números que contienen puntos decimales) en una clase tipo cuenta bancaria, lacual mantiene el saldo de un cliente. 3.2 Declaración de una clase con un método e instanciamiento de un objeto de una clase En las secciones 2.5 y 2.8 creó un objeto de la clase existente Scanner, y después lo utilizó para leer datos mediante el teclado. En esta sección creará una nueva clase y después la utilizará para crear un objeto. Comenzaremos por declarar las clases Lib ro C a lifica cio n e s (figura 3.1) y PruebaLibro- Cal i f i caci ones (figura3.2). Laclase Li broCal i f i caciones (declaradaen el archivo Li broCal i f i ca- ciones. java) se utilizará para mostrar un mensaje en la pantalla (figura 3.2), para dar la bienvenida alinstructoralaaplicación dellibro decalificaciones. Laclase PruebaLi broCal i f icaciones (declarada en el archivo PruebaLi broCal i f i caci ones. j ava) es una clase de aplicación en la que el método main creará y utilizará un objeto de la clase L ib ro C a lif icaciones. Cada declaración de claseque comienza con lapalabra clave public debe almacenarse en un archivo que tenga el mismo nombre que la clase, y que termine con la extensión de archivo .java. Por lo tanto, las clases Li broCal i f i caci ones y P ru eb aLib ro C alificacion es deben declararse en archivos separados, ya que cada clase se declara como public. La clase L i broCa 7i f i ca ci ones La declaración de la clase LibroCali ficaciones (figura 3.1) contiene un método llamado mostrar- Mensaje (líneas 7-10), el cual muestra un mensaje en la pantalla. Necesitamos crear un objeto de esta clasey llamar asu método para hacerque se ejecute la Enea9 yque muestre su mensaje. Ladeclaracióndelaclasetmpiezaen laEnea4. Lapalabraclave publ i c esun modificador de acceso. Por ahora, simplemente declararemos cada clase como publ ic. Toda declaración de clase contiene la www.FreeLibros.me
    • 3.2 Declaración de una clase con un método e instanciamiento de un objeto de una clase 73 1 / / F ig . 3 .1 : L ib ro C a lific a c io n e s.ja v a 2 / / D eclaración de una clase con un método. 3 4 public cla ss Lib ro C a lificacio n e s 5 { 6 / / muestra un mensaje de bienvenida al usuario de Li broCali f i caci ones 7 public void mostrarMensaje() 8 { 9 System .out.printlnC “Bienvenido al Libro de c a lific a c io n e s !" ) ; 10 } / / fin del método mostrarMensaje il } / / fin de la clase Lib ro C a lificacio n e s Fig. 3.1 | Declaración de una clase con un método. palabraclave class, seguida de inmediato por el nombre de la clase. El cuerpo de toda clasese encierra entre un pardellavesizquierday unaderecha,como en laslíneas 5y 11 de laclaseL i broCal i fi caciones. En el capítulo 2, cada claseque declaramos tenía un método llamado mai n. La clase Li broCal i fi - caci ones también tiene un método: mostrarMensaj e (líneas 7-10). Recuerde que mai n es un método especial, que siempre es llamado, automáticamente, por la Máquina Virtual de Java (JVM) a la hora deejecutar unaaplicación. Lamayoríade los métodos no se llamanen formaautomática. Como veremos en breve, es necesario llamar al método mostrarMensaje de manera explícita para indicarle que haga su trabajo. La declaración del método comienza con la palabra clave publ ic para indicar que el método está “disponible ai público”: los métodos de otras clases pueden llamarlo. A continuación está el tipo de valor de retorno del método, el cual especificael tipo dedatos quedevuelve el método aquien lo llamó después de realizar su tarea. El dpo de valor deretorno voidindica que este método realizará una tarea pero «¿devolverá(esdecir, regresará)información al método que lo llamó. Yahemosutilizado métodos que devuelven información; por ejemplo, en el capítulo 2 utilizó el método n e xtln t de Scanner para recibir un entero escrito por el usuario desde el teclado. Cuando n e xtln t recibe un valor de entrada, devuelve esevalor para utilizarlo en el programa. El nombre del método, mostrarMensaje, vadespués del tipo de valor deretorno. Por convención, bs nombres de los métodos comienzan con una letra minúscula, y el resto de las palabras en el nom­ bre con mayúsculas. Los paréntesis después del nombre del método indican que éste es un método. Un conjunto vacío de paréntesis, como se muestra en la línea 7, indica que este método no requiere información adicional para realizar su tarea. La línea 7 se conoce comúnmente como el encabezado del método. El cuerpo de cada método se delimita mediante lasllavesizquierda y derecha, como en las líneas 8 y 10. El cuerpo de un método contiene una o varias instrucciones que realizan su trabajo. En este caso, elmétodo contiene unainstrucción (línea 9) que muestra el mensaje “Bi enven i do al Li bro de cal i - fi caciones!”, seguido de una nueva línea (debido a p rin tln ) en la ventana de comandos. Una vez quese ejecutaesta instrucción, el método ha completado su trabajo. La clase PruebaLibroCal i f i ca c iones Acontinuación, nos gustaríautilizar laclase LibroCali fi caciones en una aplicación. Como aprendió en el capítulo 2, el método main empieza la ejecución de todoslas aplicaciones. Una clase que contie­ neel método mai nempieza laejecución de una aplicación deJava. Laclase LibroCalificaciones noes una aplicación, yaque «¿contienea main. Porlo tanto, si tratade ejecutar LibroCalificaciones escri­ biendo java LibroCal ifi caciones en la ventana de comandos, se producirá un mensaje de error. Esto no fue un problema en el capítulo 2, ya que cada clase que declaramos tenía un método main. Para corregir este problema, debemos declarar una clase separada que contenga un método main, o colocar un método main en la clase LibroCali fi caciones. Para ayudarlo a prepararse para los pro­ www.FreeLibros.me
    • 74 Capítulo 3 Introducción a las clases, objetos, métodos y cadenas gramas más extensos que encontrará más adelante en este libro y en la industria, utilizamos una clase separada (PruebaLibroCalificaciones en este ejemplo) que contiene el método main para probar cada nueva clase que vayamos a crear en este capítulo. Algunos programadores se refieren a este tipo de clases como una clasecontroladora. La declaración de la clase PruebaLibroCalificaciones (figura 3.2) contiene el método main que oontrolará la ejecución de nuestra aplicación. La declaración de la clase PruebaLi broCali fi caci ones empieza en la línea 4 y termina en la línea 15. La clase sólocontiene un método mai n, algo común en muchas clases que empiezan la ejecución de una aplicación. 1 / / F i g . 3.2: P ru eb aLib ro C alificacio n es.java 2 / / Crea un objeto L ib ro C a lif icaciones y llam a a su método mostrarMensaje. 3 4 public c la ss PruebaLibroC alificaciones 5 { 6 / / el método mainempieza la ejecución del programa 7 public s ta tic void main(S trin g [] args ) 8 { 9 / / crea un objeto LibroCal i ficacio n e s y lo asigna a mi Li bro C alificacion es 10 Li b ro C alificacio n es mi LibroCal i ficacio n es = new LibroCal ifica cio n e sO ; 11 12 / / llam a al método mostrarMensaje de mi LibroCal i ficacio n es 13 mi LibroCal ificacio nes.m o strarM ensajeO ; •4 } / / fin de main 15 } / / fin de la clase PruebaLi bro C alificacion es Bienvenido al Libro de c a lific a c io n e s! Fig. 3.2 | Cómo crearunobjeto de laclase LibroCal i f i caci ones yllamara su métodomostrarMensaje. Las líneas 7 a la 14 declaran el método main. Una parte clave para permitir que la JVM localice y llame al método mainpara empezar la ejecución de la aplicación es la palabra clave static (línea 7), la cual indica que main es un método static. Un método sta tic es especial,ya quepuede llamarsesin tenerquecrearprimero un objeto dela claseenla cualsedeclara esemétodo. En el capítulo 6, Métodos: un análisis más detallado, analizaremos los métodos stati c. Enestaaplicaciónnos gustaríallamaral métodomost rarMens aj e delaclase Li broCal i f i caci ones para mostrar el mensaje de bienvenida en la ventana de comandos. Por lo general,no podemos llamar a un método que pertenece aotra clase sino hasta crear un objeto de esa clase, como se muestra en la línea 10. Empezaremos por declarar la variable mi LibroCal i ficacio n es. El tipo de la variable es Li broCal i f i caci ones: la clase que declaramos en la figura 3.1. Cada nueva claseque creamos se con­ vierte en un nuevo tipo, que puede usarse para declarar variables y crear objetos. Usted puede declarar nuevos tipos de clases según lo necesite; ésta es una razón por la cual Java se conoce como un lenguaje extensible. La variable mi Li broCal i ficacio n e s se inicializa (línea 10) con el resultado de la expresión de creación de instancia de clase new Li broCal i f i caci ones O .La palabraclave newcreaun nuevo obje­ to de la clase especificadaa la derecha de la palabraclave (es decir, Li broCal i f i caci ones). Los parén­ tesis a la derecha de Lib ro C a lifica cio n e s son obligatorios. Como veremos en la sección 3.6, esos paréntesis en combinación con el nombre de una clase representan una llamada a un constructor, que essimilar a un método, pero se utiliza sólo cuando se crea un objeto para inicializarlos datos de éste. En esasección verá que los datos pueden colocarse entre paréntesis para especificar los valores iniciales páralos datos del objeto. Por ahora, sólo dejaremos los paréntesis vacíos. www.FreeLibros.me
    • 3.2 Declaración de una clase con un método e instanciamiento de un objeto de una clase 75 Así como podemos usarelobjeto System, out parallamara sus métodos pri nt, p ri n tf y pri ntl n, también podemos usar el objeto mi LibroCal i ficacio n es para llamar a su método mostrarMensaje. La línea 13 llama al método mostrarMensaje (líneas 7-10 de la figura 3.1), mediante el uso de m iLibroCal i f i caciones seguida de un separador punto (.), el nombre del método mostrarMensaje y un conjunto vacío de paréntesis. Esta llamada hace que el método mostrarMensaj e realice su tarea. La llamada a este método difiere de las del capítulo 2 en las que se mostraba la información en una ventanadecomandos; cada una deestas llamadasal método proporcionabaargumentos queespecifica­ ban los datos a mostrar. Al inicio de la línea 13, “mi L ib ro C a lif icacio n es. ” indica que main debe utilizar el objeto mi LibroCal i ficacio n es que se creó en la línea 10. La línea 7 de la figura 3.1 indica que el método mostrarMensaje tiene una lista deparámetros vacia; es decir, mostrarMensaje no re­ quiere información adicional para realizar su tarea. Por esta razón, la llamada al método (línea 13 de la figura 3.2) especifica un conjunto vacío de paréntesis después del nombre del método, para indicar que no se van a pasar argumentos al método mostrarMensaje. Cuando el método mostrarMensaje oompleta su tarea, el método mai n continúa su ejecución en la línea 14. Éste es el final del método mai n, por lo que el programa termina. Cualquier clase puede contener un método mai n. LaJVM lo invoca sóloen la clase que se utiliza para ejecutar la aplicación. Si una aplicación tiene varias clases que contengan main, el que se invoque seráelde la clase nombrada en el comando j ava. Compilación de una aplicación con variasclases Debe compilar las clases de las figuras 3.1 y 3.2 antes de poder ejecutar la aplicación. Primero, cambie aldirectorio que contiene los archivos decódigo fuente de la aplicación. Después, escriba elcomando javac L ib ro C a lific a c io n e s.ja v a P ru eb aLib ro C alificacio n es.java para compilar ambas clases a lavez. Si eldirectorio que contiene la aplicación sólo incluye los archivos de ésta, puede compilartodaslasclases que hayaen eldirectorio con el comando javac * .java El asterisco (*) en *. java indica que deben compilarse todoslos archivos en el directorio actual que ter­ minen con laextensión de nombre de archivo “.ja v a ”. Diagrama de clasesde UMLpara la clase L ibroCa 7i fic a c iones La figura 3.3 presenta un diagrama de clases de UML para la clase Li broCal i f i caciones de la figura 3.1. En UML, cada clase se modela en un diagrama de clases en forma de un rectángulo con tres com­ partimientos. Elcompartimiento superiorcontieneel nombre de laclase, centrado en formahorizontal y en negrita. El compartimiento de en medio contiene los atributos de la clase, que en Java corres­ ponden a las variables de instancia (las cuales analizaremos en la sección 3.4). En la figura 3.3, el com­ partimiento de en medio está vacío, ya que esta clase LibroCal i ficacio n es «¿tiene atributos. El compartimiento inferior contiene las operaciones de la clase, que enJavacorresponden alos métodos. libroCafificaciones + mostrarMensaje( ) Fig. 3.3 | Diagramadeclases de UML,elcual indica que laclase LibroCal i ficacio n es tiene unaoperación publ i c llamadamostrarMensaje. www.FreeLibros.me
    • 76 Capítulo 3 Introducción a las clases, objetos, métodos y cadenas Rira modelar lasoperaciones, UML lista el nombre de la operación precedido por un modificador de acceso (en este caso, +) y seguido de un conjunto de paréntesis. La clase L ib ro C a lif icacion es tiene un solo método llamado mostrarMensaje, por lo que el compartimiento inferior de la figura 3-3 lista una operación con este nombre. El método mostrarMensaje no requiere información adicional para realizar sus tareas, por lo que los paréntesis que van después del nombre del método en el dia­ grama de clases están vados, de igual forma que como aparecieron en la declaración del método, en la línea 7 de la figura 3.1. El signo más (+) que va antes del nombre de la operación indica que mostrarMensaje es una operación p ú b licaen UML (es decir, un método publ i c en Java). Utiliza­ remos los diagramas de clases de UML con frecuencia para sintetizar los atributos y las operaciones de una clase. 3.3 Declaración de un método con un parámetro En nuestra analogía del auto de lasección 1.6, hablamossobreel hecho de que alpisar el pedal del acele­ rador se envía un mensaje al auto para que realicela tarea: que vaya más rápido. Pero, ¿quétan rápido debería acelerar elauto? Como sabe, cuanto más pisa el pedal, mayor será laaceleración del auto. Por lo tanto, el mensaje para el auto en realidad involucra tanto la tarea a realizarcomo informaciónadicional que ayuda alauto a ejecutar su tarea. A la información adicional se leconoce como parámetro; el valor del parámetro ayuda al auto adeterminar qué tan rápido debe acelerar. De manera similar, un método puederequeriruno o más parámetros que representan lainformación adicionalque necesita pararealizar su tarea. Los parámetros se definen en una lista de parámetros separada por comas, ubicada dentro de los paréntesis que van después del nombre del método. Cada parámetro debe especificar un tipo y un nombre devariable. Lalistadeparámetros puedecontener cualquier número deéstos,o inclusiveningu­ no. Los paréntesisvacíosdespuésdelnombredelmétodo (como en la línea7 de lafigura3.1) indican que un método norequiere parámetros. Argumentospara un método La llamada a un método proporciona valores (llamados argumentos) para cada uno de los parámetros deesemétodo. Porejemplo, el método System. o u t. p ri n tl n requiere un argumento queespecificalos datos a mostrar en una ventana de comandos. De manera similar, para realizar un depósito en una cuenta bancaria, un método llamado deposito especifica un parámetro que representa el monto a depositar. Cuando se hace una llamada al método deposito, se asigna al parámetro del método un valor como argumento, que representa el monto a depositar. Entonces, el método realiza un depósito por ese monto. Declaración de una clasecon un método que tiene unparámetro Ahoravamosa declararlaclase Li broCal i fi caci ones (figura3.4), con un método mostrarMensaje que muestraelnombredelcursocomo partedelmensajede bienvenida(enlafigura3-5 podráverlaejecución de ejemplo). Este nuevo método requiere un parámetro que representa el nombre del curso a imprimir en pantalla. Antes de hablar sobre las nuevas características de la clase L ib ro C a lif icacio n e s, veamos cómo se utiliza la nueva clase desde el método mai n de la clase PruebaLi broCal i f i caciones (figura 3-5). La línea 12 crea un objeto Scanner llamado entrada, para recibir el nombre del curso escrito por el usuario. La línea 15 crea el objeto mi Li broCal i f i caciones de la clase LibroCal i fica cio n e s. La línea 18 pide al usuario que escriba el nombre de un curso. La línea 19 lee el nombre que intro­ duce el usuario y lo asigna a la variable nombreDelCurso, mediante el uso del método nextLine de Scanner para realizar la operación de entrada. El usuario escribe el nombre del curso y oprime Intro para enviarlo al programa. Al oprimir Intro se inserta un carácter de nueva línea al final de los ca­ racteres escritos por el usuario. El método nextLine los lee hasta encontrar la nueva línea, luego devuelve un objeto S trin g que contiene los caracteres hasta la nueva línea, pero sin incluirla. El carácter de nueva línea se descarta. www.FreeLibros.me
    • 3.3 Declaración de un método con un parámetro 77 1 / / F ig . 3.4: L ib ro C a lific a c io n e s.ja v a 2 / / D eclaración de una clase con un método que tiene un parámetro. 3 4 public cla ss Lib ro C a lificacio n e s 5 { 6 / / muestra un mensaje de bienvenida al usuariode Lib ro C a lificacio n e s 7 public void mostrarMensaje( Strin g nombreDelCurso ) 8 { 9 System .out.printfC “ Bienvenido al lib ro de c a lific a c io n e s paran%s! n” , 10 nombreDelCurso ) ; 11 } / / fin del método mostrarMensaje 12 } // fin de la clase L ib ro C a lif icaciones Fig. 3.4 | Declaración de una clase con un método que tiene un parámetro. 1 / / Fí Q- 3.5: P ru eb aLib ro C alificacio n es.java 2 / / Crea un objeto Lib ro C a lificacio n e s y pasa unobjeto String 3 / / a su método mostrarMensaje. 4 import ja v a .u t i1.Scanner; // el programa usa la claseScanner 5 6 public c la ss PruebaLibroC alificaciones 7 { 8 / / el método mainempieza la ejecución del programa 9 public s t a t ic void main(S trin g [] args ) 10 { 11 / / crea un objeto Scanner para obtener la entrada de la ventana de comandos 12 Scanner entrada = new Scanner( System .in ) ; 13 14 / / crea un objeto Li b ro C alificacio n es y lo asigna a mi Li bro C alificacion es 15 Li b ro C alificacio n es miLibroCal ifica cio n e s = new LibroCal ifica cio n e sO ; 16 17 / / pide y recibe el nombre del curso como entrada 18 System .out.printlnC “Escrib a el nombre del cu rso :” ) ; 19 Strin g nombreDelCurso = e n trad a.n extLin eO ; / / lee una lin e a de texto 20 S y ste m .o u t.p rin tln (); / / imprime una lin e a en blanco 21 22 / / llam a al método mostrarMensaje de mi LibroCal i ficacio n es 23 / / y pasa nombreDelCurso como argumento 24 m iLibroC alificaciones.m ostrarM ensaje( nombreDelCurso ) ; 25 } / / fin de main 26 } // fin de la clase PruebaLibroCalificaciones Escrib a el nombre del curso: CS101 Introducción a la programación en lava Bienvenido al lib ro de c a lific a c io n e s para CS101 Introducción a la programación en lava! Fig. 3.5 | Cómo crear un objeto LibroCal ifica cio n e s y pasar un objeto S tri ng a su métodomostrarMensaje. La clase Scanner también cuenta con un método similar (next) para leer palabras individuales. Cuando el usuario oprime Introdespués de escribir la entrada, el método next lee caracteres hasta en­ contrar un carácterde espacioen blanco(espacio, tabulador o nueva línea), y después devuelve un objeto www.FreeLibros.me
    • 78 Capítulo 3 Introducción a las clases, objetos, métodos y cadenas S tri ng que contiene los caracteres hasta el carácter de espacio en blanco (que se descarta), pero sin in­ cluirlo. No sepierde toda la información que vadespués del primer carácter de espacio en blanco; estará disponible para que la lean otras instrucciones que llamen a los métodos de Scanner, más adelante en elprograma. La línea20 imprime una línea en blanco. Lalínea24 llamaal método mostrarMensajedemiLi broCal i ficacio n e s. Lavariable nombreDel­ Curso entre paréntesis es el argumento que se pasa al método mostrarMensaje, para que éste pueda realizar su tarea. El valor de la variable nombreDelCurso en mai n se convierte en el valor delparámetro nombreDelCurso del método mostrarMensaje, en lalínea 7 de la figura3.4. Al ejecutaresta aplicación, observe que el método mostrarMensaje imprime en pantalla el nombre que usted escribió como parte del mensaje de bienvenida (figura 3.5). Mássobrelosargumentosy losparámetros En la figura 3 .4 , la lista de parámetros de m ostrarM ensaje (línea 7) declara un parámetro que indica que el método requiere un objeto S t r i ng para realizar su trabajo. En el instante en que se llama al mé­ todo, el valor del argumento en la llamada se asigna al parámetro correspondiente (nombreDelCurso) en el encabezado del método. Después, el cuerpo del método utiliza el valor del parámetro nombre Del Curso. Laslíneas 9 y 10 de la figura3.4 muestran el valor del parámetro nombreDelCurso, median­ teel uso del especificador de formato %s en la cadena de formato de p ri n tf. El nombre de la variable de parámetro (nomb reDelCu rso en la figura 3 .4 , línea 7) puede ser igualodistinto al nombre de la va­ riable de argumento (nombreDel Curso en la figura 3.5 , línea 24). El número de argumentos en la llamada a un método ¿/^coincidir con el de los parámetros en la lista de parámetros de la declaración del método. Además, los tipos de los argumentos en la llamada al método debenser“consistentescon”losde losparámetroscorrespondientesen ladeclaracióndelmétodo (como veremosen elcapítulo 6, no siempreserequierequeeltipo deun argumento yeldesucorrespon­ diente parámetro sean idénticos). En nuestro ejemplo, la llamada al método pasa un argumento de tipo S tri ng (nombreDelCurso se declara como Strin g en la línea 19 de la figura 3-5) y la declaración del método especifica un parámetro de tipo S tri ng (nombreDelCurso se declaracomo S tri ng en la Enea 7 de la figura 3.4). Por lo tanto, en este ejemplo, el tipo del argumento en la llamada al método coincide exactamente con el tipo del parámetro en el encabezado del método. Diagrama de clasesde UML actualizadopara la claseL i broCal i fica cio n es El diagrama de clases de UML de la figura 3.6 modela la clase LibroCal ifica cio n e s de la figura 3.4. Al igual que la figura 3.1, esta clase Li b ro C alificacio n es contiene la operación public llamada mostrarMensaje. Sin embargo, esta versión de mostrarMensaje tiene un parámetro. La forma en que UML modela un parámetro es un poco distinta a la deJava, ya que lista el nombre de éste, seguido de dos puntos ysu tipo entre paréntesis, después del nombre de laoperación. UML tienesus propios tipos de datos, que son similares a los deJava (pero como veremos, no todos los tipos de datos de UML tie­ nen los mismos nombres que los correspondientes en Java). El tipo S tri ng de UML corresponde al tipo Strin g deJava. El método mostrarMensaje de LibroCal ifica cio n e s (figura 3.4) tiene un pará­ metro S trin g llamado nombreDelCurso, por lo que en la figura 3.6 se listaa nombreDel Curso : String entre los paréntesis que van después de mostrarMensaje. libroCafificaciones + mostrarMensaje( nombreDelCurso: String) Fig. 3.6 | Diagrama de clases de UML, que indica que la clase LibroCal ifica cio n e s tiene una operación llamada mostrarMensaje, con un parámetro llamado nombreDelCurso de tipo S trin g de UML. www.FreeLibros.me
    • 3.4 Variables de instancia, métodos establecer y métodos obtener 79 Observacionesacerca del uso de lasdeclaraciones import Observe ladeclaración import en la figura 3.5 (línea 4). Esto indica alcompilador que el programa uti­ liza laclase Scanner. ¿Por qué necesitamos importar laclase Scanner, pero no las clases System, String o LibroCal ifica cio n e s? Las clases System y Strin g están en el paquete ja va , lang, que se importa de manera implícita en todoprograma de Java, por lo que todos los programas pueden usar las clases de ese paquete sin tener queimportarlas de manera explícita. La mayoría de las otras clases que utilizará en los programasde Javadeben importarse de manera explícita. Hay una relación especial entre lasclases que secompilan en el mismo directorio en el disco, como las clases L ib ro C a lif icaciones y PruebaLi broCal ific a c io n e s. De manera predeterminada, se con­ sidera que dichas clasesse encuentran en el mismo paquete; aéste se leconocecomo el paquete prede­ terminado. Lasclasesen el mismo paquetese importan implícitamenteen los archivosde código fuente delasotras clasesen el mismo paquete. Porende, nose requiereuna declaración import cuando la clase en un paquete utiliza aotraen el mismo paquete; como cuando PruebaLi broCal i f i caciones utiliza a laclase Li broCal i ficacio n e s. Ladeclaración import en lalínea4 «oesobligatoriasisiemprehacemos referenciaa laclase Scanner oomo j ava. uti 1 . Seanner, quecontieneel nombrecompletodelpaquetey delaclase.Esto seconocecomo el nombre de clase completamente calificado. Por ejemplo, la línea 12 podría escribirse como ja v a .ú til.S c a n n e r entrada = new ja v a .ú t il. Scanner( System .in ) ; Observación de ingeniería de software 3.1 ElcompiladordeJavano requiere declaraciones importen un archivode códigoJuente deJava, siseespecijicaelnombrede clasecompletamente calificadocadavezqueseuti­ liceelnombrede una claseenelcódigojuente. LamayoríadelosprogramadoresdeJava prefierenusardeclaracionesimport. 3.4 Variables de instancia, métodos establecery métodos obtener En el capítulo 2 declaramos todas las variables de una aplicación en el método main. Las variables que se declaran en el cuerpo de un método específico se conocen como variables locales, y sólo se pueden utilizar en ese método. Cuando termina ese método, se pierden los valores de sus variables locales. En la sección 1.6 vimos que un objeto tiene atributos que lleva consigo cuando se utiliza en un programa. Los cuales existen antes de que un objeto llame a un método, al momento y después de que éste se ejecuta. Por lo general, una clase consiste en uno o más métodos que manipulan los atributos pertenecien­ tes a un objeto específico de la clase. Los atributos se representan como variables en la declaración de la clase. Dichas variables se llaman campos y se declaran dentro de la declaración de una clase, pero juera de los cuerpos de las declaraciones de los métodos de ésta. Cuando cada objeto de una clase man­ tiene su propia copia de un atributo, el campo que representa a ese atributo se conoce también como variable de instancia; cada objeto (instancia) de la clase tiene una instancia separada de la variable en memoria. Elejemplo en esta sección demuestra una clase L i broCal i f i caci ones, que contiene una variable de instancia llamada nombreDelCurso para representar el nombre del curso de un objeto L ib ro C a lif icaciones específico. La clase LibroCal ific a c io n e s con una variable de instancia, un método establecery un método obtener En nuestrasiguiente aplicación (figuras 3.7 y 3.8), laclase L i broCal i f i caciones (figura 3.7) mantiene el nombre del curso como una variable de instancia, para que pueda usarse o modificarse en cualquier momento, durante la ejecución de una aplicación. Esta clase contiene tres métodos: establ ecerNom- breDelCu rso, obtenerNombreDelCurso ymostrarMensaje. Elmétodo establ ecerNombreDel Curso al­ macenad nombrede un curso en un L i broCal i f i caci ones. Elmétodo obtenerNomb reDel Curso obtie­ ne el nombre del curso de un Li b ro C alif ic a c i ones. El método mostrarMensaje, que en este caso no www.FreeLibros.me
    • 80 Capítulo 3 Introducción a las clases, objetos, métodos y cadenas especificaparámetros,siguemostrando un mensajede bienvenidaque incluyeelnombre delcurso;como veremos másadelante,elmétodo ahoraobtieneel nombredelcurso mediante una llamadaaotro método en la misma clase: obtenerNombreDelCurso. i / / F ig . 3.7: L ib ro C a lific a c io n e s.ja v a / / Clase Lib ro C a lificacio n e s que contiene una va ria b le de in sta n cia nombreDelCurso / / y métodos para establecer y obtener su v a lo r. public cla ss Lib ro C a lificacio n e s { 7 p rivate Strin g nombreDelCurso; / / nombre del curso para este Lib ro C a lificacio n e s 8 9 / / método para establecer el nombre del curso 10 public void establecerNombreDelCursoC Strin g nombre ) 11 { 12 nombreDelCurso = nombre; / / almacena el nombre del curso 13 } / / fin del método establecerNombreDelCurso 14 15 / / método para obtener el nombre del curso 16 public Strin g obtenerNombreDelCurso() 17 { 18 return nombreDelCurso; 19 } / / fin del método obtenerNombreDelCurso 20 21 / / muestra un mensaje de bienvenida al usuario de Lib ro C a lificacio n e s 22 public void mostrarMensaje() 23 { 24 / / esta in stru cció n llama a obtenerNombreDelCurso para obtener el 25 / / nombre del curso que representa este Lib ro C a lificacio n e s 26 System .out.printfC “ Bienvenido al lib ro de c a lific a c io n e s paran% s!n", 27 obtenerNombreDelCursoO ) ; 28 } / / fin del método mostrarMensaje 29 } / / fin de la clase L ib ro C a lif icaciones________________________________________________________________ Fig. 3.7 | Cómo crear un objeto LibroCal ifica cio n e s ypasar un objeto S tri ng a su métodomostrarMensaje. Por lo general, un instructor enseña más de un curso, cada uno con su propio nombre. La línea 7 declara que nombreDelCurso es una variable de tipo Strin g . Como la variable se declara en el cuer­ po de la clase, perofuera de los cuerpos de los métodos de la misma (líneas 10 a la 13, 16 a la 19 y 22 a la 28), la línea 7 es una declaración para una variable de instancia. Cada instancia (es decir, objeto) de la clase L ib ro C a lif icaciones contiene una copia de cada variable de instancia. Por ejemplo, si hay dos objetos LibroC ali ficacio n e s, cadaobjeto tiene su propia copia de nombreDelCurso. Un be­ neficio de hacer de nombreDelCurso una variable de instancia es que todos los métodos de la clase (en este caso, Li broCal i f i caci ones) pueden manipular cualquier variable de instancia que aparezca en la clase (en este caso, nombreDelCurso). Los modificadoresde accesopubl ic y p r i va te La mayoría de las declaraciones de variables de instancia van precedidas por la palabra clave p ri vate (como en la línea 7). Al igual que publ i c, la palabra clave p rív a te es un modificador de acceso. Las variables o los métodos declarados con el modificador de acceso private son accesibles sólopara los mé­ todos delaclaseenLaquesedeclaran.Así, lavariable nombreDel Cu rso sólo puede utilizarse en los méto- www.FreeLibros.me
    • 3.4 Variables de instancia, métodos establecer y métodos obtener 8 1 dos establecerNombreDelCurso, obtenerNombreDelCurso y mostrarMensaje de (cada objeto de) la clase LibroCal ific a c io n e s. Elproceso de declararvariables deinstanciacon el modificador deacceso pri vate seconocecomo ocultamiento de datos, u ocultamiento de información. Cuando un programa crea (instancia) un objeto de la clase Li b ro C alificacio n e s, la variable nombreDelCurso se encapsula(oculta) en el obje­ to, y sólo está accesible para los métodos de la clase de ese objeto. Esto evita que una clase en otra parte del programa modifique a nombreDel Curso por accidente. En la clase Lib ro C ali f i caci ones, los métodos establ ecerNombreDelCurso y obtenerNombreDelCurso manipulan alavariable deinstancia nombreDelCurso. Observación de ingeniería de software 3.2 Esnecesariocolocarunmodificadordeaccesoantesde cadadeclaraciónde un campoy de un método. Por logeneral las variablesde instancia deben declararse como privatey los métodos como public. (Esapropiadodeclarar ciertos métodos como private, si sólo vanaestaraccesiblesparaotrosmétodosdelacbise). Buena práctica de programación 3.1 Preferimoslistarloscamposde unaclaseprimero,paraque, amedidaqueustedleaelcó­ digo,pueda verlosnombresy tiposde las variablesantesde usarlasen los métodosde la clase. Esposible listar los campos de la clase en cualquierparte de la misma,fuera de lasdeclaracionesdesusmétodos,perosiseesparcenportodoelcódigo, ésteserámásdifícil deleer. Losmétodos esta b l ecerNombreDel Curso y obtenerNombreDelCurso El método establ ecerNombreDelCurso (líneas 10 a la 13) no devuelve datos cuando completasu tarea, por lo que su tipo de valor de retorno es voi d. El método recibe un parámetro (nombre), el cual repre­ senta el nombre del curso que se pasaráal método como un argumento. La línea 12 asigna nombre a la variable de instancia nombreDelCurso. El método obtenerNombreDelCurso (líneas 16 a la 19) devuelve un nombreDelCurso de un objeto LibroCal ifica cio n e s específico. Tiene una lista de parámetros vacía, por lo que no requiere informa­ ción adicional para realizar su tarea. Este método especifica que devuelve un objeto String ; a éste se le conoce como el upo de valor de retorno del método. Cuando se hace una llamada a un método que especifica un tipo de valor de retorno distinto de voi dy completa su tarea, devuelve un resultadoal mé­ todo que lo llamó. Por ejemplo, cuando usted vaa un cajero automático (ATM) y solicita el saldo de su cuenta, esperaque elATM le devuelva un valor que representa su saldo. De manerasimilar, cuando una instrucción llama al método obtenerNombreDelCurso en un objeto Lib ro C ali ficacio n e s, la instruc­ ciónespera recibir el nombre del curso de Li broCal i f i caci ones (en este caso, un objeto St ri ng, como seespecificaen el tipo de valor de retorno de la declaración del método). La instrucción return en la línea 18 pasa el valor de la variable de instancia nombreDelCurso de vuelta a la instrucción que llama al método obtenerNombreDelCurso. Ahora considere la línea 27 del método mostrarMensaje, que llama al método obtenerNombreDelCurso. Al devolver el valor, la ins­ trucción en laslíneas 26 y27 usaesevalorparaimprimir elnombre del curso. De manerasimilar,si tiene un método cuadrado que devuelve el cuadrado de su argumento, es deesperarse que la instrucción in t resultado = cuadrado( 2 ) ; devuelva 4 del método cuadrado y asigne 4 a lavariable resultado. Si tiene un método máximoque de­ vuelveel mayor de tres argumentos enteros, esde esperarse que lasiguiente instrucción in t mayor = maximo( 27, 114, 51 ) ; devuelva 114 del método máximo y asigne 114 a lavariable mayor. www.FreeLibros.me
    • 82 Capítulo 3 Introducción a las clases, objetos, métodos y cadenas Las instrucciones en las líneas 12 y 18 utilizan nombreDelCu rso, aun cuandoesta variable nosede­ claró en ninguno de los métodos. Podemos utilizar nombreDelCurso en los métodos de la clase Libro- Cal i ficacio n e s, ya que nombreDel Curso es unavariable de instancia de laclase. Elmétodo mostrarMensaje El método mostrarMensaje (líneas 22 a la 28) no devuelve datos cuando completa su tarea, por lo que sutipo devalorde retorno esvoi d. Elmétodo norecibeparámetros,por lo que lalistade parámetrosestá vacía. Las líneas 26 y 27 imprimen un mensaje de bienvenida, que incluye el valor de lavariable de ins­ tancia nombreDelCurso, el cual se devuelve mediante la llamada al método obtenerNombreDelCurso en la línea 27. Observe que un método de una clase (mostrarMensaj e en este caso) puede llamar a otro método de la mismaclaseconsólo usarsu nombre (obtenerNombreDelCurso en este caso). La clase PruebaLibroCal i fica cio n es que demuestra a la claseLibroC al i fica cio n es La clase PruebaLi broCal i f i caciones (figura 3.8) crea un objeto de la clase Li broCal i f i caciones y demuestrael uso desus métodos. Lalínea 14 creaun objeto Li broCal i f i caci ones y loasignaa lavaria­ blelocalmi L i broCal i f i ca ci ones, de tipo L i broCal i f i caci ones. Laslíneas 17-18 muestran elnombre inicial del curso mediante una llamada al método obtenerNombreDelCurso delobjeto. La primera línea de lasalida muestra el nombre “ n u il ”.A diferenciadelas variables locales, que noseinicializan de manera automática, cada campotiene unvalor inicialpredeterminado: un valorqueJavaproporciona cuando el programadornoespecificaelvalorinicialdelcampo. Por ende, no serequiere que los camposse inicialicen de maneraexplícita antes de usarlos en un programa, a menos que deban hacerlo con valores distintosde los predeterminados. El valor predeterminado para un campo de tipo S trin g (como nombreDelCurso en este ejemplo) es nul 1,de lo cual hablaremoscon más detalle en lasección 3.5. La línea 21 pide al usuario que escribael nombre para el curso. La variable S t r i ng local e l Nombre (declarada en la línea22) se inicializa con el nombre del curso que escribió el usuario, el cual se devuelve mediante la llamada al método n extLine del objeto Scanner llamado entrada. La línea 23 llama al método estab l ecerNombreDelCurso del objeto mi L i b ro C a lific a c io n e s y provee elNombre como argumento para el método. Cuando se hace la llamada ai método, el valor del argumento se asigna al parámetro nombre (línea 10, figura 3.7) del método e stab l ecerNombreDelCurso (líneas 10 a la 13, fi­ gura 3.7). Después, el valor del parámetro se asignaa lavariablede instancia nombreDelCurso (línea 12, figura 3.7). La línea 24 (figura 3.8) salta una línea en la salida, y después la línea 27 llama al método most rarMensa j e delobjeto mi L i broCal i f i c a ci ones paramostraren pantalla elmensajede bienvenida, que contiene el nombre del curso. • / / F i g . 3.8: P ru eb aLib ro C alificacio n es.java 2 / / Crea y manipula un objeto Li b ro C alificacio n e s. 3 import ja v a .ú t il. Scanner; / / el programa usa la clase Scanner 4 5 public cla ss PruebaLibroCalificaciones 6 { 7 // el método main empieza la ejecución del programa 8 public s ta tic void main( S trin g [] args ) 9 { 10 / / crea un objeto Scanner para obtener la entrada de la ventana de comandos 11 Scanner entrada = new ScannerC System .in ) ; 12 13 / / crea un objeto Lib ro C ali ficacio nes y lo asigna a mi LibroCal ifica cio n e s 14 LibroCal ifica cio n e s mi LibroCal ifica cio n e s = new Li broCal i f icaciones O ; 15 Fig. 3 .8 | Creación y manipulación de un objeto Li broCal i f i caci ones (parte I de 2). www.FreeLibros.me
    • 3.4 Variables de instancia, métodos establecer y métodos obtener 83 16 / / muestra el valo r in ic ia l de nombreDelCurso 17 System .out.printfC “El nombre in ic ia l del curso es: %snn” , 18 miLibroCalificaciones.obtenerNom breDelCursoO ) ; 19 20 / / pide y lee el nombre del curso 21 System, out .p rin tln C “Escrib a el nombre del cu rso :” ) ; 22 Strin g el Nombre = entrada. nextLi n e O ; / / lee una lin e a de texto 23 m iLibroCalificaciones.establecerNom breDelCursoC elNombre ) ; / / establece el nombre del curso 24 System, out .p ri n tln O ; // imprime una lin e a en blanco 25 26 / / muestra el mensaje de bienvenida después de e sp e cifica r el nombre del curso 27 mi LibroCal ificacio nes.m o strarM ensajeO ; 28 } / / fin de main 29 } / / fin de la clase PruebaLibroCalificaciones El nombre in ic ia l del curso e s: nuil Escrib a el nombre del curso: CS101 Introducción a la programación en lava Bienvenido al lib ro de c a lific a c io n e s para CS101 Introducción a la programación en Java! Fig. 3.8 | Creación ymanipulación de un objeto LibroCal ifica cio n e s (parte 2 de2). Losmétodos establecer^ obtener Los campos pri vate de una clase pueden manipularse sólo mediante los métodos de esa clase. Por lo tanto, un cliente de un objeto (es decir, cualquier claseque llame alos métodos del objeto) llama alos métodos publ i cde laclaseparamanipular loscampos pri vate deunobjeto deesaclase.Esto explicapor quélasinstruccionesen el método mai n (figura3-8) llaman alos métodos establ ecerNombreDelCurso, obtenerNombreDel Curso ymostrarMensaje en un objeto Li broCal i f i caciones. A menudo, lasclases proporcionan métodos publ ic para permitir a los clientes de la clase establecer (asignar valores a) u obtener (obtener los valores de) variables de instancia p ri vate. Los nombres de estos métodos no necesitan empezarcon estableceru obtener,pero estaconvención denomenclaturaes muy recomendada en Java, y es requerida para ciertos componentes de software especiales deJava, conocidos como Java- Beans, que pueden simplificar la programación en muchos entornos de desarrollo integrados (IDE). El método que establecela variable deinstancia nombreDel Curso en este ejemplo se llama establ ecer­ NombreDelCurso, y el método que obtienesu valor se llama obtenerNombreDelCurso. Diagrama de clasesde UMLpara la clase L ibroCa 7i fic a c iones con una variable de instancia,y métodosestablecery obtener Lafigura 3-9 contiene un diagramade clases de UML actualizado para laversión de la clase Li broCal i - ficacio n es de la figura 3.7. Este diagrama modela la variable de instancia nombreDelCurso de la clase Li broCal i f i caci ones como un atributo en el compartimiento intermedio de la clase. UML representa alas variables de instanciacomo atributos, listando el nombre del atributo, seguido de dos puntos y del tipo delatributo. Eltipo de UML delatributo nombreDelCurso es Strin g . Lavariabledeinstancia nom- breDel Cu rso es pri vate enJava, por lo que eldiagrama declaseslista un modificadordeaccesodesigno menos (-) en frente del nombre del atributo correspondiente. La clase LibroCal ifica cio n e s contiene tres métodos publ i c,por lo que el diagrama de claseslista tresoperaciones en el tercer compartimiento. Recuerdeque elsigno más (+) antesdecadanombrede operación indicaqueésta espubl i c. Laoperación establ ecerNombreDelCurso tiene un parámetro S trin g llamado nombre. UML indica el tipo de valor deretorno de unaoperación colocando dos puntos y el tipo devalorderetorno después de los paréntesis que lesiguen al nombre de laoperación. El método obtenerNombreDelCurso de la clase LibroC ali f i- www.FreeLibros.me
    • 84 Capítulo 3 Introducción a las clases, objetos, métodos y cadenas caci ones (figura 3.7) tiene un tipo de valor de retorno S tri ng enJava, por lo que eldiagrama de clases muestra un tipo de valor de retorno Strin g en UML. Las operaciones establ ecerNombreDelCurso y mostrarMensaje nodevuelvenvalores (esdecir, devuelven voi denJava), por lo queeldiagramade clases de UML noespecifica un tipo de valorde retorno después de los paréntesisde estas operaciones. li broCalificad ones - nombreDelCurso : String____________________ +establecerNombreCurso( nombre : String ) +obtEnerNombreDelCurso() : String + mostrarMensaje() Fig. 3.9 | Diagrama de clases de UML, en el que se indica que la clase LibroCal i ficacio n es tiene un atributo privado nombreDel Curso de tipo S tri ngen UML. y tresoperaciones públicas: establ ecerNombreDelCurso (con un parámetro nombre de tipo S trin g de UML), obtenerNombreDelCurso (que devuelve el tipo S tri ng de UML) y most rarMensaj e. 3.5 Comparación entre tipos primitivos y tipos por referencia Los tipos de datos en Java se dividen en dos categorías: tipos primitivos y tipos por referencia. Los tipos primitivos son boolean, byte, char, short, int, long, float y double. Todos los tipos no pri­ mitivos son tipos por referencia, por lo cual las clases, que especifican los tipos de objetos, son tipos por referencia. Una variablede tipo primitivo puede almacenar sólo un valordesutipodeclaradoa lavez. Por ejem­ plo, una variable in t puede almacenar un número entero (como 7) a la vez. Cuando se le asigna otro valor, sustituye su valor inicial. Las variables de instancia de tipo primitivo se inicializan de manerapre­ determinada; las de los tipos byte, char, short, in t, long, flo a t y double se inicializan con 0, y las de tipo bool ean se inicializan con f al se. Usted puede especificar su propio valor inicial para una varia­ ble de tipo primitivo al asignarle un valor en su declaración, como en p rivate in t numeroDeEstudiantes = 10; Recuerde que lasvariables locales nose inicializan de manera predeterminada. Tip para prevenir errores 3.1 Unintentodeutilizar unavariablelocalquenosehayainicializadoproduceunerrorde compilación. Los programas utilizan variables de tipo por referencia (que por lo general se llaman referencias) para almacenar las ubicacionesde losobjetos en la memoria dela computadora. Sediceque dichavaria­ ble hace referencia a un objeto en el programa. Cada uno de los objetos a los que se hace referencia puede contener muchas variables de instancia. La línea 14 de la figura 3.8 crea un objeto de la clase Li broCal i f i caciones, y la variable miLi broCal i f i caci ones contiene una referenciaa eseobjeto. Las variablesde instancia de tipopor referenciaseinicializan de manerapredeterminada conelvalor nu77: una palabra reservada que representa una “referencia a nada”. Esto explica por qué la primera llamada a obtenerNombreDelCurso en la línea 18 de la figura 3.8 devolvía n u il; no se había establecido el valor de nombreDelCurso, por lo que se devolvía el valor inicial predeterminado n u il. En el apéndice C se muestra una listacompleta de las palabras reservadasy las palabras clave. Cuando usamos un objeto de otra clase, es obligatorio que una referencia a él invoque (es decir, llame) asus métodos. En la aplicación de la figura 3.8, las instrucciones en el método main utilizan la www.FreeLibros.me
    • 3.6 Inicialización de objetos mediante constructores 85 variablemi Li broCal i f i caci ones paraenviarmensajes alobjeto Li broCal i f i caci ones. Estos mensajes son llamadas a métodos (como establ ecerNombreDelCurso y obtenerNombreDelCurso) que permi­ ten alprograma interactuar con el objeto Li broCal i f i caci ones. Por ejemplo, la instrucción en la línea 23 utiliza a mi LibroCal ifica cio n e s para enviar el mensaje establ ecerNombreDelCurso al objeto Li broCal i f i caci ones. Elmensajeincluyeelargumento que requiere establ ecerNomb reDelCurso para realizar su tarea. Elobjeto Li broCal i f i caciones utilizaesta información paraestablecer lavariable de instancia nombreDelCurso. Las variables de tipo primitivo no hacen referencias a objetos, por lo que dichas variables no pueden utilizarse parainvocar métodos. k r j Observación de ingeniería de software 3.3 Eltipodeclaradode una variable (por ejemplo, int, double o LibroCalificaciones) ^*=2221 indicasilavariableesdetipoprimitivooporreferencia.Sieltipodeunavariablenoesuno delosochotiposprimitivos,entoncesesuntipoporreferencia. 3.6 Inicialización de objetos mediante constructores Como mencionamos en la sección 3 .4 , cuando se crea un objeto de la clase Li broCal i f i caci ones (fi­ gura3 .7 ), suvariable de instancia nombreCurso seinicializa con nul 1 de manera predeterminada. ¿Qué pasasi desea proporcionar el nombre de un curso a la hora de crear un objeto Lib ro C a li fic a c io n e s? Cada clase que usted declare puede proporcionar un método especial llamado constructor, el cual puede utilizarse para inicializar un objeto de una clase al momento de crearlo. De hecho, Java requiere una llamada al constructor para cada objeto que se crea. La palabra clave new solicita memoria del sis­ tema para almacenar un objeto, y después llama al constructor de la clase correspondiente para inicia­ lizarelobjeto. Lallamada seindica medianteel nombre de la clase, seguido de paréntesis. Un construc­ tor debetener el mismo nombreque la clase. Por ejemplo, la Enea 14 de la figura 3.8 primero utiliza new paracrearun objeto L ib ro C a li fic a c io n e s . Los paréntesisvacíosdespuésde “ new Lib ro C al if i cacio- nes” indican una llamada sin argumentos al constructor de la clase. De manera predeterminada, el oompilador proporciona un constructor predeterminado sinparámetros, en cualquier clase que no incluya un constructor en forma explícita. Cuando una clasesólo tiene elconstructor predeterminado, sus variables de instanciase inicializan con sus valorespredeterminados. Cuando usted declara una clase, puede proporcionar su propio constructor para especificar una inicialización personalizada para los objetos de su clase. Porejemplo, tal vezquiera especificar el nombre de un curso para un objeto LibroCal i fi caci ones al momento de crear este objeto, como en LibroCalificaciones m iLibroCalificaciones = new LibroC alificaciones( “CS101 Introducción a la programación en la v a ” ) ; En este caso, el argumento “CS101 Introducción a la programación en Java” se pasa alcons­ tructor del objeto LibroCal i ficaciones y se utiliza para inicializar el nombreDelCurso. La instrucción anterior requiere que laclase proporcione un constructor con un parámetro Stri ng. La figura 3.10 con­ tiene una clase LibroCal i fi caciones modificadacon dicho constructor. 1 / / F ig . 3.10: L ib ro C a lific a c io n e s.ja v a 2 / / La clase Lib ro C a lificacio n e s con un constructor para in ic ia liz a r el nombre del curso. 3 4 public cla ss Lib ro C a lificacio n e s 5 { 6 p rivate Strin g nombreDelCurso; / / nombre del curso para este Lib ro C a lificacio n e s 7 Fig. 3.10 | Laclase LibroCal i ficaciones con un constructor para inicializar el nombre del curso (parte I de 2). www.FreeLibros.me
    • 8 6 Capítulo 3 Introducción a las clases, objetos, métodos y cadenas 8 // el constructor in ic ia liz a nombreDelCurso con unargumento String 9 public L ib ro C a lific a c io n e s( Strin g nombre ) / / elnombre del constructor es el nombre de la clase 10 { 11 nombreDelCurso = nombre; / / in ic ia liz a nombreDelCurso 12 } / / fin del constructor 13 14 / / método para establecer el nombre del curso 15 public void establecerNombreDelCurso( Strin g nombre ) 16 { 17 nombreDelCurso = nombre; / / almacena el nombre del curso 18 } / / fin del método establecerNombreDelCurso 19 20 / / método para obtener el nombre del curso 21 public Strin g obtenerNombreDelCursoO 22 { 23 return nombreDelCurso; 24 } / / fin del método obtenerNombreDelCurso 25 26 / / muestra un mensaje de bienvenida al usuario de Lib ro C a lificacio n e s 27 public void mostrarMensaje() 28 { 29 / / esta in stru cció n llama a obtenerNombreDelCurso para obtener el 30 / / nombre del curso que este Lib ro C a lificacio n e s representa 31 System .out.printfC “ Bienvenido al Libro de c a lific a c io n e s paran%s! n ", 32 obtenerNombreDelCursoO ) ; 33 } / / fin del método mostrarMensaje 34 } / / fin de la clase L ib ro C a lif icaciones________________________________________________________________ Fig. 3.10 | La clase L i broCal i f i cacio nes con un constructor para inicializar el nombre del curso (parte 2 de 2). Laslíneas9 ala 12 declaran elconstructor de LibroCal i f icaciones. Al igualqueun método, un cons­ tructorespecifica en su listade parámetros losdatos que requiere para realizarsu tarea. Cuando usted crea un nuevo objeto (como haremos en lafigura 3.11), estos datos se colocan en losparéntesisque van despuésdel nombrede¡aclase.La línea 9 de la figura 3.10 indica que el constructor tiene un parámetro Stri ng llamado nombre. Elnombre quesepasaalconstructorseasignaalavariablede instancianombreDel Cursoen lalínea 11. La figura 3.11 inicializa losobjetos L i broCal i f i ca ci ones mediante elconstructor. Las Eneas 11 y 12 crean e iniciaEzan el objeto 1i broCal ific a c io n e s 1 de L ib ro C a li fic a c io n e s . Elconstructor de la clase Lib ro C al ific a c io n e s se llama con el argumento “ CS101 In tro d u cció n a l a programación en Ja va ” parainicializarelnombredelcurso. Laexpresióndecreación de lainstanciade laclaseen lasEneas 11 y 12 devuelve una referencia al nuevo objeto, el cual se asignaa la variable l i broCal i f icacio n e s 1. LasEneas 13 y 14 repitenesteproceso, peroestavezsepasaelargumento “ CS102 E s tru c tu ra s de datos en Ja va ” parainicializarel nombre del curso para lib r o C a lif i caci ones 2. Las Eneas 17 a la20 utiEzan el método obtenerNombreDelCurso de cada objeto para obtener los nombres de los cursos y mostrar que se inicializaron en el momento en el que se crearon los objetos. LasaEda confirma que cada objeto Libro C al i f i cacio nes mantiene supropia copiade lavariable de instancia nombreDel Cu rso. Una importante diferenciaentre los constructores y los métodos es que los constructores no pue­ den devolver valores, por lo cual no pueden especificar un tipo de valor de retorno (ni siquiera voi d). Por lo general, los constructores se declaran como p u b lic . Si una clase no incluye un constructor, las variables de instancia de esa clase se inicializan con sus valores predeterminados. Si unprogramador declara uno omás constructorespara una clase, elcompiladordeJava nocreará un constructorpredetermi­ nadoparaesaclase.Por lo tanto, yano podemos crearun objeto L i broCal i f i ca ci ones con new L i bro­ Cal ific a c io n e s O como hicimos en los ejemplos anteriores. www.FreeLibros.me
    • 3.6 Inicialización de objetos mediante constructores 87 1 / / F i g . 3.11: P ru eb aLib ro C alificacio n es.java 2 / / El constructor de Lib ro C a lificacio n e s se u t iliz a para e sp e cifica r el 3// nombre del curso cada vez que se crea cada objeto LibroCal i fic a c io n e s. 4 5 public c la ss PruebaLibroC alificaciones 6 { 7 // el método main empieza la ejecución del programa 8 public s ta tic void main( S trin g [] args ) 9 { 10 / / c r e a objeto LibroCal ifica cio n e s 11 Lib ro C a lificacio n e s 1ib ro C a lific a c io n e sl = new Lib ro C alificacio n esC 12 "CS101 Introducción a la programación en lava" ) ; 13 Lib ro C a lificacio n e s 1ib ro C alificacio n e s2 = new Lib ro C alificacio n esC 14 “CS102 Estructuras de datos en lava" ) ; 15 16 / / muestra el valo r in ic ia l de nombreDelCurso para cada Lib ro C a lificacio n e s 17 System .out.printfC “El nombre del curso de 1ib ro C a lific a c io n e sl es: %sn” , 18 1ib ro C a lific a c io n e s1 .obtenerNombreDelCursoO ) ; 19 System .out.printfC “ El nombre del curso de 1ib ro C alificacio n e s2 es: %sn” , 20 libroCalificaciones2.obtenerN om breDelCursoO ) ; 21 } / / fin de main 22 } / / fin de la clase PruebaLi b ro C alificacio n es El nombre del curso de 1i broCal i fic a c io n e sl es: CS101 Introducción a l a programación en lava El nombre del curso de 1ib ro C a lificacio n e s2 es: CS102 Estructuras de datos en lava se crea un objeto Li broCal i f i caci ones. Agregarelconstructoral diagrama de clasesde UML de la clase LibroCa 7i ficac iones Observación de ingeniería de software 3.4 A menosqueseaaceptablelainicializaciónpredeterminadadelasvariablesdeinstancia desuclase, deberáproporcionarunconstructorparaasegurarsequeseinicialicenenfirma LibroCalificaciones - nombreDelCurso : String____________________________ «constructor» LibroCalificaaones( nombre : String) +establecerNombreDelCurso( nombre : String ) +obtenerNombreDelCurso() : String + mostrarMensaje() fig. 3.12 | Diagrama de clases de UML, en el cual se indica que la clase L i broCal i f i caci ones tiene un constructor con un parámetro nombre del tipo Strin g de UML. www.FreeLibros.me
    • 8 8 Capítulo 3 Introducción a las clases, objetos, métodos y cadenas Rara diferenciar a un constructor de las operaciones de una clase, UML requiere que se coloque la pa­ labra “constructor”entre los signos «y » antes del nombre del constructor. Es costumbrelistar los cons­ tructores antesdeotras operaciones en el tercer compartimiento. Constructorescon variosparámetros Algunas veces es conveniente inicializar objetos con varios elementos de datos. En el ejercicio 3.11, le pedimos que almacene el nombre del curso y del instructor en un objeto Lib ro C ali ficacio n es. En este caso, se modifica el constructor de Lib ro C ali ficacio n es para que reciba dos parámetros S tri ng,como en public Lib ro C alificacio n esC S trin g nombreDelCurso, Strin g nombreDelInstructor ) y llamamos al constructor de Li broCal i f i caci ones de lasiguiente manera: Lib ro C a lifica cio n e s lib ro C a lific a c io n e s = new Lib ro C alificacio n esC “CS101 Introducción a la programación en la v a ", "Sue Green” ) ; 3.7 Los números de punto flotante y el tipo doubl e Ahora dejaremos por un momento nuestro caso de estudio con la clase LibroCali ficaciones para declarar una clase llamada Cuenta, la cual mantiene el saldo de una cuenta bancaria. La mayoría de los saldos de las cuentas no son números enteros (por ejemplo, 0, -22 y 1024). Por esta razón, la clase Cuenta representa el saldo de las cuentas como un número de punto flotante (es decir, un número oon un punto decimal, como 7.33, 0.0973 o 1000.12345). Java cuenta con dos tipos primitivos para almacenar números de punto flotante en la memoria: float y double. La principal diferencia entre ellos es que las variables tipo double pueden almacenar números con mayor magnitud y detalle (más dígitos a la derecha del punto decimal; lo que también se conoce como precisión del número) que las variables f1oat. Precisión de losnúmerosdepuntoflotantey requerimientos de memoria Las variables de tipo float representan números de punto flotante de precisión simple y pueden representar hasta siete dígitos significativos. Las variables de tipo double representan números de punto flotante de precisión doble. Éstos requieren el doble de memoria que las variables float y proporcionan 15 dígitos significativos;aproximadamente el doble de precisión de las variables float. Para el rango de valores requeridos por la mayoría de los programas, debe bastar con las variables de tipo fl oat, pero podemos utilizar variables tipo doubl e para “ir a la segura”. En algunas aplicaciones, incluso hasta las variables de tipo double serán inadecuadas. La mayoría de los programadores re­ presentan los números de punto flotante con el tipo double. De hecho, Java trata a todos los números de punto flotante que escribimos en el código fuente de un programa (como 7.33 y 0.0975) como valores doubl e de manera predeterminada. Dichos valores en el código fuente se conocen como lite­ rales de punto flotante. En el apéndice D, Tipos primitivos, puedeconsultar los rangos de losvalores para los tipos float y doubl e. Aunque los números de punto flotante no son siempre 100% precisos, tienen numerosas aplicacio­ nes. Por ejemplo, cuando hablamos de unatemperatura corporal “normal”de 36.8, no necesitamos una precisión con un número extenso de dígitos. Cuando leemos la temperatura en un termómetro como 36.8,en realidadpodríaser36.7999473210643. Siconsideramosaestenúmero simplementecomo 36.8, estábien para lamayoríade lasaplicacionesen lasquesetrabaja con lastemperaturas corporales. Debido a la naturaleza imprecisa de los números de punto flotante, se prefiere el tipo double al tipo float ya que las variables double pueden representar números de punto flotante con más precisión. Por esta ra­ zón, utilizaremos el tipo double a lo largo de este libro. Para los números precisos de punto flotante, Javacuenta con laclase BigDecimal (paquete java.math). Los números de punto flotante también surgen como resultado de la división. En la aritmética convencional, cuando dividimos 10 entre 3 el resultado es 3-3333333..., y la secuencia de números 3 www.FreeLibros.me
    • 3.7 Los números de punto flotante y el tipo double 89 se repite en forma indefinida. Lacomputadora asignasólo una cantidad fijade espacio para almacenar un valor de este tipo, por lo que, sin duda, el valor de punto flotante almacenado sólo puede ser una aproximación. La claseCuenta con una variable de instancia de tipo double Nuestrasiguiente aplicación (figuras 3.13 y3.14) contiene unaclasellamadaCuenta(figura3.13),lacual mantiene elsaldo de una cuenta bancaria. Un banco ordinario da servicio a muchas cuentas, cada una oon su propio saldo, por lo que la línea 7 declara una variable de instancia, de tipo double, llamada saldo. La variable saldo es una variable de instancia, yaque está declarada en el cuerpo de la clase pero fuera de las declaraciones de los métodos de la misma (líneas lOala 16, 19 a la 22 y 25 a la 28). Cada instancia(objeto) de laclaseCuenta contiene su propia copia de saldo. 1 / / F ig . 3 .1 3 : C u en ta.java 2 / / La c la s e Cuenta con un co n stru cto r para v a lid a r e 3 / / i n i c i a l i z a r la v a ria b le de in s ta n c ia sald o de tip o double. 4 5 public class Cuenta 6 { 7 p r i v a t e double sa ld o ; // va ria b le de in sta n cia que almacena el saldo 8 9 / / constructor 10 p u b l i c CuentaC double s a l d o l n i c i a l ) 11 { 12 / / v a lid a que s a ld o ln ic ia l sea mayor que 0 .0 ; 13 / / s i no lo es, saldo se in ic ia liz a con el valo r predeterminado 0 .0 14 i f C s a l d o l n i c i a l > 0 . 0 ) 15 saldo = s a l d o l n i c i a l ; 16 } / / fin del constructor de Cuenta 17 18 // abona (suma) un monto a la cuenta 19 p u b l i c v o i d a b o n a r( double monto ) 20 { 21 saldo = s a ld o + monto; / / suma el monto al saldo 22 } / / fin del método abonar 23 24 / / devuelve el saldo de la cuenta 25 p u b l i c double o b t e n e r S a l d o O 26 { 27 r e t u r n s a ld o ; // proporciona el v a lo r de saldo al método que hizo la llamada 28 } / / fin del método obtenerSaldo 29 } / / f in de l a cla se Cuenta Fig. 3.13 | La clase Cuentacon un constructor para validar e inicializar la variable de instancia sal dode tipo double. La clase tiene un constructor y dos métodos. Debido a que es común que alguien abra una cuen­ ta para depositar dinero de inmediato, el constructor (líneas 10 a la 16) recibe un parámetro llamado saldolni cial de tipo doubl e, elcual representad saldoinicialde lacuenta. Las líneas 14y 15 aseguran que saldoIni cial sea mayor que 0.0. De ser así, elvalor de saldoIni ci al se asignaa lavariable de ins­ tancia saldo. En caso contrario, saldo permanece en 0.0, su valorinicial predeterminado. El método abonar (líneas 19 a la 22) nodevuelve datos cuando completa su tarea, por lo que su tipo de valor de retorno es void. El método recibe un parámetro llamado monto: un valor double que www.FreeLibros.me
    • 90 Capítulo 3 Introducción a las clases, objetos, métodos y cadenas se sumará al saldo. Lalínea 21 suma montoalvalor actual de sal do, y después asigna el resultado a sal do (con lo cual sesustituye el monto del saldo anterior). Elmétodo obtenerSaldo (líneas25 ala28) permitealosclientesdelaclase(otrasclasesque utilicen estaclase)obtenerelvalordel sal do de un objeto Cuenta específico. Elmétodo especificaeltipo devalor de retorno double y una lista de parámetros vacía. Observe una vez más que las instrucciones en las líneas 15,21 y 27 utilizan lavariable de instancia saldo, aún y cuando nose declaró en ninguno de los métodos. Podemos usar saldo en estos métodos, ya que es una variablede instancia de la clase. La clase PruebaCuenta que utiliza a la claseCuenta Laclase PruebaCuenta (figura 3.14) creados objetos Cuenta (líneas 10 y 11) y los inicializa con 50.00 y -7.53, respectivamente. Las líneas 14 a la 17 imprimen el saldo en cada objeto Cuenta mediante una llamada al método obtenerSaldo de Cuenta. Cuando se hace una llamada al método obtenerSaldo para cu ent a l en la línea 15, se devuelve el valor del saldo de cuental de la línea 27 en la figura 3.13, y se imprime en pantalla mediante la instrucción System, out. pri n tf (figura 3.14, líneas 14 y 15). De manera similar, cuando se hace la llamada al método obtenerSaldo para cuenta2 en la línea 17, se devuelve el valor del saldo de cuenta2 de la línea 27 en la figura 3.13, y se imprime en pantalla me­ diante la instrucción System, out .p ri n tf (figura 3.14, líneas 16y 17). El saldo de cuenta2 es 0.00, ya que el constructor se aseguró de que la cuenta no pudiera empezar con un saldo negativo. El valor se imprime en pantalla mediante pri n tf, con el especificador de formato % .2f. El especificador de for­ mato %f se utiliza para imprimir valores de tipo flo a t o doubl e. El .2 entre %y f representa el número de lugares decimales (2) que deben imprimirse a la derecha del punto decimal en el número de punto flotante; a esto también se le conoce como la precisión del número. Cualquier valor de punto flotante que se imprima con %.2f se redondeará a la posición de las centenas; por ejemplo, 123.457 se redondea­ ría a 123.46, 27.333 se redondearía a 27.33 y 123.455 se redondearía a 123.46. 1 / / F i g . 3 . 1 4 : P ru eb aC ue nta .ja va 2 // Ent rad a y s a l i d a de números de punto f l o t a n t e con o b j e t o s Cuenta. 3 import ja v a .ú t il. Scanner; 4 5 public cla ss PruebaCuenta 6 { 7 / / el método main empieza l a e j e c u c i ó n de l a a p l i c a c i ó n de l a v a 8 public s t a t ic void main( S trin g [] args ) 9 { 10 Cuenta cuental = new CuentaC 50.00 ) ; / / c r e a o b j e t o Cuenta 11 Cuenta cuenta2 = new CuentaC - 7 . 5 3 ) ; / / cr e a o b j e t o Cuenta 12 13 // muestra el s a ld o i n i c i a l de cada o b j e t o 14 System .out.printfC “ Saldo de c u e n t a l : $ % . 2 f n ” , 15 cuental.obtenerSaldoO ) ; 16 S y s t e m . o u t . p r i n t f C “ Saldo de cuenta2: $ % .2 f n n ” , 17 cuenta2.obtenerSaldoO ) ; 18 19 / / cr e a o b j e t o Scanner para o bt e ne r l a entr ada de l a ventana de comandos 20 Scanner entrada = new ScannerC System .in ) ; 21 double montoDeposito; / / d e p o s it a el monto e s c r i t o p o r el u su a r io Fig.3.14 | Entrada ysalida de númerosde punto flotante con objetos Cuenta (parte I de 2). www.FreeLibros.me
    • 3.7 Los números de punto flotante y el tipo double 91 22 23 System .out.printC “Escriba el monto a depositar para cu en tal: ” ) ; // indicador 24 montoDeposito = entrada.nextDoubleO ; / / obtiene entrada delusuario 25 System .out.printfC “nsumando % . 2 f al saldo de cu en taln n ", 26 montoDeposito); 27 cuental.abonarC montoDeposito ) ; / / suma a l saldo de cuental 28 29 / / muestra lo s saldos 30 System .out.printfC “ Saldo de cuental: $% .2fn” , 31 cuental.obtenerSaldoO ) ; 32 System .out.printfC “Saldo de cuenta2: $% .2fnn” , 33 cuenta2 .obtenerSaldoO ) ; 34 35 System .out.printC “Escriba el monto a depositar para cuenta2: ” ) ; // indicador 36 montoDeposito = entrada.nextDoubleO ; / / obtiene entrada delusuario 37 System .out.printfC “nsumando % .2f al saldo de cuenta2nn” , 38 m ontoDeposito); 39 cuenta2.abonarC montoDeposito ) ; / / suma a l saldo de cuenta2 40 41 / / muestra lo s saldos 42 System .out.printfC “ Saldo de cuental: $% .2fn” , 43 cuental.obtenerSaldoO ) ; 44 System .out.printfC “ Saldo de cuenta2: $% .2fn” , 45 cuenta2 .obtenerSaldoO ) ; 46 } / / fin de main 47 } / / fin de la clase PruebaCuenta Saldo de cuental: $50.00 Saldo de cuenta2: $0.00 Escrib a el monto a depositar para cuental: 25.53 sumando 25.53 al saldo de cuental Saldo de cuental: $75.53 Saldo de cuenta2: $0.00 Escrib a el monto a depositar para cuenta2: 123.45 sumando 123.45 al saldo de cuenta2 Saldo de cuental: $75.53 Saldo de cuenta2: $123.45 Fig. 3 .14 | Entrada y salida de números de punto flotante con objetos Cuenta (parte 2 de 2). La línea 21 declara lavariable local montoDeposito para almacenar cada monto de depósito intro­ ducido por el usuario. A diferencia de lavariable de instancia sald o en la clase Cuenta, la variable local montoDeposito en mai n no se inicializacon 0.0 de manera predeterminada. Sin embargo, esta variable no necesita inicializarse aquí, yaquesu valor sedeterminará con base a la entrada del usuario. La línea 23 pide al usuario que escriba un monto a depositar para cuen tal. La línea 24 obtiene la entrada del usuario, llamando al método nextDouble del objeto Scanner llamado entrada, el cual devuelve un valor doubl e introducido por el usuario. Laslíneas 25 y26 muestran el monto del depósito. www.FreeLibros.me
    • 92 Capítulo 3 Introducción a las clases, objetos, métodos y cadenas La línea27 llamaal método abonar del objeto cuental y lesuministra montoDepositocomo argumento. Cuando se hace la llamada al método, elvalor del argumento seasignaal parámetro monto (línea 19 de la figura 3.13) del método abonar (líneas 19 a la 22 de la figura 3.13); después el método abonar suma ese valor al sal do (línea 21 de la figura 3.13). Laslíneas 30 a la 33 (figura 3.14) imprimen en pantallalos sal­ dosdeambosobjetos Cuenta otravez, paramostrarquesólo semodificó elsaldo de cu ental. La línea 35 pide al usuario que escriba un monto a depositar para cuenta2. La línea 36 obtiene laentrada del usuario, para lo cual invoca al método nextDoubl e del objeto Scanner llamado entrada. Laslíneas 37 y 38 muestran elmonto deldepósito. La línea 39 llamaalmétodo abonar delobjeto cu en- ta2 y lesuministra montoDeposi to como argumento; después, elmétodo abonarsumaesevalor alsaldo. Por último, las líneas 42 a la45 imprimen en pantalla los saldos de ambosobjetos Cuenta otra vez, para mostrar quesólo semodificó elsaldo de cuenta2. Diagrama de clasesde UMLpara la claseCuenta El diagrama de clases de UML en la figura 3.15 modela la clase Cuenta de la figura 3.13. El diagrama modela el atributo p rivate llamado saldo con el tipo Double de UML, para que corresponda a lavaria­ ble de instancia saldo de la clase, que tiene el tipo double de Java. Modela el constructor de la clase Cuenta con un parámetro sa ld o ln ic ia l del tipo Double de UML en el tercer compartimiento de la clase. Los dos métodos publ ic de la clase se modelan como operaciones en el tercer compartimiento también. El diagrama también modela la operación abonar con un parámetro monto de tipo Double de UML (ya que el método correspondiente tiene un parámetro monto de tipo doubl e en Java) y la operación obtenerSaldo con un tipo de valor de retorno Double (ya que el método correspondiente enJavadevuelve un valor doubl e). Cuenta -s a ld o : Double________________________________ «constructor» Cuenta{ saldolnicial: Double ) +abonar( monto : Double ) +obtenerSaldo() : Double Fig. 3.15 | Diagrama de clases de UML, el cual indica que la clase Cuentatiene un atributo p rivate llamado saldo, con el tipo Double de UML, un constructor (con un parámetro de tipo Double de UML) y dos operaciones public: abonar (con un parámetromonto de tipo Double de UML) y obtenerSaldo (devuelve el tipo Double de UML). 3.8 (Opcional) Caso de estudio de GUI y gráficos: uso de cuadros de diálogo Este caso de estudio opcional está diseñado para aquellos que desean empezar a conocer las poderosas herramientas de Java para crear interfaces gráficas de usuario (GUI) y gráficos antes de los principales debates de estos temas en elcapítulo 14 (en elsitio Web del libro), Componentes de la GUI: Parte 1, el capítulo 15 (también en el sitio Web), Gráficos yJava 2D, y el capítulo 25, Componentes de la GUI: Parte2 (en inglés, en elsido Web). El caso de estudio de GUI y gráficos aparece en 10 secciones breves (vea la figura 3.16). Cada sección introduce unos cuantos conceptos básicosyproporcionaejemploscon capturas depantallaque muestran interacciones de ejemplo y resultados. En las primeras secciones, creará sus primeras aplica­ ciones gráficas. En las secciones posteriores, utilizará los conceptos de programación orientada aobje- www.FreeLibros.me
    • 3.8 (Opcional) Caso de estudio de GUI y gráficos: uso de cuadros de diálogo 93 tos para crear una aplicación que dibuja una variedad de figuras. Cuando presentemos de manera formal las GUI en el capítulo 14, utilizaremos el ratón para elegir con exactitud qué figuras dibujar y en dónde. En el capítulo 15, agregaremos las herramientas de la API de gráficos en 2D de Java para dibujar las figurascon distintos grosores delíneay rellenos. Esperamos que esteejemplo práctico le sea informativo y divertido. Ubicación Título - Ejercicio(s) Sección 3.8 Uso decuadrosdediálogo: entrada ysalida básica con cuadrosdediálogo Sección 4.14 Creación de dibujossimples: mostrarydibujar líneasenla pantalla Sección 5.10 Dibujo de rectángulosyóvalos: usode figuraspara representar datos Sección 6.13 Colores yfigurasrellenas: dibujar un tiro al blanco ygráficosaleatorios Sección 7.15 Dibujo dearcos: dibujar espiralescon arcos Sección 8.16 Uso de objetos con gráficos: almacenar figuras como objetos Sección 9.8 Mostrartexto eimágenes usando etiquetas: proporcionarinformación deestado Sección 10.8 Realizardibujos usando polimorfismo: identificarlassimilitudesentre figuras Ejercicio 14.17 Caso deestudio de GUI ygráficos: expansión de la interfaz Ejercicio 15.31 Caso deestudio de GUI ygráficos: AgregarJava 2D Fig. 3.16 | Resumen del caso de estudio de GUI y gráficos en cada capítulo. Cómo mostrar texto en un cuadro de diálogo Losprogramasque hemos presentado hastaahora muestransusalidaen laventanadecomandos. Muchas aplicaciones utilizanventanas,o cuadrosde diálogo (también llamadosdiálogos) paramostrar lasalida. Porejemplo,los navegadoresWebcomo Firefbx,Internet Explorer,ChromeySafari muestran laspáginas Webensus propiasventanas. Los programasdecorreo electrónico lepermiten escribiry leermensajesen unaventana. Por logeneral, loscuadrosde diálogo son ventanasen lasque losprogramas muestran men­ sajes importantes a los usuarios. La clase JOptionPane cuenta con cuadros de diálogo prefabricados, los cuales permiten a los programas mostrar ventanas que contengan mensajes; a dichas ventanas se les co­ nocecomo diálogos de mensaje. Lafigura3.17 muestraelobjeto String “Bienveni donanJava" en un diálogo de mensaje. 1 / / F ig - 3.17: D ialo g o l.java 2 / / Uso de JOptionPane para im prim ir va ria s lin e a s en un cuadro de diálogo. 3 import javax.sw ing.JO ptionPane; // importa la clase JOptionPane 4 5 public cla ss Dialogol 6 { 7 public s ta tic void main( S trin g [] args ) 8 { 9 / / muestra un cuadro de diálogo con un mensaje 10 JOptionPane.showMessageDialog( n u il, “ BienvenidonanJava” ) ; 11 } / / fin de main 12 } / / fin de la clase D ialogol____________________________________________________________ Fig. 3 .17 | Uso de JOptionPane para mostrar varias líneas en un cuadro de diálogo (parte I de 2). www.FreeLibros.me
    • 94 Capítulo 3 Introducción a las clases, objetos, métodos y cadenas Meiuaje (T N Bienvenido W • Java [ Aceptar 1 Fig. 3.17 | Uso de JOptionPane para mostrar varias líneas en un cuadro de diálogo (parte 2 de 2). La línea 3 indica que el programa utiliza la clase JOptionPane del paquete javax.sw ing. El cual oontiene muchas clases que le ayudan a crear interfaces gráficas de usuario (GUI). Los componentes de la GUI facilitan laentrada de datos al usuario del programa, y la presentación de los datos de salida. La Enea 10 llama al método shovrtlessageDialog de JOptionPane para mostrar un cuadro de diálogo que contiene un mensaje. El método requiere dos argumentos. El primero ayudaaJavaa determinar en dónde colocar elcuadro de diálogo. Por lo general, un diálogo se muestra desde una aplicación de GUI oonsupropiaventana. Elprimer argumento hacereferenciaaesaventana (conocidacomo ventanapadre) y hace queeldiálogo aparezcacentrado sobre laventana de laaplicación. Sielprimer argumento es nuil, el cuadro de diálogo aparece en el centro de lapantalla de lacomputadora. El segundo argumento es el objeto S tri ng a mostrar en el cuadro de diálogo. Introducción de losmétodoss ta tic Elmétodo shov^essageDialog de laclase JOptionPane es lo que llamamos un método s ta tic . A me­ nudo,dichos métodos definen las tareas que seutilizan con frecuencia. Por ejemplo, muchos programas muestran cuadrosde diálogo, y elcódigo para haceresto es el mismo siempre. Envez deque usted tenga que “reinventar la rueda” y crear código para realizar esta tarea, los diseñadores de la clase JOptionPane declararon un método s ta ti cque realizaesta tarea por usted. La llamada a un método sta t i cse realiza mediante el uso del nombre de su clase, seguido de un punto (.) y del nombre del método, como en NombreClase.nombreMétodo{ argumentos ) Observe que «0tiene que crear un objeto de laclase JOptionPane para usar su método s t a t ic llamado showMessageDialog. En el capítulo 6 analizaremos los métodos s ta ti ccon más detalle. Introducir texto en un cuadro de diálogo La aplicación de la figura 3.18 utilizaotro cuadro de diálogo JOptionPane predefinido, conocido como diálogo de entrada, el cualpermite alusuario introducirdatos en un programa. Éstepide el nombre del usuario, y responde con un diálogo de mensaje que contiene un saludo y el nombre introducido por el usuario. Las Eneas 10y 11 utiEzan el método showInputDialog de JOptionPane para mostrar un diálogo de entrada que contiene un indicador y un campo (conocido como campo de texto), en donde el usuario puede escribir texto. El argumento del método showInputDialog es el indicador que muestra lo que el usuario debe escribir. El usuario escribe caracteres en el campo de texto, y después hace cÜc en el botón Aceptar u oprime lateclaIntroparadevolver el objeto S tri ng al programa. El método showInputDi alog (Enea 11) devuelve un objeto S tri ng que contiene los caracteres escritos por el usuario. Almacenamos el objeto Strin g en lavariable nombre (Enea 10). [Nota:sioprime elbotón Cancelaren elcuadro dediálogo uoprime Esc,el método devuelve nu ll y elprogramamuestralapalabraclave “nuil”como el nombre]. Las Eneas 14 y 15 utilizan el método s ta ti c S tri ng llamado format para devolver un objeto S tri ng que contiene un saludo con el nombre del usuario. El método format es similar al método System.out. pri n tf, excepto que fo rmat devuelveel objeto S tri ng con formato, en vezde mostrarloen una ventana de comandos. LaEnea 18muestraelsaludoenun cuadrodediálogodemensaje,comohicimosen lafigura3.17. www.FreeLibros.me
    • 3.9 Conclusión 95 1 / / F i g . 3.18: DialogoNombre. java 2 / / Entrada básica con un cuadro de diálogo. 3 import javax.sw ing.JO ptionPane; 4 5 public cla ss DialogoNombre 6 { 7 public s t a t ic void main( S trin g [] args ) 8 { 9 // pide al usuario que escrib a su nombre 10 Strin g nombre = 11 JOptionPane.showInputDialogC "Cual es su nombre?” ) ; 12 13 / / crea el mensaje 14 Strin g mensaje = 15 String.form atC “ Bienvenido, %s, a la programación en Ja v a !” , nombre ) ; 16 17 / / muestra el mensaje para dar la bienvenida al usuario por su nombre 18 JOptionPane.showMessageDialog( n u il, mensaje ) ; 19 } / / fin de main 20 } / / fin de la clase DialogoNombre Entrad* Menta* I w Ú - T / T _ ^ Paul Bienvenido. Paul, a la programación en Java.' 1 ^A ceptar j Cancelar 1 Aceptar j k Fig. 3.18 | Cómo obtener la entrada del usuario mediante un cuadro de diálogo. Ejercicio delejemplopráctico de GUIy gráficos 3.1 Modifiqueelprograma desuma en lafigura2.7 parausarlaentrada ysalidacon baseenelcuadrodediálogocon losmétodosdelaclaseJOpt ionPane. ComoelmétodoshowlnputDialog devuelveun objeto St ri ng, debeconver­ tirelobjeto Stri ng queintroduceel usuarioa un i nt parausarloen loscálculos. Elmétodo stati c parselnt de la clase Integer recibe un argumento String que representa un entero (es decir, el resultado de JOptionPane. showInputDial og) ydevuelveelvalorcompletocomoun número i nt.Elmétodo parselnt esun método stati c de laclase Integer (del paquete java.lang). Siel objeto String no contiene un entero válido, el programa ter­ minarácon un error. 3.9 Conclusión En este capítulo aprendió a declararvariables de instancia de una clase para mantener los datos de cada objeto, ycómo declararmétodos queoperen sobre esosdatos. Aprendió cómo llamara un método para decirle que realice su tarea y cómo pasar información a los métodos en forma de argumentos. Vio la diferenciaentre una variablelocal de un método y una variable de instancia de una clase, y que sólo las variables de instancia seinicializan en forma automática. También aprendió a utilizar elconstructor de una clase para especificar los valores iniciales para las variables de instancia de un objeto. A lo largo delcapítulo, vio cómo puede usarseUML paracreardiagramasdeclasesque modelen losconstructores, métodos y atributos de las clases. Por último, aprendió acerca de los números de punto flotante: cómo almacenarlos con variables del tipo primitivo double, cómo recibirlos en forma de datos de entrada www.FreeLibros.me
    • 96 Capítulo 3 Introducción a las clases, objetos, métodos y cadenas mediante un objeto Scanner y cómo darles formato con pri ntf y el especificador de formato %f para fines de visualización. En el siguiente capítulo empezaremos nuestra introducción a las instrucciones de control, las cuales especifican el orden en el que se realizan las acciones de un programa. Utilizará estas instrucciones en sus métodos para especificar cómo deben realizar sus tareas. Resumen Sección3.2 Declaración de unaclasecon un método e instanciamiento de un objeto de una clase • Cada declaración de clase que empieza con el modificador de acceso publ i c (pág. 72) debe almacenarse en un archivo que tenga exactamente el mismo nombre que la clase, y que termine con la extensión de nombre de archivo .j ava. • Cada declaración de clase contiene la palabra clave class, seguida inmediatamente por el nombre de la clase. • La declaración de un método que empieza con la palabra clave publ i c indica que a ese método lo pueden llamar otras clases declaradas fuera de la declaración de esa clase. • La palabra clave void indica que un método realizará una tarea, pero no devolverá información cuando la termine. • Porconvención, losnombresde losmétodosempiezan con la primera letraenminúscula, y todaslaspalabrassubsiguientes en el nombre empiezan con la primera letra en mayúscula. • Los paréntesis vacíos después del nombre de un método indican que éste no requiere parámetros para realizar su tarea. • El cuerpo de todos los métodos está delimitado por llaves izquierda y derecha ({ y }). • El cuerpo de un método contiene instrucciones que realizan la tarea de éste. Una vez que se ejecutan las instrucciones, el método ha terminado su tarea. • Cuando intentamos ejecutar una clase, Java busca el método main de la clase para empezar la ejecución. • Por lo general, no podemos llamar a un método que pertenece a otra clase, sino hasta crear un objeto de esa clase. • Una expresión de creación de instancia de clase (pág. 74) empieza con la palabra clave newy crea un nuevo objeto. • Para llamar a un método de un objeto, se pone después del nombre de la variable un separador punto (.; pág. 75), el nombre del método y un conjunto de paréntesis que contienen los argumentos del método. • En UML, cada clase se modela en un diagrama de clases en forma de rectángulo con tres compartimientos. El compartimiento superior contiene el nombre de la clase, centrado horizontalmente y en negrita. El compartimiento intermedio contiene los atributos de la clase, que corresponden a los campos en Java. El compartimiento inferior contiene las operaciones de la clase (pág. 76), que corresponden a los métodos y constructores en Java. • Para modelarlasoperaciones, UM Lenumerael nombre déla operación, seguido de un conjunto de paréntesis. Un signo más (+) enfrente del nombre de la operación indica que ésta es una operación public en UML (es decir, un método publ i cen Java). Sección3.3 Declaración de un método con unparámetro • A menudo, los métodos requieren parámetros (pág. 76) para realizar sus tareas. Dicha información adicional se proporciona mediante argumentos en las llamadas a los métodos. • El método nextLine de Seanner (pág.76) leecaractereshasta encontraruna nueva líneaydespués devuelve los caracteres que leyó en forma de un objeto Stri ng. • El método next de Scanner (pág. 77) lee caracteres hasta encontrar cualquier carácter de espacio en blanco, y después devuelve los caracteres que leyó en forma de un objeto Str i ng. • Un método que requieredatos para realizarsu tarea debeespecificaresto en sudeclaración, para locualcolocainformación adicional en la lista de parámetros del método (pág. 76). • Cada parámetro debe especificar tanto un tipo como un nombre de variable. www.FreeLibros.me
    • Resumen 97 • Cuando se hace la llamada a un método, sus argumentos se asignan a sus parámetros. Entonces, el cuerpo del método utiliza las variables de los parámetros para accedera los valores de los argumentos. • Un método especifica varios parámetros en una lista separada por comas. • El número de argumentos en la llamada a un método debe coincidir con el de los parámetros en la lista de parámetros de la declaración del método. Además, los tipos de los argumentos en la llamada al método deben ser consistentes con los de los parámetros correspondientes en la declaración de éste. • La clase Stri ng está en el paquete j ava. 1ang, que por lo general se importa de manera implícita en todos los archivos de código fuente. • De manera predeterminada, las clases que se compilan en el mismo directorio están en el mismo paquete. Las clases en el mismo paquete se importan implícitamente en los archivos de código fuente de las otras clases que están en el mismo paquete. • Las declaraciones i mport no son obligatorias si usamos siempre nombres de clasescompletamente calificados (pág. 79). • Para modelar un parámetro de una operación, UML lista el nombre del parámetro, seguido de dos puntos y el tipo del parámetro entre los paréntesis que van después del nombre de la operación. • UML tiene sus propios tipos de datos, similares a los de Java. No todos los tipos de datos de UML tienen los mismos nombres que los tipos correspondientes en Java. • El tipo String de UML corresponde al tipo String de Java. Sección3.4 Variablesde instancia, métodosestablecery métodosobtener • Las variables que se declaran en el cuerpo de un método son variables locales, y pueden utilizarse sólo en ese método. • Por lo general, una clase consiste en uno o más métodos que manipulan los atributos (datos) pertenecientes a un objeto específico de esa clase. Dichas variables se llaman campos y se declaran dentro de la declaración de una clase, pero fuera de los cuerpos de las declaraciones de los métodos de esa clase. • Cuando cada objeto de una clase mantiene su propia copia de un atributo, al campo correspondiente se leconoce como variable de instancia. • Las variables o métodos declarados con el modificador de acceso private sólo están accesibles para los métodos de la clase en la que están declarados. • Al proceso de declarar variables de instancia con el modificador de acceso private (pág. 80) se le conoce como ocultamiento de datos. • Un beneficio de los campos es que todos los métodos de la clase pueden usarlos. Otra diferencia entre un campo y una variable local es que un campo tiene un valor inicial predeterminado (pág. 82), que Java proporciona cuando el programador no especifica elvalor inicial del campo, pero una variable local no hace esto. • El valor predeterminado para un campo de tipo Stri ng (o cualquier otro tipo por referencia) es nul 1. • Cuando se llama a un método que especifica un tipo de valor de retomo (pág. 73) y completa su tarea, devuelve un resultado al método que lo llamó (pág. 73). • A menudo, las clases proporcionan métodos publ i cpara permitir que los clientes de la clase establezcanu obtengan variables de instancia private (pág. 83). Los nombres de estos métodos no necesitan comenzar con estableceru obtener, pero esta convención de nomenclatura es muy recomendada en Java, y requerida para ciertos componentes de software de Java especiales, conocidos como JavaBeans. • UML representa a las variables de instancia como un nombre de atributo, seguido de dos puntos y el tipo del atributo. • En UML, los atributos privados van precedidos por un signo menos (-). • Para indicar el tipo de valorde retomo de una operación, UML coloca dos puntos y el tipo de valor de retomo después de los paréntesis que siguen del nombre de la operación. • Los diagramas de clases de UML (pág. 75) no especifican tipos de valores de retomo para las operaciones que no devuelven valores. Sección3.5 Comparación entre tiposprimitivosy tipospor referencia • En Java, los tipos sedividen en dos categorías: tipos primitivos y tipos por referencia. Los tipos primitivos son bool ean, byte, char, short, int, long, float y double. Todos los demás tipos son por referencia, por lo cual, las clases que especifican los tipos de los objetos, son tipos por referencia. www.FreeLibros.me
    • 98 Capítulo 3 Introducción a las clases, objetos, métodos y cadenas • Unavariablede tipoprimitivopuedealmacenarexactamenteun valordesutipodeclarado,en unmomentodado. • Lasvariablesdeinstancia de tipos primitivosseinicializan de manera predeterminada.Lasvariablesde lostipos byte, char, short, int, long, floatydoubleseinicializancon 0.Lasvariablesdetipo boolean seinicializancon false. • Lasvariablesde tiposporreferencia(llamadas referencias;pág. 84)almacenan laubicaciónde un objetoen lamemoria de lacomputadora. Dichasvariables hacen referenciaa losobjetosen el programa. Elobjeto al que sehace referencia puedecontenermuchasvariablesdeinstanciaymétodos. • Loscamposde tipo porreferenciaseinicializandemanera predeterminadaconelvalor nul1. • Parainvocara losmétodos de instancia de un objeto, serequiereuna referenciaa éste (pág. 84). Una variablede tipo primitivono hacereferenciaaun objeto, por locualno puede usarseparainvocaraun método. Sección3.6 Inicialización de objetosmediante constructores • La palabra clave newsolicita memoria del sistemapara almacenarun objeto, ydespuésllamaalconstructorde laclase correspondiente (pág.74) parainicializarelobjeto. • Un constructor puede usarseparainicializarun objetodeuna clase,alahora decrearlo. • Losconstructorespueden especificarparámetros, perono tiposdevaloresde retomo. • Si una claseno defineconstructores, el compilador proporciona uno predeterminado (pág. 85) sin parámetros, ylas variablesdeinstanciadelaclaseseinicializan consusvalorespredeterminados. • UMLmodelaalosconstructoreseneltercercompartimientodeundiagramadeclases.Paradiferenciaraunconstructor con baseenlasoperacionesdeuna clase, UMLcolocalapalabra“constructor”entre lossignos«y»(pág. 88)antesdel nombredeéste. Sección3.7 Losnúmerosdepuntoflotantey el tipo doubl e • Un número de punto flotante (pág. 88) es un número con un punto decimal.Java proporciona dos tipos primitivos paraalmacenarnúmerosdepunto flotante(pág. 88)enlamemoria: f1oaty double.Laprincipaldiferenciaentreestos tiposesque lasvariables double puedenalmacenar númeroscon mayormagnitud ydetalle (aesto seleconocecomo laprecisióndelnúmero; pág. 88)quelasvariables float. • Lasvariablesde tipo float representan númerosdepunto flotantede precisión simple, ytienen sietedígitossignifica­ tivos.Lasvariablesde tipo doublerepresentan númerosde punto flotantede precisión doble. Éstos requieren eldoble de memoria que las variables float y proporcionan 15 dígitos significativos; tienen aproximadamente el doble de precisióndelasvariables float. • Lasliteralesdepunto flotante (pág. 88)sonde tipodoubledemanerapredeterminada. • Elmétodo nextDoublede Scanner(pág. 91)devuelveun valordouble. • El especificador de formato %f (pág. 90) se utiliza para mostrar valores de tipo float o double. El especificador de formato %.2fespecificaque sedeben mostrardosdígitosde precisión (pág. 90) a laderecha del punto decimal, en el númerode punto flotante. • El valorpredeterminado para un campo de tipo doublees0.0, yelvalorpredeterminado para un campo de tipo int esO. Ejercicios de autoevaluación 3.2 Complete lassiguientesoraciones: a) Cada declaración de clase que empieza con la palabra clave_______ debealmacenarse en un archivo que tengaexactamenteelmismonombre de laclase, yqueterminecon laextensióndenombredearchivo .java. b) En ladeclaracióndeunaclase,lapalabraclave________vaseguidainmediatamenteporelnombredelaclase. c) Lapalabraclave_______ solicitamemoriadelsistemaparaalmacenarun objeto,ydespuésllamaalconstruc­ tordelaclasecorrespondienteparainicializarlo. d) Cada parámetrodebeespecificarun(a)_______ yun(a)_________ e) De manera predeterminada, seconsidera que las clases que secompilan en el mismo directorio están en el mismopaquete,conocidocomo________ www.FreeLibros.me
    • Respuestas a los ejercicios de autoevaluación 99 f) Cuando cada objeto de una clasemantiene su propia copia de un atributo, el campo que representa a este atributoseconocetambiéncomo________ g) Javaproporcionados tipos primitivosparaalmacenarnúmerosdepunto flotanteen lamemoria:________y h) Lasvariablesdetipo double representanalosnúmerosde punto flotante________ i) Elmétodo_______ delaclaseScannerdevuelveun valordouble. j) Lapalabraclavepubl1cesun_______ deacceso. k) Eltipodevalorderetomo________indicaqueun métodono devolveráun valor. 1) El método________de Scanner lee caracteres hasta encontrar una nueva línea y después devuelve esos caracterescomoun objeto Stri ng. m) La clase Stri ng estáen elpaquete________ n) No se requiere un(a)________si siempre hacemos referencia a una clase con su nombre completamente calificado. 0) Un(a)________esun númerocon un puntodecimal,como 7.33,0.0975 o 1000.12345. p) Lasvariablesdetipo float representan númerosdepunto flotante________ q) Elespecificadordeformato________seutilizaparamostrarvaloresdetipofloato double. r) LostiposenJavasedividenen doscategorías: tipos________y tipos________ 3.3 Contestecon verdaderoofalsoacadaunadelassiguientesproposiciones;encasodeserfalso,expliqueporqué. a) Por convención, los nombres de los métodos empiezan con la primera letra en mayúscula, en el nombre todaslaspalabrassubsiguientescomienzancon laprimeraletraenmayúscula. b) Una declaración importno esobligatoriacuandouna claseen un paquete utilizaaotraen elmismopaquete. c) Losparéntesisvacíos quevan despuésdel nombrede un método en su declaración indican que no requiere parámetrospararealizarsutarea. d) Las variables o los métodos declarados con el modificador de acceso private son accesibles sólo para los métodosdelaclaseen laquesedeclaran. e) Unavariablede tipoprimitivopuedeusarseparainvocarun método. f) Las variablesque sedeclaran en el cuerpo de un método específicoseconocen como variablesdeinstancia, ypueden utilizarseentodos losmétodosdelaclase. g) Elcuerpodecadamétodoestádelimitadoporllavesizquierdayderecha ({ y }). h) Lasvariableslocalesdetipo primitivo seinicializandemanera predeterminada. 0 Lasvariablesdeinstanciade tipopor referenciaseinicializandemanerapredeterminada conelvalornull. j) Cualquierclase quecontenga public static void main( String[] args ) puede usarsepara ejecutaruna aplicación. k) El número deargumentosenlallamadaaun método debecoincidircon elde parámetrosenla listade pará­ metrosdeladeclaracióndelmétodo. 1) Losvalores depunto flotante queaparecen en código fuente seconocen como literales de punto flotante, y son de tipof1oatdemanera predeterminada. 3.4 ¿Cuálesladiferenciaentreuna variablelocalyun campo? 3.5 Explique el propósito de un parámetro de un método. ¿Cuál es la diferencia entre un parámetro y un argumento? Respuestas a los ejercicios de autoevaluación 3.1 a) public. b) class. c)new.d) tipo, nombre,e)paquetepredeterminado, f)variabledeinstancia. g)f loat, double. h)de precisióndoble, i)nextDouble. j)modificador, k) void. 1)nextLine. m)java.lang.n)declaración import. o)núme­ rode puntoflotante, p)de precisión simple,q)%f.r) primitivo, por referencia. 3.2 a) Falso. Porconvención, losnombres de losmétodos empiezan con una primera letraen minúscula ytodas las palabrassubsiguientesconuna letraenmayúscula, b)Verdadero,c)Verdadero,d)Verdadero,e)Falso.Unavariabledetipo www.FreeLibros.me
    • 100 Capítulo 3 Introducción a las clases, objetos, métodos y cadenas primitivo no puede usarsepara invocara un método; se requiere una referenciaa un objeto para invocara sus métodos. 0 Falso. Dichas variables se llaman variables locales, y sólo se pueden utilizar en el método en el que están declaradas, g) Verdadero, h) Falso. Lasvariables de instancia de tipo primitivo seinicializan de manera predeterminada. Acada va­ riablelocalse ledebeasignarun valor de manera explícita, i)Verdadero, j)Verdadero, k) Verdadero. 1)Falso. Dichas li­ teralessonde tipodoubledemanera predeterminada. 3.3 Una variable localse declara en el cuerpo de un método, ysólo puede utilizarse desde el punto en el que sede­ claró, hastaelfinal deladeclaracióndelmétodo. Un camposedeclaraen una clase, perono enelcuerpodealgunode los métodosdeella.Además, loscamposestánaccesiblesparatodoslosmétodosdelaclase. (Enelcapítulo 8,Clasesyobjetos: unanálisismásdetallado,veremosunaexcepcióna esto). 3.4 Un parámetro representala información adicional que requiere un método para realizarsu tarea. Cada paráme­ trorequeridoporun métodoestáespecificadoenladeclaracióndelmétodo. Un argumentoeselvaloractualparaun pará­ metrodelmétodo. Cuandosellamaaunmétodo, losvaloresdelosargumentossepasanasusparámetroscorrespondientes paraqueéstepuedarealizarsutarea. Ejercicios 3.5 (Palabraclavenew)¿Cuáleselpropósitodelapalabra clavenew?Expliqueloqueocurrecuandoseutilizaen una aplicación. 3.6 (Constructorespredeterminados) ¿Qué es un constructor predeterminado? ¿Cómo se inicializan las variables deinstanciadeun objeto, siunaclasesólotieneun constructor predeterminado? 3.7 (Variablesdeinstancia) Expliqueelpropósitodeunavariabledeinstancia. 3.8 (Usar clasessin importarlas) La mayoría de las clases necesitan importarse antes de poder utilizarlas en una aplicación ¿Porquécualquieraplicación puede utilizarlasclasesSys tem y S tri ng sintenerqueimportarlasprimero? 3.9 (Usarunaclasesinimportarla) Expliquecómo podríaun programautilizarlaclaseScanner sinimportarla. 3.10 (Métodos establecery obtener) Explique por qué una clase podría proporcionar un método establecer y un métodoobtenerparaunavariabledeinstancia. 3.11 (ClaseLibroCalIficacionesmodificada)Modifiquelaclase LibroC ali ficacio n es (figura3.10) de lasiguiente manera: a) Incluyaunasegundavariabledeinstancia S tri ng,que representeelnombre delinstructordel curso. b) Proporcione un método establecerpara modificar el nombre del instructor, y un método obtenerpara con­ seguirelnombre. c) Modifique el constructor para especificar dos parámetros: uno para el nombre del curso y otro para el del instructor. d) Modifique el método mostrarMensaje, de tal forma que primero imprima el mensaje de bienvenida y el nombredelcurso, seguidosde“ Este curso es presentado por: ”yelnombredelinstructor. Usesuclasemodificadaen unaaplicaciónde pruebaquedemuestrelasnuevascapacidadesquetiene. 3.12 (Clase Cuenta modificada) Modifique la clase Cuenta (figura 3.13) para proporcionar un método llamado cargar, que retire dinero de un objeto Cuenta. Asegure que el monto a cargar no excedael saldodeCuenta. Si lo hace, elsaldo debepermanecersincambio yelmétododebe imprimirun mensajeque indique "E l monto a cargar excede el saldo de la cuenta.” Modifiquela clase PruebaCuenta (figura3.14) paraprobarelmétodo cargar. 3.13 (La clase Factura) Creeuna clasellamada Factura, que una ferretería podría utilizarpara representaruna fac­ turaparaun artículovendidoen latienda. Una Factura debeincluircuatro piezasdeinformación comovariablesde ins­ tancia: un númerodepieza(tipo St r i ng),ladescripción dela pieza (tipo St r i ng), lacantidad deartículosdeesetipo que sevan a comprar (tipo in t) yel precio porartículo (double). Su clasedebe tenerun constructorque inicialice lascuatro variablesde instancia. Proporcione un método establecery uno obtenerpara cada variable de instancia. Además, propor­ cione un método llamado obtenerMontoFactura, que calcule el monto de la factura (esdecir, que multiplique la can­ tidad porel precio porartículo) ydespués lodevuelvacomo un valordouble. Si lacantidad no espositiva, debeestable- www.FreeLibros.me
    • Hacer la diferencia 101 cerseen 0. Si el precio porartículo no es positivo, debe establecerse en 0.0. Escriba una aplicación de prueba llamada PruebaFactura, quedemuestrelas capacidades dela clase Factura. 3.14 (Laclase Empleado)Crccunaclasellamada Empleado, que incluyatresvariablesde instancia: un primernombre (tipo Strin g ), un apellido paterno (tipo Strin g ) yun salario mensual (doubl e). Suclase debe tener un constructorque inicialice lastresvariablesde instancia. Proporcione un método estableceryun método obtenerparacadavariable deins­ tancia. Si el salario mensual no es positivo, no establezca su valor. Escriba una aplicación de prueba llamada Prueba- Empl eado, quedemuestre lascapacidadesde laclase Empleado. Cree dosobjetos Empleado ymuestre el salarioanual de cada objeto. Después, proporcione a cada Empl eado un aumento del 10% y muestre el salario anual de cada Empleado otravez. 3 .15 (La clase Fecha) Creeuna clasellamada Fecha, que incluya tresvariablesde instancia: un mes (tipo i nt), un día (tipo i nt) yunaño (tipo i nt). Suclasedebetenerun constructorqueinicialicelastresvariablesdeinstancia,ydebeasumir quelosvaloresqueseproporcionansoncorreaos. Proporcione un método estableceryun método obtenerparacadavaria­ bledeinstancia. Proporcioneun métodomostrarFecha, quemuestreelmes,díayaño,separadosporbarrasdiagonales(/). Escribaunaaplicacióndeprueballamada PruebaFecha, quedemuestrelascapacidadesdelaclase Fecha. Marcar la diferencia 3 .16 (Calculadora de lafrecuencia cardiaca esperada) Mientras seejercita, puede usar un monitorde frecuencia cardiaca para verque sucorazón permanezca dentro de un rango seguro sugerido por susentrenadores ydoctores. De acuerdo con laAsociación Estadounidense del Corazón (AHA) (vwwv. ameri canheart.org/), la fórmula paracalcular su frecuenciacardiacamáximaen pulsosporminutoesde 220menossuedadenaños. Sufrecuenciacardiacaesperadaesun rangoqueestáentreel 50yel 85%de sufrecuenciacardiacamáxima. [Nota:estasfórmulassonestimaciones proporcio­ nadasporlaAHA. Lasfrecuenciascardiacasmáximayesperadapueden variardeacuerdocon lasalud,condición físicay sexo del individuo. Siempre debe consultar un médico o a un profesional de lasaludantes deempezar o modificar un programadeejercicios.] Creeunaclasellamada FrecuenciasCardiacas. Losatributosdelaclasedeben incluirel primer nombredela persona, suapellidoy fecha de nacimiento (lacual debeconsistirde atributosseparados para el mes, día y añode nacimiento).Suclasedebetenerun constructorque recibaestosdatoscomo parámetros. Paracadaatributodebe proveermétodos estableceryobtener.Laclasetambiéndebe incluirun métodoquecalculeydevuelvalaedaddelaperso­ na (enaños), uno que calcule ydevuelvala frecuencia cardiaca máxima de esa persona, yotro quecalcule ydevuelva la Secuenciacardiacaesperadade lapersona. EscribaunaaplicacióndeJavaquepidalainformaciónde lapersona,creeuna instanciadeun objetodelaclaseFrecuenciasCardiacase imprimalainformaciónapartirdeeseobjeto(incluyaelprimer nombredelapersona,suapellidoyfechade nacimiento),yquedespuéscalculeeimprimalaedadde lapersonaen (años), Secuenciacardiacamáximayrangode frecuenciacardiacaesperada. 3 .17 (Computarización delos registrosmédicos)Un problemarelacionadocon lasaludque haestadoúltimamente enlasnoticiaseslacomputarización de losregistrosmédicos.Estaposibilidadseestátratandocon muchocuidado, debi­ doalasdelicadascuestionesde privacidadyseguridad,entre otrascosas. [Trataremosesascuestionesenejercicios poste­ riores.] Lacomputarización de losregistrosmédicos puede facilitaralospacientesel procesodecompartirsusperfilese historiales médicoscon losdiversos profesionalesde lasaludque consulten. Esto podría mejorar lacalidaddel servicio médico, ayudaraevitarconflictosde fármacosy prescripcioneserróneas, reducir loscostosy, en emergencias, ayudara salvarvidas. EnesteejerciciousteddiseñaráunaclaseinicialllamadaP e rfi 1Medico parauna persona. Losatributosde la dasedeben llevarelprimernombre de lapersona, suapellido,sexo, fechadenacimiento (quedebeconsistirdeatributos separados para el día, mesyaño de nacimiento), altura (encentímetros) y peso (en kilogramos). Suclasedebe tener un oonstructorque recibaestosdatos.Paracadaatributo,debe proveerlosmétodosestableceryobtener.haclasetambiéndebe tenermétodosquecalculenydevuelvan laedad delusuarioenaños, lafrecuenciacardiacamáximayelrangode frecuen­ ciacardiacaesperada (veaelejercicio3.16),ademásdelíndicede masacorporal (BMI; veaelejercicio2.33). Escribauna aplicación deJava que pidala información de la persona,cree una instancia deun objeto de laclase P e rfi lMedico para esapersonaeimprima lainformacióndeeseobjeto (debecontenerelprimernombrede lapersona,apellido,sexo,fecha denacimiento, alturaypeso), yque despuéscalculee imprima laedad deesa personaen años, juntocon el BMI, la fre­ cuenciacardiaca máximayel rango de frecuencia cardiacaesperada.También debe mostrar latabla de valoresdel BMI delejercicio2.33. www.FreeLibros.me
    • Instrucciones de control Parte I Desplacémonosun lugar. — Lew» Carrol] Laruedaseconvirtió en uncirculocompleto. —William Shakespeare ¡Cuántas manzanastuvieron quecaerenlacabeza deNewtonantesdeque entendiera elsuceso! — Robcrt Frost O b j e t i v o s En este capítulo aprenderá a: ■ Gomprender las técnicas básicas para solucionar problemas. ■ Desarrollar algoritmos mediante el proceso de refinamiento de arriba a abajo, paso a paso. ■ Utilizar las estructuras de selección i f e if...elsepara elegir entre distintas acciones alternativas. ■ Usar la estructura de repetición whi 1e para ejecutar instrucciones de manera repetitiva dentro de un programa. ■ Emplear la repetición controlada por un contador y la repetición controlada por un centinela. ■ Manejar los operadores de asignación compuestos. de incremento y decremento. Gonocer la portabilidad de los tipos de datos primitivos. www.FreeLibros.me
    • Plangeneral 4.2 Algoritmos 103 4.9 Cómo formular algoritmos: repetición controlada por un centinela 4.10 Cómo formular algoritmos: instrucciones de control anidadas 4 .1 1 Operadores de asignación compuestos 4.12 Operadores de incremento y decremento 4.13 Tipos primitivos 4 .14 (Opcional) Caso de estudio de GUI y gráficos: creación de dibujos simples 4.15 Conclusión Resumen | Ejercicios de autoevaluación | Respuestas a los ejercicios de autoevaluación | Ejercicios Marcar la diferencia 4.1 Introducción Antes deescribirun programa que désolución a un problema, esimprescindibletener unacomprensión detalladade todo elproblema, ademásde unametodologíacuidadosamente planeada pararesolverlo. Al escribir un programa, es también esencial comprender lostipos de bloques de construcción disponibles, yemplearlas técnicascomprobadas paraconstruir programas. Enestecapítulo yenel 5,Instruccionesde oontrol: Parte 2, hablaremos sobre estas cuestiones cuando presentemos la teoría y los principios de la programación estructurada. Los conceptos aquí presentados son imprescindibles paracrear clases y ma­ nipularobjetos. En este capítulo le presentamos las instrucciones i f , i f...else y while deJava, tres de los bloques de construcción que le permiten especificar la lógica requerida para que los métodos realicen sus tareas. Dedicamos una parte de este capítulo (y de los capítulos 5 y 7) para desarrollar más la clase Li b ro C alificacio n e s que presentamos en el capítulo 3. En especial, agregamos un método a la dase LibroCal i ficacio n e s que utiliza instrucciones de control para calcular el promedio de un oonjunto de calificaciones de estudiantes. Otro ejemplo demuestra formas adicionales de combinar instrucciones de control para resolver un problema similar. Presentamos los operadores de asigna- dón compuestos de incremento y decremento de Java. Por último, analizamos la portabilidad de los tipos de datos primitivos deJava. 4.2 Algoritmos Cualquier problema de computación puede resolverse ejecutando una serie de acciones en un orden es­ pecífico. Un procedimiento para resolver un problema en términos de 1. lasaccionesaejecutar y 2. el orden en elquese ejecutan estas acciones seconoce como un algoritmo. Elsiguiente ejemplo demuestra quees importante especificar de manera oorrecta elorden en el que se ejecutan lasacciones. Considere el “algoritmo para levantarse y arreglarse” que sigue un ejecutivo para levantarse de la cama e ir a trabajar: (1) levantarse; (2) quitarse la pijama; (3) bañarse; (4) vestirse; (5) desayunar; (6) transportarse al trabajo. Esta rutina hace que el ejecutivo llegue al trabajo bien preparado para tomar decisiones importantes. Suponga que los mismos pasos se realizan en un orden ligeramente distinto: (1) levantarse; (2) quitarse la pijama; (3) vestirse; (4) bañarse; (5) desayunar; (6) transportarse al trabajo. En este caso, nuestro ejecutivo llegará al trabajo todo mojado. Al proceso de especificar el orden en el que se ejecutan las instrucciones (acciones) en un programa, se le llama control del pro- .1 Introducción .2 Algoritmos .3 Seudocódigo .4 Estructuras de control .5 Instrucción i f de selección simple .6 Instrucción i f . . . el se de selección ( .7 Instrucción de repetición w hile .8 Cómo formular algoritmos: repetición controlada por un contador www.FreeLibros.me
    • 104 Capítulo 4 Instrucciones de control: Parte I grama. En este capítulo investigaremos el control de los programas mediante el uso de las instruc­ ciones de control deJava. 4.3 Seudocódigo El seudocódigo es un lenguajeinformal que le ayudaa desarrollar algoritmossin tener que preocupar­ se por los estrictos detalles de la sintaxis del lenguajeJava. El seudocódigo que presentaremos es espe­ cialmente útil para desarrollar algoritmos que se convertirán en porciones estructuradas de programas en Java. El seudocódigo es similar al lenguaje cotidiano: es conveniente y amigable con el usuario, aunque en realidad no es un lenguaje de programación de computadoras. En la figura4.5 verá un algo­ ritmo escrito en seudocódigo. Elseudocódigo no se ejecuta en lascomputadoras. En vez de ello, leayudaa “organizar”un progra­ ma antes de que intente escribirlo en un lenguaje de programación como Java. Este capítulo presenta varios ejemplos de cómo utilizar el seudocódigo para desarrollarprogramas enJava. El estilo de seudocódigo que presentaremos consiste sólo en caracteres, para que usted pueda es­ cribirlo de una manera conveniente, con cualquier programa editor de texto. Un programa en seudo­ código preparado de manera cuidadosa puede convertirse fácilmente en su correspondiente programa enJava. Por lo general, el seudocódigo describe sólo las instrucciones que representan las acciones que ocurren después de convertir un programa de seudocódigo a Java, y el programa se ejecuta en una computadora. Dichas acciones podrían incluir la entrada, salidao un cálculo. Porlo general no inclui­ mos las declaraciones de variables en nuestro seudocódigo, pero algunos programadores optan por listarlasy mencionar sus propósitos al principio de su seudocódigo. 4.4 Estructuras de control Escomún en un programa que lasinstruccionesseejecuten una después deotra, enelorden en queestán escritas. Este proceso se conoce como ejecución secuencial. Varias instrucciones en Java, que pronto veremos, permiten al programador especificar que lasiguiente instrucción a ejecutarse tal vez no sea la siguienteen lasecuencia. Esto se conoce como transferencia de control. Durante la década de 1960, se hizo evidente que el uso indiscriminado de las transferencias de con­ trolera el origen de muchasde las dificultades que experimentaban los grupos de desarrollo de software. A quien se señaló como culpable fue a la instrucción goto (utilizada en la mayoría de los lenguajes de programación de esaépoca), lacual permite al programador especificar latransferenciade control a uno de los muchos posibles destinos dentro de un programa. La noción de lo que conocemos como progra­ mación estructurada se hizo casi un sinónimo de la “eliminación del goto”. [Nota: Java no tiene una instrucción goto;sin embargo, la palabra goto está reservadaparaJavay nodebe usarse como identifica­ dor en los programas]. Las investigaciones de Bohm yJacopini1demostraron que los programas podían escribirse sin ins­ trucciones goto. Elreto de laépoca para los programadores fue cambiar susestilos a una “programación sin goto”. No fue sino hasta la década de 1970 cuando los programadores tomaron en serio la progra­ mación estructurada. Los resultados fueron impresionantes. Los grupos de desarrollo desoftware repor­ taron reduccionesen los tiemposde desarrollo, mayor incidencia de entregas desistemasa tiempo y más proyectos de software finalizados sin salirse del presupuesto. La clave paraestos logros fue que los pro­ gramas estructurados eran más claros, más fáciles de depurar y modificar, y había más probabilidad de que estuvieran libresde errores desde el principio. 1 Bohm,C. YG.Jacopini, “FlowDiagrams,TuringMachinesand Languageswith OnlyTwoFormation Rules,”Communica­ tionsoftheACM,vol. 9, núm. 5, mayode 1966, páginas336-371. www.FreeLibros.me
    • 4.4 Estructuras de control 105 El trabajo de Bohm y Jacopini demostró que todos los programas podían escribirse en términos de tres estructuras de control solamente: la estructura de secuencia, la estructura de selección y la estructura de repetición. Cuando presentemos las implementaciones de las estructuras de control en Java, nos referiremos a ellas en la terminología de laEspecificacióndellenguajeJavacomo “instrucciones de control”. Estructura de secuencia enJava La estructura de secuencia está integrada en Java. A menos que se le indique lo contrario, la compu­ tadora ejecuta las instrucciones en Java una después de otra, en el orden en que estén escritas; es decir, en secuencia. El diagrama de actividad de la figura4.1 ilustra una estructura de secuencia típica, en la que se realizan dos cálculos en orden. Java permite tantas acciones como deseemos en una estructura de secuencia. Como veremos pronto, en donde quiera que se coloque una sola acción, podrán colo­ carsevarias en secuencia. T sumar calificación al total - i sumar I al contador l Instrucción en Java correspondiente: to ta l - to ta l + c a lific a c ió n ; Instrucción en Java correspondiente: contador - contador + 1; Fig. 4 .1 | Diagrama de actividad de una estructura de secuencia. Un diagrama de actividad de UML modela el flujo de trabajo (también conocido como la acti­ vidad) de una parte de un sistema de software. Dichos flujos de trabajo pueden incluir una porción deun algoritmo, como laestructurade secuenciade lafigura4.1. Losdiagramas deactividadestán com­ puestos por símbolos de propósito especial, como lossímbolos de estado de acción (rectángulos cuyos lados izquierdo y derecho se reemplazan con arcos hacia fuera), rombos y círculos pequeños. Estos símbolos se conectan mediante flechas de transición, que representan el flujo de laactividad; es decir, elorden en elque deben ocurrir las acciones. Al igual que el seudocódigo, los diagramas de actividad ayudan a los programadores a desarrollar y representar algoritmos, aunque muchos de ellos aún prefieren elseudocódigo. Los diagramas de acti­ vidad muestran con claridad cómo operan lasestructuras de control. Usaremos el UML eneste capítulo yen el 5 para mostrar el flujo de control en las instruccionesde control. En los capítulos 12 y 13 utiliza­ remos el UML en un casode estudio de un cajero automático real. Considere el diagrama de actividad para la estructura de secuencia de la figura 4.1. Contiene dos estados de acción que representan las acciones a realizar. Cada estado de acción contiene una expre­ sión de acción (por ejemplo, “sumar calificación a total”o “sumar 1al contador”), que especifica una acción particular a realizar. Otras acciones podrían incluir cálculos u operaciones de entrada/salida. Las flechas en el diagrama de actividad representan transiciones, las cuales indican el ordenen el que ocurren las acciones representadas por los estados de acción. El programa que implementa las activi­ dades ilustradas por el diagrama de la figura 4.1 primero suma cal i fi cacion a to ta l,y después suma la contador. El círculo relleno que se encuentra en la parte superior del diagrama de actividad representa el estado inicial: el iniciodel flujo de trabajo antes de que el programa realice las actividades modeladas. www.FreeLibros.me
    • 106 Capítulo 4 Instrucciones de control: Parte I El círculo sólido rodeado por una circunferencia que aparece en la parte inferior del diagrama re­ presenta el estado final; es decir, e final de flujo de trabajo después de que el programa realiza sus acciones. Lafigura 4.1 también incluyerectángulos que tienen laesquinasuperiorderechadoblada. En UML, aestos rectángulosseles llamanotas (como loscomentarios enJava): comentarioscon explicacionesque describen elpropósito de lossímbolosen eldiagrama. Lafigura4.1 utilizalasnotas de UML paramostrar elcódigo enJava asociado con cada estado de acción. Una línea punteada conecta cada nota con el ele­ mento que ésta describe. Los diagramas de actividad generalmente no muestran el código en Java que implementa la actividad. En este libro utilizamos las notas para mostrar cómo se relaciona el diagrama con elcódigo en Java. Paraobtener más información sobre UML, vea nuestro caso de estudio opcional (capítulos 12y 13) o visite www.uml .org. Instruccionesde selección enJava Java tiene tres tipos de instrucciones de selección (las cuales se describen en este capítulo y en el 5). La instrucción if realiza (selecciona) una acción si lacondición es verdadera, o evita la acción si lacon­ dición es falsa. La instrucción i f...else realiza una acción si la condición es verdadera, o realiza una acción distinta si es falsa. La instrucción switch (capítulo 5) realiza una de entre varias acciones dis­ tintas, dependiendo del valor de unaexpresión. La instrucción i f es una instrucción de selección simple, yaque selecciona o ignora una sola ac­ ción (o, como pronto veremos, un sologrupo de acciones). La instrucción if...el se se conoce como instrucción de selección doble, ya que selecciona entre ¿los acciones distintas (o grupos de acciones). Lainstrucción switch es una estructura de selección múltiple, yaque seleccionaentre diversasacciones (ogrupos deacciones). Instruccionesde repetición enJava Java cuenta con tres instrucciones de repetición (también llamadas instrucciones de ciclo) que per­ miten a los programas ejecutar instrucciones en forma repetida, siempre y cuando una condición (llamada la condición de continuación del ciclo) siga siendo verdadera. Las instrucciones de repe­ tición son whi1e, do...whi1e y fo r. (En el capítulo 5 presentamos lasinstrucciones do...whi 1e y fo r). Las instrucciones whi le y fo r realizan la acción (o grupo de acciones) en sus cuerpos, cero o más veces; si en un principio la condición de continuación del ciclo es falsa, no se ejecutará la acción (o grupo de acciones). La instrucción do... while realiza la acción (o grupo de acciones) en su cuerpo, una o más veces. Las palabras if , else, switch, whi1e, do y fo r son palabras clave en Java. En el apéndice C aparece unalista completa de las palabras clave enJava. Resumen de las instruccionesde controlenJava Javasólo tiene tres tipos de estructuras de control, a las cuales nos referiremos de aquí en adelante como instrucciones de control: la instrucción de secuencia, las instrucciones de selección (tres tipos) y las ins­ truccionesde repetición (tres tipos). Cada programa se forma combinando tantas de estas instrucciones como sea apropiado para el algoritmo que implemente el programa. Podemos modelar cada una de las instrucciones de control como un diagrama de actividad. Al igual que la figura 4.1, cada diagramacon­ tiene un estado inicial y final, los cuales representan el punto de entrada y salida de la instrucción de oontrol, respectivamente. Las instrucciones de control de una sola entrada/una sola salida facilitan lacreación de programas; sólo tenemos que conectar el punto de salida de una al punto de entrada de la siguiente.Aesto lellamamos apilamiento de instruccionesde control. En breveaprenderemosquesólo hayuna maneraalternativadeconectarlasinstrucciones decontrol: el anidamiento de instruccionesde control, en el cual una instrucción de control aparece dentrode otra. Por lo tanto, los algoritmos en los programasenJavase crean apartir desólo tres principales tipos de instruccionesdecontrol,quesecom­ binan sólo de dos formas. Éstaes laesenciade lasimpleza. www.FreeLibros.me
    • 4.6 Instrucción i f...e l se de selección doble 107 4.5 Instrucción i f de selección simple Los programas utilizan instrucciones de selección para elegir entre los cursos alternativos de acción. Por ejemplo, suponga que lacalificación para aprobar un examenes 60. Lainstrucción en seudocódigo Si la calificación delestudiantees mayor o igualque 60 Imprimir “Aprobado” determinasi lacondición “lacalificacióndelestudianteesmayoro igualque 60”esverdadera. Encaso de que seaasíse imprime “Aprobado”,y se“ejecuta”en orden lasiguiente instrucción en seudocódigo. (Re­ cuerde que elseudocódigo no es un verdadero lenguaje de programación). Si la condición es falsase ig­ noralainstrucción Imprimir,yseejecutaenorden lasiguiente instrucciónenseudocódigo. Lasangríade lasegunda líneade estainstrucción deselecciónesopcional,pero serecomiendayaqueenfatizalaestruc­ tura inherente de losprogramas estructurados. Lainstrucción anteriorSien seudocódigo puedeescribirse enJavade lasiguiente manera: i f ( ca lifica cio n E stu d ia n te >= 60 ) System.out.println( “ Aprobado” ) ; El código en Javacorresponde en gran medida con el seudocódigo. Ésta es una de las propiedades que hace delseudocódigo una herramienta de desarrollo de programas tan útil. La figura 4.2 muestra la instrucción i f de selección simple. Esta figuracontiene lo que quizá sea el símbolo más importante en un diagrama de actividad: el rombo o símbolo de decisión, el cual indica que se tomará una decisión. El flujo de trabajo continúa a lo largo de una ruta determinada por las condiciones de guardia asociadas de ese símbolo, que pueden ser verdaderas o falsas. Cada flecha de transición que sale de un símbolo de decisión tiene una condición de guardia (especificada entre corchetes, a un lado de la flecha de transición). Si una condición de guardia es verdadera, el flujo de trabajo entra al estado de acción al que apunta la flecha de transición. En la figura 4.2, si la calificación es mayor o igual que 60, el programa imprime “Aprobado”y luego se dirige alestado final de esta acti­ vidad. Si la calificación es menor que 60, el programa sedirige de inmediato al estado final sin mostrar ningún mensaje. Fig. 4.2 | Diagramade actividaden UMLde lainstrucción if deselección simple. La instrucción i f es unainstrucción de control de una sola entrada/una sola salida. Pronto veremos que los diagramas de actividad para las instrucciones de control restantes también contienen estados iniciales, flechasde transición, estados de acciónque indican lasacciones arealizar,símbolos dedecisión (consus condicionesde guardia asociadas) que indican las decisiones a tomar,y estados finales. 4.6 Instrucción i f ...e l se de selección doble Lainstrucción i f de selección simple realiza una acción indicada sólo cuando lacondición es verdadera (true); deno serasí,seevitadichaacción. La instrucción 1f...el sede selección doble lepermiteespe- www.FreeLibros.me
    • 108 Capítulo 4 Instrucciones de control: Parte I dficar unaacción arealizarcuando lacondiciónesverdadera,yotradistintacuando esfalsa. Porejemplo, lainstrucción en seudocódigo: Si la calificación delestudiantees mayor o igualque 60 Imprimir “Aprobado” De lo contrario Imprimir “Reprobado” imprime “Aprobado”si lacalificación del estudiante es mayor o igual que 60, y “Reprobado”si lacalifi­ cacióndelestudiante esmenorque 60. En cualquier caso,después delaimpresiónse “ejecuta”lasiguien­ teinstrucción enseudocódigo en lasecuencia. Lainstrucción anterior en seudocódigo Si...De lo contrariopuede escribirse enJavacomo if C calificación >= 60 ) System.out.p r i ntln( "Aprobado” ) ; else System.out.println( "Reprobado” ) ; Elcuerpo de lainstrucción else también tienesangría. Cualquiera quesea laconvención desangría que usted elija, debe aplicarlade manera consistente en todossus programas. Buena práctica de programación 4.1 Utilice sangríaenambos cuerposde instruccionesde una estructura 1f...eIse. Muchos IDEhacenestopor usted. Buena práctica de programación 4.2 Sihayvariosnivelesdesangría, encadaunodebeaplicarselamismacantidadde espado adidonal. La figura 4.3 muestra el flujo de control en la instrucción i f ...el se. Una vez más (además del es­ tado inicial, las flechasde transición y el estado final), lossímbolos en eldiagrama de actividad de UML representan estados de accióny decisiones. Fig. 4.3 | Diagramade actividadde UMLde lainstrucción if...el se de selección doble. Operador condicional (?:) Java cuenta con el operador condicional (?:), que en ocasiones puede utilizarse en lugar de una instrucción if ...else. Éste es el único operador ternario en Java (un operador que utiliza tres ope­ randos). En conjunto, los operandos y el símbolo ?: forman una expresión condicional. El pri­ mer operando (a la izquierda del ?) es una expresión bool eana (boolean) (es decir, una condición www.FreeLibros.me
    • 4.6 Instrucción i f...e l se de selección doble 109 que se evalúa a un valor bool ean: true o fa l se), el segundo operando (entre el ? y :) es el valor de la expresión condicional si la expresión bool eana es ve rdadera, y el tercer operando (a la derecha del :) es el valor de la expresión condicional si la expresión booleana se evalúa como fa l se. Por ejemplo, la instrucción S yste m .o u t.p rin tln ( calificacio n Estu d ian te> = 60 ? “Aprobado” : “Reprobado” ) ; imprime el valor del argumento de la expresión condicional de pri n tln. La expresión condicional en esta instrucciónproduce como resultado la cadena “Aprobado” si laexpresión booleana cal i f i caci on- Estudiante >= 60es verdadera, y lacadena "Reprobado” si laexpresión booleana es falsa. Por lo tanto, esta instrucción con el operador condicional realiza en esencia la misma función que la instrucción i f . . .e l se que se mostró anteriormente, en esta sección. Puesto que la precedencia del operador condi­ cional es baja, es común que toda laexpresión condicional se coloque entre paréntesis. Pronto veremos que las expresiones condicionales pueden usarse en algunas situaciones en las que no se pueden utilizar instrucciones i f ... el se. Instrucciones i f ...e ls e anidadas Un programa puede evaluar varios casos colocando instrucciones if ...el se dentro de otras instruccio­ nes i f ...el se paracrearinstrucciones if ...e l se anidadas. Porejemplo,elsiguienteseudocódigo repre­ senta una instrucción if ...e ls e anidada que imprime A para las calificaciones de exámenes mayores o iguales a 90, Bpara las calificaciones en el rango de 80 a 89, Cpara las calificaciones en el rango de 70 a 79, Dpara las calificaciones en el rango de 60 a 69 y F para todas las demás calificaciones: Si la calificación delestudiantees mayor o igualque90 Imprimir “A” de lo contrario Si la calificacióndelestudiante esmayor oigualque 80 Imprimir “B” de lo contrario Si la calificacióndelestudiante esmayor oigualque 70 Imprimir “C” de lo contrario Si la calificación delestudiantees mayoro igualque 60 Imprimir "D” de lo contrario Imprimir *F” Este seudocódigo puede escribirse enJavacomo i f ( ca lifica cio n E stu d ia n te >= 90 ) System .out.printlnC “A” ) ; else i f ( ca lifica cio n E stu d ia n te >= 80 ) System .out.printlnC “B” ) ; else i f C ca lifica cio n E stu d ia n te >= 70 ) System .out.printlnC “C” ) ; else i f C cal ifica cio n E stu d ia n te >= 60 ) System .out.printlnC “ D” ) ; else System .out.printlnC “ F" ) ; www.FreeLibros.me
    • 110 Capítulo 4 Instrucciones de control: Parte I Si la variable c a lifi caci onEstudiante es mayor o igual que 90, las primeras cuatro condiciones en la instrucción i f...else anidada serán verdaderas, pero sólo se ejecutará la instrucción en la parte if de la primera instrucción i f .. .el se. Después de que se ejecute esa instrucción, se evita la parte el se de la instrucción i f... el se más “externa”. La mayoría de los programadores en Java prefieren escribir la instrucción i f ... e1se anterior así: i f ( c a l i f i c a c i o n E s t u d i a n t e >= 90 ) S y s t e m . o u t . p r i n t l n ( “A ” ) ; e l s e i f C c a l i f i c a c i o n E s t u d i a n t e >= 80 ) S y s t e m . o u t . p r i n t l n C " B ” ) ; e l s e i f ( cal i f i c a c i o n E s t u d i a n t e >= 70 ) S y s t e m . o u t . p r i n t l n C “C ” ) ; e l s e i f C c a l i f i c a c i o n E s t u d i a n t e >= 60 ) S y s t e m . o u t . p r i n t l n C “D” ) ; e l s e S y s t e m . o u t . p r i n t l n C “ F ” ) ; Las dos formas son idénticas, excepto por el espaciado y la sangría, que el compilador ignora. La segun­ da forma es más popular ya que evita usar mucha sangría hacia la derecha en el código. Dicha sangría a menudo deja poco espacio en una línea de código, forzando a que las líneas se separen. Problema del e l se suelto El compilador de Java siempre asocia un e l s e con el i f que le precede inmediatamente, a menos que se le indique otra cosa mediante la colocación de llaves ({ y }). Este comportamiento puede ocasionar b que se conoce como el problema del e l se suelto. Por ejemplo, i f C x > 5 ) i f C y > 5 ) System, out . p r i n t l nC “x e y son > 5” ) ; e l s e S y s t e m . o u t . p r i n t l n C “x es <= 5 ” ) ; parece indicar que si xes mayor que 5, lainstrucción i f anidada determina si yes también mayor que 5. De ser así, se produce como resultado la cadena “x e y son > 5”. De lo contrario, parece ser que si x no es mayor que 5, la instrucción el se que es parte del i f ... el se produce como resultado la cadena “x es <= 5”.¡Cuidado! Esta instrucción i f ... el s e anidada no seejecutacomo parece ser. Elcompilador en realidad interpreta lainstrucción así i f C x > 5 ) i f C y > 5 ) S y s t e m . o u t . p r i n t l n C “x e y son > 5 ” ) ; else Sy ste m.ou t . p r i n t l nC ‘‘x es <= 5” ) ; en donde el cuerpo del primer i f es un i f . . . e l s e anidado. La instrucción i f más externa evalúa si x es mayor que 5. De ser así, la ejecución continúa evaluando si y es también mayor que 5. Si la segunda oondición es verdadera, se muestra la cadena apropiada (“x e y son > 5”). No obstante, si la segun­ da condición es falsa se muestra la cadena “x es <= 5”, aun cuando sabemos que x es mayor que 5. Además, si la condición de la instrucción i f exterior es falsa, se omite la instrucción i f .. .el se interior y no se muestra nada en pantalla. Para forzar a que la instrucción i f .. .el se anidadase ejecute como se tenía pensado originalmente, debe escribirse de lasiguiente manera: www.FreeLibros.me
    • 4.6 Instrucción i f...e l se de selección doble 111 i f ( x > 5 ) { i f ( y > 5 ) System .out.println( “x e y son > 5" ) ; } else System .out.printlnC “x es <= 5” ) ; Las llaves indican que elsegundo i f se encuentra en elcuerpo del primer i f,y que el el se está asociado con elprimer i f. Losejercicios 4.27 y 4.28 analizan con más detalle el problema del el se suelto. Bloques Por lo general, la instrucción if esperasólo una instrucción en su cuerpo. Para incluir varias instruccio­ nes en el cuerpo de un i f (o en el cuerpo del else en una instrucción if... el se), encierre las instruc­ cionesentre llaves.A lasinstruccionescontenidasdentro deun parde llavesselellamabloque. Un bloque puede colocarse en cualquier parte de un programaen donde pueda colocarse unasola instrucción. Elsiguiente ejemplo incluye un bloque en la parte el se de unainstrucción i f .. .e l se: i f ( c a lific a c ió n >= 60 ) Syste m .o u t.p rin tln ( “Aprobado” ) ; else { System .out.printlnC “Reprobado” ) ; Syste m .o u t.p rin tln ( “Debe tomar este curso otra v e z .” ) ; } En este caso, si calificación es menor que 60, el programa ejecuta ambas instrucciones en el cuerpo del el se eimprime Reprobado. Debe tomar este curso o tra vez. Observelas llaves que rodean a lasdos instruccionesen lacláusula el se. Éstasson importantes. Sin ellas, lainstrucción System .out.printlnC “ Debe tomar este curso o tra v e z .” ) ; estaría fuera del cuerpo de la parte el se de la instrucción i f ...e l se y se ejecutaría sin importar que la calificación fuera menor a 60. Los errores de sintaxis (como cuando se omite una llave en un bloque del programa) los atrapa elcompilador. Un error lógico (como cuando seomiten ambas llaves en un bloque del programa) tiene su efecto en tiempo de ejecución. Un error lógico fatal hace que un programa falle y termine antes de tiempo. Un error lógico no fatal permite que un programa siga ejecutándose, pero éste produce resultados incorrectos. Así como un bloque puede colocarse en cualquier parte en donde pueda escribirse una sola instruc­ ción, tambiénes posible no tener instrucción alguna. En lasección 2.8 vimos que la instrucción vacíase representacon un punto y coma (;) en donde normalmente iría una instrucción. Error común de programación 4.1 Colocarunpuntoy comadespuésdelacondiciónen unainstrucción 1fo if... elsepro­ duceun errorlógicoen lasinstrucciones 1fde selecciónsimple,y un errorde sintaxis en lasinstrucciones 1f...elsedeseleccióndoble(cuandolapartedel1f contieneunainstruc­ ciónenelcuerpo). www.FreeLibros.me
    • 112 Capítulo 4 Instrucciones de control: Parte I 4.7 Instrucción de repetición whi le Una instrucción de repetición (o de ciclo) le permite especificar que un programa debe repetir una acción mientras cierta condición seaverdadera. Lainstrucción en seudocódigo Mientras existan másartículos en mi listade compras Comprar elsiguienteartículoy quitarlo de mi lista describe la repetición que ocurre al ir de compras. La condición “existan más artículos en mi lista de compras” puede ser verdadera o falsa. Si es verdadera, entonces se realiza la acción “Comprar el si­ guiente artículo y quitarlo demi lista”.Esta acción serealizaráen formarepetida mientras la condición sea verdadera. La instrucción (o instrucciones) contenida en la instrucción de repetición Mientras oonstituye el cuerpo de esta estructura, el cual puede ser una sola instrucción o un bloque. En algún momento, la condición será falsa (cuando el último artículo de la lista de compras sea adquirido y eliminado). En este punto la repetición terminará y se ejecutará la primera instrucción que esté des­ pués de lainstrucción de repetición. Como ejemplo de la instrucción de repetición whil e en Java, considere un segmento de progra­ maque encuentra laprimerapotencia de 3 que seamayorque 100. Suponga que lavariable producto de tipo in t se inicializa en 3. Cuando la siguiente instrucción while termine de ejecutarse, el producto oontendrá el resultado: w h ile ( producto <= 100 ) producto = 3 * producto; Cuando esta instrucción while comienza a ejecutarse, el valor de la variable producto es 3. Cada iteración de la instrucción whi le multiplica a producto por 3, por lo que producto toma los valores de 9, 27, 81 y 243, sucesivamente. Cuando la variable producto se vuelve 243, la condición de la ins­ trucción while (producto <= 1000) se torna falsa. Esto termina la repetición, por lo que el valor final de producto es 243. Eneste punto, laejecución del programa continúa con lasiguiente instrucción des­ pués de la instrucción whi1e. .. Error común de programación 4.2 -S? Sinoseproporciona,enelcuerpode unainstrucción while, unaacciónqueocasioneque » pLI enalgún momento la condiciónde un while setornefalsa, por logeneralseproducirá unerrorlógicoconocidocomocicloinfinito(elciclonuncatermina). El diagrama de actividad de UML de la figura4.4 muestra el flujo de control que corresponde a la instrucción whil e anterior. Una vez más (aparte del estado inicial, las flechas de transición, un estado final y tres notas), los símbolos en el diagrama representan un estado de acción y una decisión. Este diagramaintroduce elsímbolode fusión. UML representaalsímbolo de fusióny alsímbolo de decisión como rombos. El símbolo de fusión une dos flujos de actividad en uno solo. En este diagrama, el sím­ bolo defusión une lastransicionesdel estado inicial ydel estado de acción, de manera queambas fluyan en la decisión que determina sielciclo debe empezar aejecutarse (o seguir ejecutándose). Lossímbolos de decisión y de fusión pueden diferenciarse por el número de flechas de transición “entrantes” y “salientes”. Un símbolo de decisión tiene una flecha de transición que apunta hacia el rombo y dos o másque apuntan haciafueradel rombo, paraindicar lasposibles transiciones desdeesepunto. Además, cada flecha de transición que apunta hacia fuera de un símbolo de decisión tiene una condición de guardia junto a ella. Un símbolo de fusión tiene dos o más flechas de transición que apuntan hacia el rombo, y sólo una que apunta hacia fuera de él, para indicar múltiples flujos de actividad que se fusio­ nan paracontinuar laactividad. Ningunadelasflechasde transición asociadascon un símbolo de fusión tiene una condición de guardia. www.FreeLibros.me
    • 4.8 Cómo formular algoritmos: repetición controlada por un contador 113 Fig. 4.4 | Diagramade actividadde UMLde lainstrucción de repetición whi1e. La figura 4.4 muestra con claridad la repetición de la instrucción while que vimos antes en esta sección. La flecha de transición que emerge del estado de acción apunta de regreso a la fusión, desde la cual el flujo del programa regresa a la decisión que se evalúa al principio de cada iteración del ciclo. Elcualsigueejecutándosehastaque lacondición deguardia producto > 100sevuelvaverdadera. Enton­ ces, la instrucción while termina (llegaa su estado final) y elcontrol pasa a lasiguiente instrucción en lasecuenciadel programa. 4.8 Cómoformularalgoritmos: repeticióncontrolada poruncontador Para ilustrar la forma en que se desarrollan los algoritmos, modificamos la clase LibroCali fi caciones del capítulo 3, para resolver dos variantes de un problema que promedia las calificaciones de unos estu­ diantes. Considere elsiguiente enunciado del problema: A una clasede diez estudiantesse les aplicó un examen. Las calificaciones (enteros en el rangode 0 a 100) de este examen están disponibles para usted. Determine elpromedio de la clasepara esteexamen. El promedio de la clase es igual que la suma de las calificaciones dividida entre el número de estu­ diantes. El algoritmo para resolver este problema en una computadora debe recibir como entrada cada unade lascalificaciones,llevarelregistro deltotalde lascalificaciones introducidas,realizarelcálculo para promediare imprimir el resultado. Algoritmo de seudocódigo con repetición controladapor un contador Emplearemosseudocódigo paraenumerar lasaccionesque deben llevarse acabo yespecificarelorden en que debenejecutarse. Usaremos una repetición controlada por contadorparaintroducir lascalificacio­ nes, una por una. Estatécnicautilizauna variablellamadacontador (o variable de control) paracontro­ lar el número de veces que debe ejecutarse un conjunto de instrucciones. A larepetición controlada por oontadorsele llamacomúnmente repetición definida, yaque elnúmero de repeticionesse conoceantes de que elciclo comience a ejecutarse. En este ejemplo, la repetición termina cuando elcontador excede a 10. Estasecciónpresentaun algoritmo deseudocódigo (figura4.5) completamentedesarrollado,yuna rersión de laclaseLibroCalifi caciones (figura4.6)que implementaelalgoritmo en un método deJava. Después presentamos unaaplicación (figura4.7) que demuestraelalgoritmo en acción. En lasección4.9 demostraremos cómo utilizar elseudocódigo para desarrollar dicho algoritmo desde cero. www.FreeLibros.me
    • 114 Capítulo 4 Instrucciones de control: Parte I Observación de ingeniería de software 4.1 Laexperienciahademostradoque laparte másdifícilparalaresoluciónde unproblema enunacomputadoraesdesarrollarelalgoritmoparalasolución. Porlogeneral, unavez quesehaespecificadoelalgoritmocorrecto, elprocesodeproducir unprogramafuncional enJavaapartirdedichoalgoritmoesrelativamentesencillo. Observe las referencias en el algoritmo de la figura4.5 para un total y un contador. Un total es una variableque seutiliza paraacumular lasuma devariosvalores. Un contador esunavariable queseutiliza para contar; en este caso, el contador de calificaciones indica cuál de las 10 calificaciones está a punto deescribir el usuario. Por lo general, las variables que se utilizan para guardar totales deben inicializarse encero antes de utilizarse en un programa. 1 Asignaratotalelvalordecero 2 Asignaralcontadordecalificacioneselvalordeuno 3 4 Mientrasqueelcontadordecalificacionesseamenoroigualquediez 5 Pediralusuarioqueintroduzcalasiguientecalificación 6 Obtenercomoentradalasiguientecalificación 7 Sumarlacalificaciónaltotal 8 Sumarunoalcontadordecalificaciones 9 10 Asignaralpromediodelaclaseeltotaldivididoentrediez 11 Imprimirelpromediodelaclase Fig. 4.5 | Algoritmo en seudocódigo que utiliza la repetición controlada porcontador para resolver el problema del promedio de una clase. bnplementación de la repetición controladapor contador en la clase L ibroCa 7i fic a c iones La clase L i b ro C alificacio n es (figura 4.6) contiene un constructor (líneas 11 a la 14) que asigna un valorala variablede instancia nombre Del Curs o (declaradaen lalínea 8) delaclase. Laslíneas 17a la20, 23 a la 26 y 29 a la 34 declaran los métodos establ ecerNombreDelCurso, obtenerNombreDelCurso y mostrarMensaje, respectivamente. Las líneas 37 a la 66 declaran el método determinarPromedio- Clase, el cual implementa el algoritmo para sacar el promedio de la clase, descrito por el seudocódigo de la figura4.5. La línea40 declara e inicializa lavariable entrada de tipo Scanner, que se utiliza para leer los valo­ res introducidos por el usuario. Las líneas 42 a 45 declaran las variables locales to ta l, contadorCali f, cal i fi caci on y promedi ode tipo i nt. La variable calificación almacena laentrada del usuario. 1 / / Fig- 4.6: L ib ro C a lific a c io n e s.ja v a 2 / / La clase Lib ro C a lificacio n e s que resuelve el problema del promedio 3 / / usando la repetición controlada por un contador. 4 import ja v a .ú t il. Scanner; / / el programa u t iliz a la clase Scanner 5 6 public cla ss Lib ro C a lificacio n e s 7 { 8 p rivate Strin g nombreDelCurso; / / el nombre del curso que representa este _______________________________________________________Li b ro C alificacio n es__________________________________________ Fig. 4 .6 | Clase LibroCal ificaciones que resuelve el problema del promedio de una clase mediante la repetición controlada por contador (parte I de 3). www.FreeLibros.me
    • 4.8 Cómo formular algoritmos: repetición controlada por un contador 115 9 10 / / el constructor in ic ia liz a a nombreDelCurso 11 p u b lic LibroCal i ficacionesC Strin g nombre ) 12 { 13 nombreDelCurso = nombre; / / in ic ia liz a a nombreDelCurso •4 } / / fin del constructor 15 16 / / método para establecer el nombre del curso 17 p ub lic void establecerNombreDelCurso( S trin g nombre ) 18 { 19 nombreDelCurso = nombre; / / almacena el nombre del curso 20 } / / fin del método establecerNombreDelCurso 21 22 / / método para obtener el nombre del curso 23 public Strin g obtenerNombreDelCursoO 24 { 25 return nombreDelCurso; 26 } / / fin del método obtenerNombreDelCurso 27 28 / / muestra un mensaje de bienvenida al usuario de Lib ro C a lificacio n e s 29 public void mostrarMensajeO 30 { 31 / / obtenerNombreDelCurso obtiene el nombre del curso 32 System .out.printfC “Bienvenido al lib ro de c a lific a c io n e sparan%s!nn” , 33 obtenerNombreDelCursoO ) ; 34 } / / fin del método mostrarMensaje 35 36 / / determina el promedio de la c la se , con base en la s 10 c a lific a c io n e s introducidas por e l usuario 37 public void determinarPromedioClaseO 38 { 39 / / crea objeto Scanner para obtener la entrada de la ventana de comandos 40 Scanner entrada = new ScannerC System .in ) ; 41 42 in t t o ta l; / / suma de la s c a lific a c io n e s e s c rita s por el usuario 43 in t co n tad o rC alif; / / número de la siguiente c a lific a c ió n a in tro d u cir 44 in t c a lific a c ió n ; / / valo r de la c a lific a c ió n e s c rita por el usuario 45 in t promedio; / / e l promedio de la s c a lific a c io n e s 46 47 / / fase de in ic ia liz a c ió n 48 to ta l = 0 ; / / in ic ia liz a e l to tal 49 contadorCalif = 1; / / in ic ia liz a el contador del c ic lo 50 51 / / fase de procesamiento; u t iliz a la repetición controlada por contador 52 while ( contadorC alif <= 10 ) / / ite ra 10 veces 53 { 54 System .out.printC “ Escrib a la c a lific a c ió n : “ ) ; / / indicador 55 c a lific a c ió n = ent rada, next In t O ; / / lee c a lific a c ió n del usuario 56 to ta l = to ta l + c a lific a c ió n ; / / suma c a lific a c ió n a to ta l 57 contadorC alif = contadorC alif + 1; / / incrementa contador en 1 58 } / / fin de w hile 59_______________________________________________________________________________________________________________________ Fig. 4 .6 | Clase LibroCal ifica cio n e s que resuelve el problema del promedio de una clase mediante la repetición controlada por contador (parte 2 de 3). www.FreeLibros.me
    • 116 Capítulo 4 Instrucciones de control: Parte I 60 / / fase de terminación 61 promedio = to ta l / 10; / / la d iv isió n entera produce un resultado entero 62 63 / / muestra el to tal y el promedio de la s c a lific a c io n e s 64 System .out.printfC “nEl to ta l de la s 10 c a lific a c io n e s es %dn” , to ta l ) ; 65 System.out .p ri n tf( “ El promedio de la clase es 96dn", promedio ) ; 66 } / / fin del método determinarPromedioClase 67 } / / fin de la clase Lib ro C a lificacio n e s Fig. 4.6 | Clase LibroCal ifica cio n e s que resuelve el problema del promedio de una clase mediante la repetición controlada por contador (parte 3 de 3). Las declaraciones (en laslíneas42 ala45) aparecen en elcuerpo delmétodo determi narP romedio- Clase. Recuerde que las variables declaradas en el cuerpo de un método son variables locales, y sólo pueden utilizarse desde la línea de su declaración hasta la llave derecha de cierre de la declaración del método. La declaración de una variable local debe aparecer antes de que se utilice en ese método. Una variable local no puede usarse fuera del método en elque se declara. En este libro, la clase Li b ro C alificacio n es sólo lee y procesa un conjunto de calificaciones. El cálculo del promedio se realiza en el método determinarPromedioClase, usando variables locales; no preservamos información acerca de las calificaciones de los estudiantes en variables de instancia de laclase. Las asignaciones (en las líneas 48 y 49) inicializan total a 0y contadorCal i f a l. Observe que estas inicializaciones ocurren antes que se utilicen las variables en los cálculos. Las variables cal ifi caci on y promedio (para la entrada del usuario y el promedio calculado, respectivamente) no necesitan iniciali- zarseaquí;sus valores se asignarán a medida quese introduzcan o calculen más adelante en el método. Error común de programación 4.3 Usar elvalorde una variable localantesde inicializarlaproduce un error de compila­ ción. Todas las variables locales deben inicializarse antesde utilizar sus valores en las expresiones. Tip para prevenir errores 4.1 Inicialicecadacontadory total,yaseaensudeclaraciónoenunainstruccióndeasigna­ ción. Porlogeneral,lostotalesseinicializana0.Loscontadorescomúnmenteseinicializan a 0 o a 1, dependiendode cómoseutilicen (másadelante veremos ejemplosde cuándo usar Oycuándo usar1). La línea 52 indica que la instrucción whi le debe continuar ejecutando elciclo (lo que también se conoce como iterar), siempre y cuando elvalor de contadorCal i f sea menor o igual que 10. Mientras esta condición sea verdadera, la instrucción w hile ejecutará en forma repetida las instrucciones entre las llavesque delimitan su cuerpo (líneas 54 a la 57). La línea 54 muestra el indicador “ Escrib a la calificación:”. La línea 55 leeel dato escrito por el usuario y lo asigna a lavariable cal i fi caci on. Después, la línea 56 suma la nueva cal i fi cacion es­ crita por el usuario al to tal,y asignael resultado a to tal,que sustituye suvalor anterior. La línea 57 suma 1 a contadorCal if para indicar que el programa ha procesado una calificación y está listo para recibir la siguiente calificación del usuario. Al incrementar a contadorCalif en cada iteración, en un momento dado su valor excederáa 10. En ese momento, elciclo termina debido aque su condición (línea 52) se vuelve falsa. Cuando elciclo termina, lalínea 61 realizad cálculo delpromedio yasignasu resultado alavariable promedio. La línea 64 utilizad método pri n tf de System, out para mostrar el texto “ El to ta l de las www.FreeLibros.me
    • 4.8 Cómo formular algoritmos: repetición controlada por un contador 117 10 cal i f icaci ones es “ , seguido del valor de lavariable to ta l. Después, la línea 65 utiliza a pri n tf paramostrareltexto “ El promedio de la clase es seguido delvalorde lavariablepromedio. Después de llegar a la línea 66, el método determinarPromedioClase devuelve el control al método que hizo la llamada (es decir, amain en PruebaLi broCal ific a c io n e s de la figura4.7). La clase PruebaLibroCa 7i fica cio n es Laclase PruebaLi b ro C alificacio n e s (figura 4.7) crea un objeto de la clase Lib ro C ali f i caciones (figura 4.6) y demuestra sus capacidades. Las líneas 10 y 11 de la figura 4.7 crean un nuevo objeto LibroCal i f i caciones y lo asignan a la variable mi Li broCal ific a c io n e s . El objeto S trin g en la línea 11 se pasaal constructorde Li b ro C alificacio n e s (líneas 11 ala 14 de la figura4.6). Lalínea 13 llama al método mostrarMensaje de mi LibroCal i f i caciones para mostrar un mensaje de bienve­ nida al usuario. Después, la línea 14 llama al método determinarPromedioClase de mi Libro- Cal ific a c io n e s para permitir que el usuario introduzca 10 calificaciones, para las cuales el método posteriormente calcula e imprime el promedio; el método ejecuta el algoritmo que se muestra en la figura 4.5. 1 / / F i g . 4. 7: Pru eb aLib ro C alificacio n es.java 2 / / Crea un objeto Lib ro C a lificacio n e s e invoca a su método obtenerPromedioClase. 3 4 public cla ss PruebaLi broCal i ficacio n es 5 { 6 public s ta tic void main( S trin g [] args ) 7 { 8 / / crea objeto m iLib ro C alificacio n es de la clase Lib ro C a lificacio n e s y 9 / / pasa el nombre del curso al constructor 10 Lib ro C a lificacio n e s m iLib ro C alificacio n es = new Lib ro C a lific a c io n e s( 11 “CS101 Introducción a la programación en la v a ” ) ; 12 13 m iLib roC alificaciones.m ostrarM en saje(); / / muestra mensaje de bienvenida 14 m iLibroC alificaciones.determ inarProm edioC laseO ; / / encuentra el promedio de 10 c a lific a c io n e s 15 } / / fin de main 16 } / / fin de la clase PruebaLibroCalificaciones Bienvenido al lib ro de c a lific a c io n e s para CS101 Introducción a la programación en Java! Escrib a la c a lific a c ió n : 67 Escrib a la c a lific a c ió n : 78 Escrib a la c a lific a c ió n : 89 Escrib a la c a lific a c ió n : 67 Escrib a la c a lific a c ió n : 87 Escrib a la c a lific a c ió n : 98 Escrib a la c a lific a c ió n : 93 Escrib a la c a lific a c ió n : 85 Escrib a la c a lific a c ió n : 82 Escrib a la c a lific a c ió n : 100 El to ta l de la s 10 c a lific a c io n e s es 846 El promedio de la clase es 84 Fig. 4.7 | Laclase PruebaLi broCal i f i caci ones crea unobjeto de laclase Li broCal i f i caci ones (figura4.6) e invoca asu método determinarPromedioClase. www.FreeLibros.me
    • 118 Capítulo 4 Instrucciones de control: Parte I Observacionesacerca de la división de enterosy eltruncamiento El cálculo delpromedio realizado por elmétodo determinarPromedioCl ase en respuesta alallamada al método en la línea 14 de la figura4.7, produce un resultado entero. La salida del programa indica que la sumade losvalores de lascalificacionesen laejecución deejemplo es 846, que aldividirse entre 10, debe producir el número de punto flotante 84.6. Sin embargo, elresultado del cálculo total / 10(línea 61 de lafigura4.6) eselentero 84,yaque total y 10sonenteros.Aldividirdosenterosseproduce una división entera:se pierde cualquier parte fraccionaria delcálculo (es decir, se trunca). En lasiguientesección ve­ remos cómo obtener un resultado de punto flotante a partir del cálculo del promedio. Error común de programación 4.4 -y? Suponer que la división entera redondea (en vez de truncar)puedeproducir resultados erróneos. Porejemplo, 7*4, queproduce 1.75enlaaritméticaconvencional, setrunca a 1enlaaritméticaentera,envezderedondearsea2. 4.9 Cómo formular algoritmos: repetición controlada por un centinela Generalicemos el problema, de la sección 4.8, para los promedios de una clase. Considere el siguiente problema: Desarrollar un programa que calcule elpromedio de una clasey procese las calificaciones para un númeroarbitrariodeestudiantes cadavezqueseejecute. En el ejemplo anterior del promedio de una clase, elenunciado del problema especificó el número deestudiantes, por lo que se conocía el número de calificaciones (10) de antemano. En este ejemplo no se indica cuántas calificaciones introducirá el usuario durante laejecución del programa. Éste debe pro­ cesar un número arbitrario de calificaciones. ¿Cómo puede el programa determinar cuándo terminar de introducir calificaciones? ¿Cómo sabrá cuándo calculare imprimir elpromedio de la clase? Una manera de resolver este problema es utilizar un valor especial denominado valor centinela (también llamado valor de señal, valor de prueba o valor de bandera) para indicar el “fin de la intro­ ducción de datos”.Elusuario escribe calificaciones hasta que se hayaintroducido el número correcto de ellas. Después, elusuario escribeelvalorcentinela paraindicar que no sevanaintroducir máscalificacio­ nes. A la repetición controlada por centinela a menudo se le llama repetición indefinida, ya que el número de repeticiones no se conoce antes de que comience laejecución del ciclo. Sin duda, debe elegirse un valor centinela de tal forma que no pueda confundirse con un valor de entrada permitido. Las calificaciones de un examen son enteros positivos, por lo que -1 es un valor cen­ tinela aceptable para este problema. Por lo tanto, una ejecución del programa para promediar una clasepodría procesar una cadena de entradascomo 95, 96,75,74, 89 y -1. El programaentoncescalcu­ laríae imprimiría el promedio de la clase para las calificaciones 95, 96, 75,74 y 89; como -1 es el valor centinela, «odebe entrar en el cálculo del promedio. Desarrollo delalgoritmo en seudocódigo con elmétodo de refinamiento de arriba a abajo, paso apaso: elprimer refinamiento (cima) Vamos adesarrollar el programa para promediar clases con una técnica llamadarefinamiento de arriba aabajo, paso a paso, lacualesesencialparaeldesarrollo de programas bienestructurados. Comenzamos con una representación en seudocódigo de la cima, una sola instrucción que transmite la función del programaen general: Determinarelpromediode la clasepara elexamen www.FreeLibros.me
    • 4.9 Cómo formular algoritmos: repetición controlada por un centinela 119 La cima es, en efecto, la representación completa de un programa. Por desgracia, pocas veces transmite los detalles suficientes como para escribir un programa en Java. Por lo tanto, ahora comenzaremos el proceso de refinamiento. Dividiremos la cima en una serie de tareas más pequeñas y las enumeraremos en el orden en el que sevan a realizar. Esto arrojacomo resultado elsiguiente primer refinamiento: Inicializar variables Introducir, sumary contar lascalificacionesdelexamen Calcular eimprimirelpromedio de la clase Este refinamiento utiliza sólo la estructura de secuencia; los pasos aquí mostrados deben ejecutarse en orden, uno después del otro. Observación de ingeniería de software 4.2 Cadarefinamiento, asícomolacimaensí, esunaespecificacióncompletadelalgoritmo; sólovaríaelniveldeldetalle. Observación de ingeniería de software 4.3 Muchosprogramaspuedendividirselógicamenteentresfases:unafasedeinicialización, en dondeseinicializan lasvariables; unafasedeprocesamiento, endondeseintroducen los valoresdelosdatosyseajustanlasvariablesdelprogramasegúnseanecesario;y unafasede terminación, quecalculayproducelosresultadosfinales. Cómoprocederal segundo refinamiento LaanteriorObservación deIngenieríade Softwarees amenudo todo loque usted necesitaparaelprimer refinamiento en el proceso de arriba aabajo. Para avanzar alsiguiente nivel de refinamiento (es decir, el segundo refinamiento), nos comprometemos a usar variables específicas. En este ejemplo necesitamos eltotal actual de los números, una cuenta de cuántos números se han procesado, una variable para reci­ bir el valor de cada calificación, a medida que el usuario las vaya introduciendo, y una variable para al­ macenar el promedio calculado. La instrucción en seudocódigo Inicializar ¡as variables puede mejorarse como sigue: Inicializar totalen cero Inicializar contador encero Sólo las variables totaly contadornecesitan inicializase antes de que puedan utilizarse. Las variablespro­ medio y calificación (parael promedio calculado y laentrada del usuario, respectivamente) no necesitan inicializarse,yaque susvalores se reemplazarán a medida que se calculen o introduzcan. Lainstrucción en seudocódigo Introducir, sumary contar lascalificacionesdelexamen requiere unaestructura de repetición (es decir, un ciclo) que introduzca cada calificación en forma suce­ siva. No sabemos de antemano cuántas calificaciones van a procesarse, por lo que utilizaremos la repeti­ cióncontrolada porcentinela. Elusuario introduce lascalificaciones, unapor una. Después de laúltima, elusuario mete elvalor centinela. El programa lo evalúa luego de insertar cadacalificación, y termina el dclo cuando el usuario introduceel valorcentinela. Entonces,elsegundo refinamiento de lainstrucción anterior en seudocódigo sería www.FreeLibros.me
    • 120 Capítulo 4 Instrucciones de control: Parte I Pediral usuarioqueintroduzca laprimera calificación Recibircomoentrada laprimera calificación (puedeserelcentinela) Mientras elusuario nohaya introducido aún elcentinela Sumaresta calificación al totalactual Sumar uno al contadorde calificaciones Pediralusuario que introduzca lasiguiente calificación Recibir como entrada lasiguiente calificación (puedeser elcentinela) En seudocódigo no utilizamos llaves alrededor de las instrucciones que forman el cuerpo de la estruc­ tura Mientras. Simplemente aplicamos sangría a las instrucciones bajo el Mientras para mostrar que pertenecen a esta instrucción. De nuevo, el seudocódigo es solamente una herramienta informal para desarrollar programas. Lainstrucción en seudocódigo Calcular eimprimirelpromedio de la clase puede mejorarse de lasiguiente manera: Si elcontador no esigualque cero Asignaralpromedio eltotaldividido entre elcontador Imprimirelpromedio de lo contrario Imprimir "Noseintrodujeron calificaciones” Aquítenemos cuidado deevaluar laposibilidad de unadivisiónentre cero; por lo generalesto esun error lógico que, si no se detecta, haría que el programa fallara o produjera resultados inválidos. El segundo refinamiento completo del seudocódigo parael problema del promedio de una clasese muestra en la fi­ gura 4.8. Tip para prevenir errores 4.2 Al realizar una división entre una expresión cuyo valorpudiera ser cero, debe evaluar explícitamente esta posibilidady manejarla de manera apropiada en suprograma (comoimprimir unmensajede error), en vezdepermitirqueocurra elerror. 1 Inicializartotalencero 2 Inicializarcontadorencero 3 4 Pediralusuarioqueintroduzcalaprimeracalificación 5 Recibircomoentradalaprimeracalificación(puedeserelcentinela) 6 7 Mientraselusuarionohayaintroducidoaúnelcentinela 8 Sumarestacalificaciónaltotalactual 9 Sumarunoalcontadordecalificaciones 10 Pediralusuarioqueintroduzcalasiguientecalificación 11 Recibircomoentradalasiguientecalificación(puedeserelcentinela) 12 13 Sielcontadornoesigualquecero 14 Asignaralpromedioeltotaldivididoentreelcontador 15 Imprimirelpromedio 16 delocontrario 17 Imprimir uNoseintrodujeroncalificaciones”___________________ Fig. 4.8 | Algoritmoen seudocódigo del problema para promediaruna clase, con una repetición controlada porcentinela. www.FreeLibros.me
    • 4.9 Cómo formular algoritmos: repetición controlada por un centinela 121 En las figuras 4.5 y 4.8 incluimos líneas en blanco y sangría en elseudocódigo para facilitar su lec­ tura. Las líneas en blanco separan los algoritmos en sus fases y accionan las instrucciones de control; lasangríaenfatiza loscuerpos de lasestructuras de control. El algoritmo en seudocódigo en la figura 4.8 resuelve el problema más general para promediar una clase. Este algoritmo se desarrolló después de aplicar dos niveles de refinamiento. En ocasiones se requieren más. Observación de ingeniería de software 4.4 Termineelprocesode refinamientodearribaaabajo,pasoapaso, cuandohayaespecifi­ cado elalgoritmo en seudocódigo con eldetalle suficiente comoparapoder convertir el seudocódigoenjava. Porlogeneral, laimplementacióndelprogama enjava despuésde estoesmuchomássencilla. Observación de ingeniería de software 4.5 Algunos programadores no utilizan herramientas de desarrollo de progamas como el seudocódigo. Sientenquesumetafinales resolverelproblemaen unacomputadoray que elescribirseudocódigosimplemente retarda laproducciónde losresultadosfinales. Aun­ queestemétodopudierafuncionarparaproblemassencillosy conocidos,tiendeaocasionar gaveserroresy retrasosenproyectosgandesy complejos. Implementación de la repetición controladapor centinelaen la clase LibroC al i fica cio n es Lafigura4.9 muestralaclase deJava LibroCal i fi caciones quecontiene elmétodo dete rmi narProme- dioClase, el cual implementa el algoritmo de la figura 4.8 en seudocódigo. Aunque cada calificación es un valor entero, existe la probabilidad de que el cálculo del promedio produzca un número con un punto decimal; en otras palabras, un número real (es decir, de punto flotante). El tipo i nt no puede re­ presentar un número deestetipo, por loque esta clase utilizael tipo double paraello. 1 / / Fig- 4.9: L ib ro C a lific a c io n e s.ja v a 2 / / La clase Lib ro C a lificacio n e s resuelve el problema del promedio de la clase 3 / / usando la repetición controlada por un cen tin e la. 4 import ja v a .ú t il. Scanner; / / el programa usa la clase Scanner 5 6 public cla ss Lib ro C a lificacio n e s 7 { 8 p rivate Strin g nombreDelCurso; / / el nombre del curso que representa este Li broCali f i caci ones 9 10 / / el constructor in ic ia liz a a nombreDelCurso 11 public Lib ro C alificacio n esC Strin g nombre ) 12 import ja v a .ú til.S c a n n e r; / / el programa u t iliz a la clase Scanner 13 nombreDelCurso = nombre; // in ic ia liz a a nombreDelCurso 14 } / / fin del constructor 15 16 / / método para establecer el nombre del curso 17 public void establecerNombreDelCurso( Strin g nombre ) 18 { 19 nombreDelCurso = nombre; / / almacena el nombre del curso 20 } / / fin del método establ ecerNombreDelCurso 21 22 / / método para obtener el nombre del curso 23 public Strin g obtenerNombreDelCursoO 24 {_______________________________________________________________________________ Fig. 4.9 | La clase Li broCal i f i caci on que resuelve el problema del promedio de una clase mediante la repetición controlada por centinela (parte I de 3). www.FreeLibros.me
    • 1 2 2 Capítulo 4 Instrucciones de control: Parte I 25 return nombreDelCurso; 26 } / / fin del método obtenerNombreDelCurso 27 28 / / muestra un mensaje de bienvenida al usuario de Lib ro C a lificacio n e s 29 p ub lic void mostrarMensaje() 30 { 31 / / obtenerNombreDelCurso obtiene el nombre del curso 32 S y ste m .o u t.p rin tf( “Bienvenido al lib ro de c a lific a c io n e s paran%s!nn” , 33 obtenerNombreDelCursoO ) ; 34 } / / fin del método mostrarMensaje 35 36 / / determina el promedio de un número a rb itra rio de c a lific a c io n e s 37 public void determinarPromedioClaseO 38 { 39 / / crea objeto Scanner para obtener la entrada de la ventana de comandos 40 Scanner entrada = new Scanner( System .in ) ; 41 42 in t t o t a l; // suma de la s c a lific a c io n e s 43 in t contad orC alif; / / número de c a lific a c io n e s introducidas 44 in t c a lific a c ió n ; / / v a lo r de c a lific a c ió n 45 double promedio; / / número con punto decimal para el promedio 46 47 / / fase de in ic ia liz a c ió n 48 to ta l = 0 ; / / in ic ia liz a el to ta l 49 contadorCalif = 0 ; / / in ic ia liz a el contador del c ic lo 50 51 / / fase de procesamiento 52 / / pide entrada y lee c a lific a c ió n del usuario 53 System .out.printC "Escrib a c a lific a c ió n o -1 para term inar: ” ) ; 54 c a lific a c ió n = entrada. n e x tln tO ; 55 56 / / ite ra hasta le e r el va lo r cen tin ela del usuario 57 w hile ( c a lific a c ió n != -1 ) 58 { 59 to ta l = to ta l + c a lific a c ió n ; / / suma c a lific a c ió n al to tal 60 contadorC alif = contadorC alif + 1; / / incrementa el contador 61 62 / / pide entrada y lee siguiente c a lific a c ió n del usuario 63 System .out.printC “ Escrib a c a lific a c ió n o -1 para term inar: " ) ; 64 c a lific a c ió n = entrada. n e x tln tO ; 65 } / / fin de w hile 66 67 / / fase de term inación 68 / / si el usuario introdujo por lo menos una c a lif ic a c ió n ... 69 i f C contadorC alif != 0 ) 70 { 71 / / c a lc u la el promedio de todas la s c a lific a c io n e s introducidas 72 promedio = (double) to ta l / contad orC alif; 73 74 / / muestra el to ta l y el promedio (con dos d íg ito s de p recisió n ) 75 S yste m .o u t.p rin tf( “nEl to ta l de la s %d c a lific a c io n e s introducidas es %dn” , 76 contad orC alif, to ta l ) ; Fig. 4.9 | La clase Li broCal i fi caci on que resuelve el problema del promedio de una clase mediante la repetición controlada por centinela (parte 2 de 3). www.FreeLibros.me
    • 4.9 Cómo formular algoritmos: repetición controlada por un centinela 123 77 System .out.printfC "E l promedio de la clase es % .2fn” , promedio ) ; 78 } / / fin de i f 79 else / / no se introdujeron c a lific a c io n e s , por lo que se imprime el mensaje apropiado 80 System .out.printlnC "No se introdujeron c a lific a c io n e s ” ) ; 81 } / / fin del método determinarPromedioClase 82 } / / fin de la clase Lib ro C a lificacio n e s Fig. 4.9 | La clase LibroCalifi cacion que resuelve el problema del promedio de una clase mediante la repetición controlada por centinela (parte 3 de 3). En esteejemplo vemos que lasestructuras de control pueden apilarseuna encima de otra (en secuencia). Lainstrucción whi1e (líneas57 a65) vaseguidapor unainstrucción i f ...e1se (líneas69 a80) en secuen­ cia. La mayor parte del código en este programa es igual que elcódigo de la figura 4.6, por lo que nos concentraremos en los nuevos conceptos. La línea 45 declara la variable promedio de tipo double, la cual nos permite guardar el promedio delaclasecomo un número de punto flotante. La línea 49 inicializacontadorCal i f en 0, yaque todavía no se han introducido calificaciones. Recuerde que este programa utiliza la repetición controlada por centinela para recibir las calificaciones. Para mantener un registro preciso del número de calificaciones introducidas, elprograma incrementa contadorCali f sólo cuando el usuario introduce una calificación válida. Comparación entre la lógica delprogramapara la repetición controladapor centinela y la repetición controladapor contador Compare la lógica de esta aplicación para la repetición controlada por centinela con la repetición con­ trolada por contador en la figura 4.6. En la repetición controlada por contador, cada iteración de la instrucción while (líneas 52 a 58 de la figura4.6) lee un valor del usuario, para el número especificado de iteraciones. En la repetición controlada por centinela, el programa lee el primer valor (líneas 53 y 54 de la figura 4.9) antes de llegar al whil e. Este valor determina si el flujo de control del programa debe entrar al cuerpo del while. Sila condición del whi1ees falsa, el usuario introdujo el valor centine­ la, por lo que el cuerpo del whi1eno se ejecuta (es decir, no se introdujeron calificaciones). Si, porotro lado,lacondición esverdadera, el cuerpo comienzaaejecutarseyel ciclo sumaelvalorde cal i fi cacion al total (línea 59). Después, las líneas 63 y 64 en el cuerpo del ciclo reciben el siguiente valor escrito por el usuario. A continuación, el control del programa se acercaa la llave derecha de terminación del cuerpo del ciclo en la línea 65, por lo que la ejecución continúa con la evaluación de la condición del while (línea 57). La condición utiliza el valor más reciente de calificación que acabade introducir el usuario, paradeterminarsiel cuerpo del ciclo debeejecutarseotravez. Elvalorde la variable cal i f i - cacion siempre lo introduce el usuario justo antes de que el programa evalúe la condición del whil e. Esto permite al programa determinar si el valor que acaba de introducir el usuario es elvalor centinela, antes de que el programa procese ese valor (es decir, que lo sume al total). Si se introduce el valor cen­ tinela, elciclo termina yel programa no suma-1 al total. Buena práctica de programación 4.3 Enunciclocontroladoporcentinela,losindicadoresdebenrecordardemaneraexplícitaal usuarioelvalorquerepresentaalcentinela. Una vez que termina el ciclo se ejecuta lainstrucción i f ...el se en las líneas 69 a 80. Lacondición en la línea 69 determina si se introdujeron calificaciones o no. Si no se introdujo ninguna, se ejecuta la partedel else (líneas79 y 80) de lainstrucción i f... else que muestraelmensaje “No se introdujeron cali ficaciones”,y el método devuelve el control al método que lo llamó. Observe el bloque de la instrucción while en la figura 4.9 (líneas 58 a 65). Sin las llaves, el ciclo consideraría quesu cuerpo sólo consiste en la primera instrucción, que suma la cali fi cacion al to tal. www.FreeLibros.me
    • 124 Capítulo 4 Instrucciones de control: Parte I Las últimas tres instrucciones en el bloque quedarían fuera del cuerpo del ciclo, lo que ocasionaría que lacomputadora interpretara el código de manera incorrecta, como se muestra a continuación: w hile ( c a lific a c ió n != -1 ) to ta l = to ta l + c a lific a c ió n ; / / suma c a lific a c ió n al to tal contadorC alif = contadorC alif + 1; / / incrementa el contador / / pide entrada y lee siguiente c a lific a c ió n del usuario System .out.printC “Escrib a c a lific a c ió n o -1 para term inar: ” ) ; c a lific a c ió n = entrada. n e x tln tO ; Elcódigo anterior ocasionaría un ciclo infinito en el programa si el usuario no introduce el centinela -1 como valor de entrada en lalínea54 (antes de lainstrucción whi1e). Error común de programación 4.5 Omitir lasllavesque delimitan a un bloquepuedeprovocarerroreslógicos, como ciclos infinitos. Parapreveniresteproblema,algunosprogramadoresencierranelcuerpodetodas lasinstruccionesdecontrolconllaves, aunsielcuerposólocontieneunainstrucción. Conversión explícita e implícita entre lostiposprimitivos Siseintrodujo por lo menos una calificación, la línea72 de lafigura4.9 calculaelpromedio de lascalifi­ caciones. En la figura4.6 vimos que ladivisión entera produce un resultado entero. Aun y cuando lava­ riable promedio se declara como double (línea45), elcálculo promedio = total / contadorCalif; descarta la parte fraccionaria del cociente antes de asignar el resultado de la división a promedio. Esto ocurre debido a que total y contadorCal if son ambos enteros, y ladivisión entera produce un resul­ tado entero. Pararealizarun cálculo de punto flotanteconvaloresenteros,debemos tratar temporalmen­ teaestosvalorescomo númerosde punto flotante,parausarlosen elcálculo.Javacuentacon el operador unario de conversión de tipo para llevar a cabo esta tarea. La línea72 utiliza el operador de conversión de tipo (double) (un operador unario) paracrear una copia de punto flotante temporalde su operando total (que aparece a laderecha del operador). Utilizar un operador de conversión de tipo de esta forma es un proceso que se denomina conversión explícita o conversión de tipos. El valor almacenado en total sigue siendo un entero. El cálculo ahora consiste de un valor de punto flotante (laversión temporal double de total) divi­ dido entre el entero contadorCali f. Java sabe cómo evaluar sólo expresiones aritméticas en las que los tipos de los operandos sean idénticos. Paraasegurar que los operandos sean del mismo tipo, Java realiza una operación llamada promoción (o conversión implícita) en los operandos seleccionados. Por ejem­ plo, en una expresión que contenga valores de los tipos i nt y double, los valores int son promovidos a valores doubleparautilizarlosen laexpresión. Enesteejemplo,Javapromueveelvalorde contadorCali f al tipo double, después el programa realiza ladivisión de punto flotantey asignael resultado del cálculo a promedio. Mientras que se aplique el operador de conversión de tipo (doubl e) a cualquier variable en el cálculo, éste producirá un resultado double. Más adelante en el capítulo, hablaremos sobre todos bs tipos primitivos. En lasección 6.7 aprenderá más acerca de lasreglas de promoción. Error común de programación 4.6 Unoperadordeconversióndetipopuedeutilizarseparaconvertirentrelostiposnuméricos primitivos, como inty double,yparaconvertirentrelostiposdereferenciarelacionados (comolodescribiremosenelcapítulo10,Programaciónorientadaaobjetos:polimorfismo). Laconversiónaltipoincorrectopuedeocasionarerroresdecompilaciónoerroresentiempo deejecución. www.FreeLibros.me
    • 4.10 Cómo formular algoritmos: instrucciones de control anidadas 125 Un operador de conversión se forma colocando paréntesis alrededor del nombre de un tipo. Este operador es un operador unario (es decir, un operador que utiliza sólo un operando). Java también soporta las versiones unarias de los operadores de suma (+)y resta (-), por lo que usted puede escribir expresiones como -7 o +5. Los operadores de conversión de tipo se asocian de derecha a izquierda y tie­ nen la misma precedencia que los demás operadores unarios, como + y -. Esta precedencia es un nivel mayor que la de los operadores de multiplicación *, / y %. (Consulte la tabla de precedencia de opera­ dores en el apéndice A). En nuestras tablas de precedencia, indicamos el operador de conversión de tipos con la notación (tipo) para indicar que puede usarse cualquier nombre de tipo para formar un operadorde conversión de tipo. La línea 77 muestra en pantalla el promedio de la clase. En este ejemplo mostramos el promedio de la clase redondeado a la centésima más cercana. El especificador de formato %.2f en la cadena de oontrol de formato de pri n tf (línea 77) indica que elvalor de lavariable promedio debe mostrarse con dos dígitos de precisión a laderecha del punto decimal; esto se indica mediante el .2en el especificador de formato. Las tres calificaciones introducidas durante la ejecución de ejemplo de la clase PruebaLi­ b ro C alif icaciones (figura 4.10) dan un total de 257, que produce el promedio de 85.666666.... El método p ri n tf utiliza la precisión en el especificador de formato para redondear el valor al número especificado de dígitos. En este programa, el promedio se redondea a la posición de las centésimas y se muestracomo 85.67. 1 / / F ig . 4 .1 0 : Pru eb aLib ro C alificaeio n es.java 2 / / Crea un objeto Lib ro C a lificacio n e s e invoca a su método determinarPromedioClase. 3 4 public cla ss PruebaLibroCalificaciones 5 { 6 public s t a t ic void main( S trin g [] args ) 7 { 8 / / crea objeto m iLib ro C alificacio n es de Lib ro C a lifica cio n e s y 9 / / pasa el nombre del curso al constructor 10 Lib ro C a lificacio n e s m iLib ro C alificacio n es = new Lib ro C a lific a c io n e s( 11 “CS101 Introducción a la programación en lava" ) ; 12 13 m iLib roC alificaciones.m ostrarM en saje(); / / muestra mensaje de bienvenida 14 m iLibroC alificaciones.determ inarProm edioC laseO ; / / encuentra el promedio de la s c a lific a c io n e s 15 } / / fin de main 16 } / / f i n de la clase PruebaLibroCalificaciones Bienvenido al lib ro de c a lific a c io n e s para CS101 Introducción a la programación en lava! Escrib a c a lific a c ió n o -1 para term inar: 97 Escrib a c a lific a c ió n o -1 para term inar: 88 Escrib a c a lific a c ió n o -1 para term inar: 72 Escrib a c a lific a c ió n o -1 para term inar: -1 El to ta l de la s 3 c a lific a c io n e s introducidas es 257 El promedio de la clase es 85.67 Fig. 4.10 | Laclase PruebaLi b ro C alificacio n es crea un objeto de la clase LibroCal ifica cio n e s (figura 4.9) e invoca al método determinarPromedioClase. 4.10 Cómo formular algoritmos: instrucciones de control anidadas Enelsiguienteejemplo formularemos unavezmás un algoritmo utilizando seudocódigo yelrefinamien­ to de arriba a abajo, paso a paso, y después escribiremos el correspondiente programa en Java. Hemos www.FreeLibros.me
    • 126 Capítulo 4 Instrucciones de control: Parte I visto que lasinstrucciones de control pueden apilarse una encima de otra (en secuencia). En este caso de estudio examinaremos laotra forma estructurada en la que pueden conectarse las instrucciones de con­ trol, a saber, mediante el anidamiento de una instrucciónde control dentro de otra. Considere elsiguiente enunciado de un problema: Una universidad ofrece un cursoquepreparaa losestudiantespara elexamen estatalde certificación del estado como corredoresde bienes raíces. Elañopasado, diezde losestudiantesque completaron este curso tomaronelexamen. La universidaddeseasaberquétan biensedesempeñaronsusestudiantesenelexamen. A ustedselehapedidoqueescribaunprogramaparasintetizar losresultados. Seledio unalistadeestos10 estudiantes.Juntoacadanombrehayun 1escrito,sielestudianteaprobóelexamen,oun2sib reprobó. Suprogramadebeanalizarlosresultadosdelexamendelasiguientemanera: 1. Introducircadaresultadodelaprueba(esdecir, un 1oun2).Mostrarelmensaje “Escribaelresultado” enlapantalla, cadavezqueelprogramasoliciteotroresultadodelaprueba. 2. Contarelnúmeroderesultadosdelaprueba,decadatipo. 3. Mostrarunresumendelosresultadosdelaprueba,indicandoelnúmerodeestudiantesqueaprobaron y quereprobaron. 4. Simásdeochoestudiantesaprobaronelexamen,imprimirelmensaje uBonoparaelinstructor!”. Después de leer el enunciado del programa cuidadosamente, hacemos lassiguientesobservaciones: 1. Elprogramadebeprocesarlosresultados delapruebapara 10 estudiantes. Puede usarseun ciclo controlado por contador,yaque el número de resultados de la prueba se conoce de antemano. 2. Cadaresultado de lapruebatiene un valor numérico,ya sea 1o 2. Cada vezqueel programa lee un resultado de la prueba, debe determinar si el número es 1o 2. Nosotros evaluamos un 1en nuestro algoritmo. Siel número no es 1,suponemos que esun 2. (Elejercicio 4.24 considera las consecuencias deesta suposición). 3. Dos contadores se utilizan para llevar el registro de los resultados del examen: uno para contar el número de estudiantes que aprobaron el exameny otro paracontar el número de estudiantes que reprobaron el examen. 4. Una vez que el programa ha procesado todos los resultados, debe decidir si más de ocho estu­ diantes aprobaron el examen. Veamos ahora el refinamiento de arriba a abajo, paso a paso. Comencemos con la representación del seudo- oódigo de lacima: Analizarlos resultadosdelexameny decidirsidebepagarse un bono o no Una vez más, la cima es una representación completa del programa, pero es probable que se necesiten varios refinamientos antes de que elseudocódigo pueda evolucionar de manera natural en un programa enJava. Nuestro primer refinamiento es Inicializar variables Introducir las 10 calificacionesdelexameny contar los aprobadosy reprobados Imprimir un resumende los resultadosdelexameny decidir sidebepagarse un bono Aquí también, aun cuando tenemos una representación completa del programa, es necesario refinarla. Ahora nos comprometemos con variables específicas. Se necesitan contadores para registrar los apro­ bados y reprobados, utilizaremos un contador para controlar el proceso de los ciclos y necesitaremos una variable para guardar la entrada del usuario. La variable en la que se almacenará la entrada del www.FreeLibros.me
    • 4.10 Cómo formular algoritmos: instrucciones de control anidadas 127 usuario no se inicializa al principio del algoritmo, ya que su valor proviene del usuario durante cada iteración del ciclo. Lainstrucción en seudocódigo Inicializar variables puede mejorarse de lasiguiente manera: Inicializar aprobados en cero Inicializar reprobados en cero Inicializar contadorde estudiantes en cero Observeque sólo se inicializan loscontadores al principio del algoritmo. Lainstrucción en seudocódigo Introducir ¡as 10 calificacionesdelexamen,y contar losaprobadosy reprobados requiere un ciclo en el que se introduzca de manera sucesiva el resultado de cada examen. Sabemos de antemano que hay precisamente 10 resultados del examen, por lo queesapropiado utilizar un ciclo con­ trolado por contador. Dentro del ciclo (es decir, anidadodentro del ciclo), una estructura de selección doble determinará si cada resultado del examen es aprobado o reprobado, e incrementará el contador apropiado. Entonces, el refinamiento del seudocódigo anterior es Mientras elcontadorde estudiantessea menor oigualque 10 Pediralusuario que introduzca elsiguiente resultadodelexamen Recibir como entrada elsiguienteresultado delexamen Si elestudianteaprobó Sumar uno a aprobados Delo contrario Sumar uno a reprobados Sumar uno al contadorde estudiantes Nosotros utilizamos líneas en blanco para aislar laestructura de control Si...De lo contrario,lo cual me­ jora la legibilidad. Lainstrucción en seudocódigo Imprimir un resumen delos resultadosde losexámenesy decidirsi debepagarse un bono puede mejorarse de lasiguiente manera: Imprimirelnúmerode aprobados Imprimirelnúmerode reprobados Si más de ochoestudiantesaprobaron Imprimir “¡Bonopara elinstructor!". Segundo refinamiento completo en seudocódigoy conversión a la claseAna 7i s i s Elsegundo refinamiento completo aparece en la figura 4.11. Observe que también se utilizan líneas en blanco para separar laestructura Mientrasy mejorar la legibilidad del programa. Este seudocódigo está ahora lo bastante refinado parasuconversión aJava. La clase de Java que implementa el algoritmo en seudocódigo se muestra en la figura 4.12, junto oon dos ejecuciones de ejemplo. Las líneas 13 a 16 de la clase mai n declaran las variables que utiliza el método procesarResultadosExamen de la clase Anal i s is para procesar los resultados del examen. www.FreeLibros.me
    • 128 Capítulo 4 Instrucciones de control: Parte I 1 Inicializaraprobadosencero 2 Inicializarreprobadosencero 3 Inicializarcontadordeestudiantesen uno 4 5 Mientraselcontadordeestudiantesseamenoroigualque 10 6 Pediralusuarioqueintroduzcaelsiguienteresultadodelexamen 7 Redbircomoentradaelsiguienteresultadodelexamen 8 9 S elestudianteaprobó 10 Sumarunoaaprobados 11 Delocontrario 12 Sumarunoareprobados 13 14 Sumarunoalcontadordeestudiantes 15 16 bnprindrelnúmerodeaprobados 17 bnprinúreínúmerodereprobados 18 19 Simásdeochoestudiantesaprobaron 20 Imprimir uBonoparaelinstructor!”________________________ Fig. 4. M | El seudocódigo para el problema de los resultados del examen. Varias deestas declaraciones utilizan la habilidad deJava para incorporar lainicialización de variables en las declaraciones (a aprobados se leasigna 0, a reprobados se le asigna Oya contadorEstudiantes se le asigna l). Los programas con ciclos pueden requerir de la inicialización al principio de cada repetición; porlo general, dichareinicializaciónserealizamediante instruccionesdeasignación,en vezde hacerlo en las declaraciones. Tip para prevenir errores 4.3 Inicializar ¡as variables locales cuando sedeclaran ayuda alprogramadora evi­ tar cualquier errorde compilación quepudiera surgir,,debido a los intentospor utilizar variables sin inicializar. AunqueJava no requiereque seincorporen las inicializacionesdevariableslocalesenlasdeclaraciones,sirequierequeseinicialicen antesde utilizarsus valoresen una expresión. Lainstrucción while (líneas 19a33) itera 10veces. Durantecadaiteración, elciclo recibey procesa un resultado del examen. Observeque lainstrucción i f ...else (líneas 26 a29) paraprocesarcadaresul­ tado se anida en la instrucción whi1e. Si resultado es 1, lainstrucción if ...el se incrementa a aproba­ dos; en caso contrario, asume que resultado es 2 e incrementa reprobados. La línea 32 incrementa contadorEstudi antes antes de que se evalúe otra vez la condición del ciclo, en la línea 19. Después de introducir 10 valores, elciclo termina y la línea 36 muestra el número de aprobados y de reprobados. Lainstrucción if de las líneas 39 a 40 determina si más de ocho estudiantes aprobaron el examen y, de serasí, imprime el mensaje “Bono para el instructor!”. 1 / / Fig- 4 .1 2 : A n a lisis .ja va 2 / / A n á lisis de los resultados de un examen, u tilizan d o instrucciones de control anidadas. 3 import jav a.ú til.Scanner; / / esta clase u t iliz a la clase Scanner Fig. 4 .12 | Análisis de los resultados del examen mediante el uso de estructuras de control anidadas (parte I de 3). www.FreeLibros.me
    • 4.10 Cómo formular algoritmos: instrucciones de control anidadas 129 4 5 public cla ss A n á lisis 6 { 7 public s ta tic void main( S trin g [] args ) 8 { 9 / / crea objeto Scanner para obtener la entrada de la ventana de comandos 10 Scanner entrada = new Scanner( System .in ) ; 11 12 / / in ic ia liz a c ió n de la s va ria b le s en declaraciones 13 in t aprobados = 0; / / número de aprobados 14 in t reprobados = 0 ; / / número de reprobados 15 in t contadorEstudiantes = 1; / / contador de estudiantes 16 in t resultado; / / un resultado del examen (obtiene el va lo r del usuario) 17 18 / / procesa 10 estudiantes, usando c ic lo controlado por contador 19 w hile ( contadorEstudiantes <= 10 ) 20 { 21 / / pide al usuario la entrada y obtiene el valo r 22 System .out.printC "Escrib a el resultado (1 = aprobado, 2 = reprobado): ” ) ; 23 resu ltad o = entrada. n e x tln tO ; 24 25 / / i f . . . e l s e anidado en la in stru cció n w hile 26 i f ( resultado == 1 ) / / si resultado es 1, 27 aprobados = aprobados + 1 ; / / incrementa aprobados; 28 e lse / / d e lo contrario, resultado no es 1, por lo que 29 reprobados = reprobados + 1; / / incrementa reprobados 30 31 // incrementa contadorEstudiantes, para que el ciclo termine en un momento dado 32 contadorEstudiantes = contadorEstudiantes + 1; 33 } / / fin de w hile 34 35 / / fase de term inación; prepara y muestra lo s resultados 36 S yste m .o u t.p rin tf( “Aprobados: %dnReprobados: 96dn” , aprobados, reprobados ) ; 37 38 / / determina s i más de 8 estudiantes aprobaron 39 i f ( aprobados > 8 ) 40 System .out.printlnC "Bono para el in s tru c to r!" ) ; 41 } / / fin de main 42 } / / f i n de la c la s e A n á lis is Escrib a el resultado (1 = aprobado, 2 = reprobado): 1 Escrib a el resultado (1 = aprobado, 2 = reprobado): 2 Escrib a el resultado (1 = aprobado, 2 = reprobado): 1 Escrib a el resultado (1 = aprobado, 2 = reprobado): 1 Escrib a el resultado (1 = aprobado, 2 = reprobado): 1 Escrib a el resultado (1 = aprobado, 2 = reprobado): 1 Escrib a el resultado (1 = aprobado, 2 = reprobado): 1 Escrib a el resultado (1 = aprobado, 2 = reprobado): 1 Escrib a el resultado (1 = aprobado, 2 = reprobado): 1 Escrib a el resultado (1 = aprobado, 2 = reprobado): 1 Aprobados: 9 Reprobados: 1 Bono para el in stru cto r! Fig. 4 .12 | Análisis de los resultados del examen mediante el uso de estructuras de control anidadas (parte 2 de 3). www.FreeLibros.me
    • 130 Capítulo 4 Instrucciones de control: Parte I Escrib a el resultado (1 —aprobado, 2 = reprobado): 1 Escrib a el resultado (1 = aprobado, 2 = reprobado): 2 Escrib a el resultado c i = aprobado, 2 = reprobado): 1 Escrib a el resultado (1 = aprobado, 2 = reprobado): 2 Escrib a el resultado (1 = aprobado, 2 = reprobado): 1 Escrib a el resultado (1 = aprobado, 2 = reprobado): 2 Escrib a el resultado (1 = aprobado, 2 = reprobado): 2 Escrib a el resultado (1 = aprobado, 2 = reprobado): 1 Escrib a el resultado (1 = aprobado, 2 = reprobado): 1 Escrib a el resultado (1 = aprobado, 2 = reprobado): 1 Aprobados: 6 Reprobados 4 Fig. 4.12 | Análisis de los resultados del examen mediante el uso de estructuras de control anidadas (parte 3 de 3). La figura 4.12 muestra la entrada y salida de dos ejecuciones de ejemplo del programa. Durante la primera ejecución de ejemplo, lacondición en la línea 39 del método maines true; más de ocho es­ tudiantes aprobaron elexamen, por lo que el programa imprime un mensaje indicando que se debe dar un bono al instructor. Este ejemplo contiene sólo una clase; el método mai n realiza todo el trabajo. En este capítulo y en el 3 ha visto ejemplos que consisten en dos clases: una contiene los métodos que realizan tareas útiles y laotra tiene el método mai n, que crea un objeto de laotra clase y llama a sus métodos. En ocasiones, cuando no tenga sentido tratar de crear una clase reutilizable parademostrar un concepto, colocaremos todas las instrucciones del programa dentro del método mai nde una sola clase. 4.11 Operadores de asignación compuestos Los operadores de asignación compuestos abrevian las expresiones de asignación. Cualquier instruc­ ción de la forma variable = variable operador expresión; en donde operadoresuno de losoperadores binarios o %(o alguno de losotros queveremos más adelante en el libro), puedeescribirse de lasiguiente forma: varia